@node2flow/notion-mcp 1.0.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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Node2Flow
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,110 @@
1
+ # @node2flow/notion-mcp
2
+
3
+ MCP server for the Notion API — manage pages, blocks, databases, data sources, comments, and users.
4
+
5
+ ## Quick Start
6
+
7
+ ### Claude Desktop / Cursor / VS Code
8
+
9
+ Add to your MCP client config:
10
+
11
+ ```json
12
+ {
13
+ "mcpServers": {
14
+ "notion": {
15
+ "command": "npx",
16
+ "args": ["-y", "@node2flow/notion-mcp"],
17
+ "env": {
18
+ "NOTION_API_KEY": "ntn_your_integration_token"
19
+ }
20
+ }
21
+ }
22
+ }
23
+ ```
24
+
25
+ ### HTTP Mode (Streamable HTTP)
26
+
27
+ ```bash
28
+ NOTION_API_KEY=ntn_xxx npx @node2flow/notion-mcp --http
29
+ ```
30
+
31
+ MCP endpoint: `http://localhost:3000/mcp`
32
+
33
+ ### Cloudflare Worker
34
+
35
+ ```
36
+ https://notion-mcp-community.node2flow.net/mcp?NOTION_API_KEY=ntn_xxx
37
+ ```
38
+
39
+ ## Configuration
40
+
41
+ | Variable | Required | Description |
42
+ |----------|----------|-------------|
43
+ | `NOTION_API_KEY` | Yes | Notion Internal Integration Token (starts with `ntn_` or `secret_`) |
44
+
45
+ ### Getting a Notion API Key
46
+
47
+ 1. Go to [notion.so/my-integrations](https://www.notion.so/my-integrations)
48
+ 2. Click **New integration**
49
+ 3. Give it a name and select the workspace
50
+ 4. Copy the **Internal Integration Token**
51
+ 5. Share your pages/databases with the integration (click "..." > "Connections" > add your integration)
52
+
53
+ ## Tools (25)
54
+
55
+ ### Search (1)
56
+ | Tool | Description |
57
+ |------|-------------|
58
+ | `notion_search` | Search pages and databases by title |
59
+
60
+ ### Pages (5)
61
+ | Tool | Description |
62
+ |------|-------------|
63
+ | `notion_create_page` | Create a new page |
64
+ | `notion_get_page` | Get page by ID |
65
+ | `notion_update_page` | Update page properties, icon, cover |
66
+ | `notion_move_page` | Move page to new parent |
67
+ | `notion_get_page_property` | Get a specific property value |
68
+
69
+ ### Blocks (5)
70
+ | Tool | Description |
71
+ |------|-------------|
72
+ | `notion_get_block` | Get a block by ID |
73
+ | `notion_get_block_children` | Read page/block content |
74
+ | `notion_append_blocks` | Add content blocks to page/block |
75
+ | `notion_update_block` | Update block content |
76
+ | `notion_delete_block` | Delete (archive) a block |
77
+
78
+ ### Data Sources (5)
79
+ | Tool | Description |
80
+ |------|-------------|
81
+ | `notion_create_data_source` | Create a data source table |
82
+ | `notion_get_data_source` | Get data source by ID |
83
+ | `notion_update_data_source` | Update data source schema |
84
+ | `notion_query_data_source` | Query pages with filters/sorts |
85
+ | `notion_list_data_source_templates` | List data source templates |
86
+
87
+ ### Databases — Legacy (3)
88
+ | Tool | Description |
89
+ |------|-------------|
90
+ | `notion_get_database` | Get database by ID |
91
+ | `notion_query_database` | Query database with filters/sorts |
92
+ | `notion_create_database` | Create inline database in page |
93
+
94
+ ### Comments (3)
95
+ | Tool | Description |
96
+ |------|-------------|
97
+ | `notion_create_comment` | Comment on page or reply to thread |
98
+ | `notion_get_comments` | List comments on page/block |
99
+ | `notion_get_comment` | Get single comment by ID |
100
+
101
+ ### Users (3)
102
+ | Tool | Description |
103
+ |------|-------------|
104
+ | `notion_list_users` | List all workspace users |
105
+ | `notion_get_user` | Get user by ID |
106
+ | `notion_get_bot_user` | Get bot integration info |
107
+
108
+ ## License
109
+
110
+ MIT
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Notion REST API Client
3
+ * API Version: 2025-09-03
4
+ * Auth: Bearer token (Internal Integration Token)
5
+ */
6
+ import type { NotionConfig, NotionPage, NotionBlock, NotionDataSource, NotionDatabase, NotionComment, NotionUser, NotionList, RichText } from './types.js';
7
+ export declare class NotionClient {
8
+ private config;
9
+ private baseUrl;
10
+ constructor(config: NotionConfig);
11
+ private request;
12
+ /** Helper: build a simple rich text array from plain string */
13
+ static richText(content: string): RichText[];
14
+ search(params?: {
15
+ query?: string;
16
+ filter_object?: 'page' | 'database';
17
+ sort_direction?: 'ascending' | 'descending';
18
+ start_cursor?: string;
19
+ page_size?: number;
20
+ }): Promise<NotionList<NotionPage | NotionDatabase>>;
21
+ createPage(params: {
22
+ parent: Record<string, unknown>;
23
+ properties: Record<string, unknown>;
24
+ children?: unknown[];
25
+ icon?: unknown;
26
+ cover?: unknown;
27
+ }): Promise<NotionPage>;
28
+ getPage(pageId: string): Promise<NotionPage>;
29
+ updatePage(pageId: string, params: {
30
+ properties?: Record<string, unknown>;
31
+ icon?: unknown;
32
+ cover?: unknown;
33
+ archived?: boolean;
34
+ in_trash?: boolean;
35
+ }): Promise<NotionPage>;
36
+ movePage(pageId: string, newParent: Record<string, unknown>): Promise<NotionPage>;
37
+ getPageProperty(pageId: string, propertyId: string, params?: {
38
+ start_cursor?: string;
39
+ page_size?: number;
40
+ }): Promise<unknown>;
41
+ getBlock(blockId: string): Promise<NotionBlock>;
42
+ getBlockChildren(blockId: string, params?: {
43
+ start_cursor?: string;
44
+ page_size?: number;
45
+ }): Promise<NotionList<NotionBlock>>;
46
+ appendBlocks(blockId: string, children: unknown[]): Promise<NotionList<NotionBlock>>;
47
+ updateBlock(blockId: string, data: Record<string, unknown>): Promise<NotionBlock>;
48
+ deleteBlock(blockId: string): Promise<NotionBlock>;
49
+ createDataSource(databaseId: string, params: {
50
+ title?: RichText[];
51
+ properties?: Record<string, unknown>;
52
+ }): Promise<NotionDataSource>;
53
+ getDataSource(dataSourceId: string): Promise<NotionDataSource>;
54
+ updateDataSource(dataSourceId: string, params: {
55
+ title?: RichText[];
56
+ properties?: Record<string, unknown>;
57
+ }): Promise<NotionDataSource>;
58
+ queryDataSource(dataSourceId: string, params?: {
59
+ filter?: Record<string, unknown>;
60
+ sorts?: unknown[];
61
+ start_cursor?: string;
62
+ page_size?: number;
63
+ }): Promise<NotionList<NotionPage>>;
64
+ listDataSourceTemplates(dataSourceId: string, params?: {
65
+ start_cursor?: string;
66
+ page_size?: number;
67
+ }): Promise<NotionList<NotionPage>>;
68
+ getDatabase(databaseId: string): Promise<NotionDatabase>;
69
+ queryDatabase(databaseId: string, params?: {
70
+ filter?: Record<string, unknown>;
71
+ sorts?: unknown[];
72
+ start_cursor?: string;
73
+ page_size?: number;
74
+ }): Promise<NotionList<NotionPage>>;
75
+ createDatabase(params: {
76
+ parent: Record<string, unknown>;
77
+ title: RichText[];
78
+ properties: Record<string, unknown>;
79
+ }): Promise<NotionDatabase>;
80
+ createComment(params: {
81
+ parent?: {
82
+ page_id: string;
83
+ };
84
+ discussion_id?: string;
85
+ rich_text: RichText[];
86
+ }): Promise<NotionComment>;
87
+ getComments(blockId: string, params?: {
88
+ start_cursor?: string;
89
+ page_size?: number;
90
+ }): Promise<NotionList<NotionComment>>;
91
+ getComment(commentId: string): Promise<NotionComment>;
92
+ listUsers(params?: {
93
+ start_cursor?: string;
94
+ page_size?: number;
95
+ }): Promise<NotionList<NotionUser>>;
96
+ getUser(userId: string): Promise<NotionUser>;
97
+ getBotUser(): Promise<NotionUser>;
98
+ }
99
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/client.js ADDED
@@ -0,0 +1,196 @@
1
+ /**
2
+ * Notion REST API Client
3
+ * API Version: 2025-09-03
4
+ * Auth: Bearer token (Internal Integration Token)
5
+ */
6
+ export class NotionClient {
7
+ config;
8
+ baseUrl = 'https://api.notion.com/v1';
9
+ constructor(config) {
10
+ this.config = config;
11
+ }
12
+ async request(path, options = {}) {
13
+ const url = `${this.baseUrl}${path}`;
14
+ const response = await fetch(url, {
15
+ ...options,
16
+ headers: {
17
+ 'Authorization': `Bearer ${this.config.apiKey}`,
18
+ 'Notion-Version': '2022-06-28',
19
+ 'Content-Type': 'application/json',
20
+ ...options.headers,
21
+ },
22
+ });
23
+ if (!response.ok) {
24
+ const error = await response.text();
25
+ throw new Error(`Notion API Error (${response.status}): ${error}`);
26
+ }
27
+ return response.json();
28
+ }
29
+ /** Helper: build a simple rich text array from plain string */
30
+ static richText(content) {
31
+ return [{ type: 'text', text: { content } }];
32
+ }
33
+ // ========== Search ==========
34
+ async search(params) {
35
+ const body = {};
36
+ if (params?.query)
37
+ body.query = params.query;
38
+ if (params?.filter_object)
39
+ body.filter = { property: 'object', value: params.filter_object };
40
+ if (params?.sort_direction)
41
+ body.sort = { timestamp: 'last_edited_time', direction: params.sort_direction };
42
+ if (params?.start_cursor)
43
+ body.start_cursor = params.start_cursor;
44
+ if (params?.page_size)
45
+ body.page_size = params.page_size;
46
+ return this.request('/search', { method: 'POST', body: JSON.stringify(body) });
47
+ }
48
+ // ========== Pages ==========
49
+ async createPage(params) {
50
+ return this.request('/pages', { method: 'POST', body: JSON.stringify(params) });
51
+ }
52
+ async getPage(pageId) {
53
+ return this.request(`/pages/${pageId}`);
54
+ }
55
+ async updatePage(pageId, params) {
56
+ return this.request(`/pages/${pageId}`, { method: 'PATCH', body: JSON.stringify(params) });
57
+ }
58
+ async movePage(pageId, newParent) {
59
+ return this.request(`/pages/${pageId}/move`, {
60
+ method: 'POST',
61
+ body: JSON.stringify({ parent: newParent }),
62
+ });
63
+ }
64
+ async getPageProperty(pageId, propertyId, params) {
65
+ const query = new URLSearchParams();
66
+ if (params?.start_cursor)
67
+ query.set('start_cursor', params.start_cursor);
68
+ if (params?.page_size)
69
+ query.set('page_size', String(params.page_size));
70
+ const qs = query.toString();
71
+ return this.request(`/pages/${pageId}/properties/${propertyId}${qs ? `?${qs}` : ''}`);
72
+ }
73
+ // ========== Blocks ==========
74
+ async getBlock(blockId) {
75
+ return this.request(`/blocks/${blockId}`);
76
+ }
77
+ async getBlockChildren(blockId, params) {
78
+ const query = new URLSearchParams();
79
+ if (params?.start_cursor)
80
+ query.set('start_cursor', params.start_cursor);
81
+ if (params?.page_size)
82
+ query.set('page_size', String(params.page_size));
83
+ const qs = query.toString();
84
+ return this.request(`/blocks/${blockId}/children${qs ? `?${qs}` : ''}`);
85
+ }
86
+ async appendBlocks(blockId, children) {
87
+ return this.request(`/blocks/${blockId}/children`, {
88
+ method: 'PATCH',
89
+ body: JSON.stringify({ children }),
90
+ });
91
+ }
92
+ async updateBlock(blockId, data) {
93
+ return this.request(`/blocks/${blockId}`, { method: 'PATCH', body: JSON.stringify(data) });
94
+ }
95
+ async deleteBlock(blockId) {
96
+ return this.request(`/blocks/${blockId}`, { method: 'DELETE' });
97
+ }
98
+ // ========== Data Sources (2025-09-03) ==========
99
+ async createDataSource(databaseId, params) {
100
+ return this.request('/data_sources', {
101
+ method: 'POST',
102
+ body: JSON.stringify({
103
+ parent: { type: 'database', database_id: databaseId },
104
+ ...params,
105
+ }),
106
+ });
107
+ }
108
+ async getDataSource(dataSourceId) {
109
+ return this.request(`/data_sources/${dataSourceId}`);
110
+ }
111
+ async updateDataSource(dataSourceId, params) {
112
+ return this.request(`/data_sources/${dataSourceId}`, {
113
+ method: 'PATCH',
114
+ body: JSON.stringify(params),
115
+ });
116
+ }
117
+ async queryDataSource(dataSourceId, params) {
118
+ const body = {};
119
+ if (params?.filter)
120
+ body.filter = params.filter;
121
+ if (params?.sorts)
122
+ body.sorts = params.sorts;
123
+ if (params?.start_cursor)
124
+ body.start_cursor = params.start_cursor;
125
+ if (params?.page_size)
126
+ body.page_size = params.page_size;
127
+ return this.request(`/data_sources/${dataSourceId}/query`, {
128
+ method: 'POST',
129
+ body: JSON.stringify(body),
130
+ });
131
+ }
132
+ async listDataSourceTemplates(dataSourceId, params) {
133
+ const query = new URLSearchParams();
134
+ if (params?.start_cursor)
135
+ query.set('start_cursor', params.start_cursor);
136
+ if (params?.page_size)
137
+ query.set('page_size', String(params.page_size));
138
+ const qs = query.toString();
139
+ return this.request(`/data_sources/${dataSourceId}/templates${qs ? `?${qs}` : ''}`);
140
+ }
141
+ // ========== Databases (legacy) ==========
142
+ async getDatabase(databaseId) {
143
+ return this.request(`/databases/${databaseId}`);
144
+ }
145
+ async queryDatabase(databaseId, params) {
146
+ const body = {};
147
+ if (params?.filter)
148
+ body.filter = params.filter;
149
+ if (params?.sorts)
150
+ body.sorts = params.sorts;
151
+ if (params?.start_cursor)
152
+ body.start_cursor = params.start_cursor;
153
+ if (params?.page_size)
154
+ body.page_size = params.page_size;
155
+ return this.request(`/databases/${databaseId}/query`, {
156
+ method: 'POST',
157
+ body: JSON.stringify(body),
158
+ });
159
+ }
160
+ async createDatabase(params) {
161
+ return this.request('/databases', { method: 'POST', body: JSON.stringify(params) });
162
+ }
163
+ // ========== Comments ==========
164
+ async createComment(params) {
165
+ return this.request('/comments', { method: 'POST', body: JSON.stringify(params) });
166
+ }
167
+ async getComments(blockId, params) {
168
+ const query = new URLSearchParams();
169
+ query.set('block_id', blockId);
170
+ if (params?.start_cursor)
171
+ query.set('start_cursor', params.start_cursor);
172
+ if (params?.page_size)
173
+ query.set('page_size', String(params.page_size));
174
+ return this.request(`/comments?${query.toString()}`);
175
+ }
176
+ async getComment(commentId) {
177
+ return this.request(`/comments/${commentId}`);
178
+ }
179
+ // ========== Users ==========
180
+ async listUsers(params) {
181
+ const query = new URLSearchParams();
182
+ if (params?.start_cursor)
183
+ query.set('start_cursor', params.start_cursor);
184
+ if (params?.page_size)
185
+ query.set('page_size', String(params.page_size));
186
+ const qs = query.toString();
187
+ return this.request(`/users${qs ? `?${qs}` : ''}`);
188
+ }
189
+ async getUser(userId) {
190
+ return this.request(`/users/${userId}`);
191
+ }
192
+ async getBotUser() {
193
+ return this.request('/users/me');
194
+ }
195
+ }
196
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Notion MCP Server
4
+ *
5
+ * Community edition — connects directly to Notion API.
6
+ *
7
+ * Usage (stdio - for Claude Desktop / Cursor / VS Code):
8
+ * NOTION_API_KEY=ntn_xxx npx @node2flow/notion-mcp
9
+ *
10
+ * Usage (HTTP - Streamable HTTP transport):
11
+ * NOTION_API_KEY=ntn_xxx npx @node2flow/notion-mcp --http
12
+ */
13
+ /**
14
+ * Smithery default export
15
+ */
16
+ export default function createSmitheryServer(opts?: {
17
+ config?: {
18
+ NOTION_API_KEY?: string;
19
+ };
20
+ }): import("@modelcontextprotocol/sdk/server/mcp.js").McpServer;
21
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;GAUG;AAoKH;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,oBAAoB,CAAC,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE;QAAE,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,+DAI3F"}
package/dist/index.js ADDED
@@ -0,0 +1,170 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Notion MCP Server
4
+ *
5
+ * Community edition — connects directly to Notion API.
6
+ *
7
+ * Usage (stdio - for Claude Desktop / Cursor / VS Code):
8
+ * NOTION_API_KEY=ntn_xxx npx @node2flow/notion-mcp
9
+ *
10
+ * Usage (HTTP - Streamable HTTP transport):
11
+ * NOTION_API_KEY=ntn_xxx npx @node2flow/notion-mcp --http
12
+ */
13
+ import { randomUUID } from 'node:crypto';
14
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
15
+ import { StreamableHTTPServerTransport, } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
16
+ import { createMcpExpressApp } from '@modelcontextprotocol/sdk/server/express.js';
17
+ import { isInitializeRequest } from '@modelcontextprotocol/sdk/types.js';
18
+ import { createServer } from './server.js';
19
+ import { TOOLS } from './tools.js';
20
+ /**
21
+ * Read config from environment variables
22
+ */
23
+ function getConfig() {
24
+ const apiKey = process.env.NOTION_API_KEY;
25
+ if (!apiKey) {
26
+ return null;
27
+ }
28
+ return { apiKey };
29
+ }
30
+ /**
31
+ * Start in stdio mode (for Claude Desktop, Cursor, VS Code)
32
+ */
33
+ async function startStdio() {
34
+ const config = getConfig();
35
+ const server = createServer(config ?? undefined);
36
+ const transport = new StdioServerTransport();
37
+ await server.connect(transport);
38
+ console.error('Notion MCP Server running on stdio');
39
+ console.error(`API key: ${config ? '***configured***' : '(not configured yet)'}`);
40
+ console.error(`Tools available: ${TOOLS.length}`);
41
+ console.error('Ready for MCP client\n');
42
+ }
43
+ /**
44
+ * Start in HTTP mode (Streamable HTTP transport)
45
+ */
46
+ async function startHttp() {
47
+ const port = parseInt(process.env.PORT || '3000', 10);
48
+ const app = createMcpExpressApp({ host: '0.0.0.0' });
49
+ const transports = {};
50
+ app.post('/mcp', async (req, res) => {
51
+ const url = new URL(req.url, `http://${req.headers.host}`);
52
+ const qApiKey = url.searchParams.get('NOTION_API_KEY');
53
+ if (qApiKey)
54
+ process.env.NOTION_API_KEY = qApiKey;
55
+ const sessionId = req.headers['mcp-session-id'];
56
+ try {
57
+ let transport;
58
+ if (sessionId && transports[sessionId]) {
59
+ transport = transports[sessionId];
60
+ }
61
+ else if (!sessionId && isInitializeRequest(req.body)) {
62
+ transport = new StreamableHTTPServerTransport({
63
+ sessionIdGenerator: () => randomUUID(),
64
+ onsessioninitialized: (sid) => {
65
+ transports[sid] = transport;
66
+ },
67
+ });
68
+ transport.onclose = () => {
69
+ const sid = transport.sessionId;
70
+ if (sid && transports[sid]) {
71
+ delete transports[sid];
72
+ }
73
+ };
74
+ const config = getConfig();
75
+ const server = createServer(config ?? undefined);
76
+ await server.connect(transport);
77
+ await transport.handleRequest(req, res, req.body);
78
+ return;
79
+ }
80
+ else {
81
+ res.status(400).json({
82
+ jsonrpc: '2.0',
83
+ error: { code: -32000, message: 'Bad Request: No valid session ID provided' },
84
+ id: null,
85
+ });
86
+ return;
87
+ }
88
+ await transport.handleRequest(req, res, req.body);
89
+ }
90
+ catch (error) {
91
+ console.error('Error handling MCP request:', error);
92
+ if (!res.headersSent) {
93
+ res.status(500).json({
94
+ jsonrpc: '2.0',
95
+ error: { code: -32603, message: 'Internal server error' },
96
+ id: null,
97
+ });
98
+ }
99
+ }
100
+ });
101
+ app.get('/mcp', async (req, res) => {
102
+ const sessionId = req.headers['mcp-session-id'];
103
+ if (!sessionId || !transports[sessionId]) {
104
+ res.status(400).send('Invalid or missing session ID');
105
+ return;
106
+ }
107
+ await transports[sessionId].handleRequest(req, res);
108
+ });
109
+ app.delete('/mcp', async (req, res) => {
110
+ const sessionId = req.headers['mcp-session-id'];
111
+ if (!sessionId || !transports[sessionId]) {
112
+ res.status(400).send('Invalid or missing session ID');
113
+ return;
114
+ }
115
+ await transports[sessionId].handleRequest(req, res);
116
+ });
117
+ app.get('/', (_req, res) => {
118
+ res.json({
119
+ name: 'notion-mcp',
120
+ version: '1.0.0',
121
+ status: 'ok',
122
+ tools: TOOLS.length,
123
+ transport: 'streamable-http',
124
+ endpoints: { mcp: '/mcp' },
125
+ });
126
+ });
127
+ const config = getConfig();
128
+ app.listen(port, () => {
129
+ console.log(`Notion MCP Server (HTTP) listening on port ${port}`);
130
+ console.log(`API key: ${config ? '***configured***' : '(not configured yet)'}`);
131
+ console.log(`Tools available: ${TOOLS.length}`);
132
+ console.log(`MCP endpoint: http://localhost:${port}/mcp`);
133
+ });
134
+ process.on('SIGINT', async () => {
135
+ console.log('\nShutting down...');
136
+ for (const sessionId in transports) {
137
+ try {
138
+ await transports[sessionId].close();
139
+ delete transports[sessionId];
140
+ }
141
+ catch {
142
+ // Ignore cleanup errors
143
+ }
144
+ }
145
+ process.exit(0);
146
+ });
147
+ }
148
+ async function main() {
149
+ const useHttp = process.argv.includes('--http');
150
+ if (useHttp) {
151
+ await startHttp();
152
+ }
153
+ else {
154
+ await startStdio();
155
+ }
156
+ }
157
+ /**
158
+ * Smithery default export
159
+ */
160
+ export default function createSmitheryServer(opts) {
161
+ if (opts?.config?.NOTION_API_KEY)
162
+ process.env.NOTION_API_KEY = opts.config.NOTION_API_KEY;
163
+ const config = getConfig();
164
+ return createServer(config ?? undefined);
165
+ }
166
+ main().catch((error) => {
167
+ console.error('Fatal error:', error);
168
+ process.exit(1);
169
+ });
170
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Shared MCP Server — used by both Node.js (index.ts) and CF Worker (worker.ts)
3
+ */
4
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
+ import { NotionClient } from './client.js';
6
+ export interface NotionMcpConfig {
7
+ apiKey: string;
8
+ }
9
+ export declare function handleToolCall(toolName: string, args: Record<string, unknown>, client: NotionClient): Promise<unknown>;
10
+ export declare function createServer(config?: NotionMcpConfig): McpServer;
11
+ //# sourceMappingURL=server.d.ts.map