import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import { CallToolRequestSchema, ErrorCode, ListToolsRequestSchema, McpError, } from '@modelcontextprotocol/sdk/types.js';
import { NotionClient } from './client.js';
import { createPageToolDefinition, retrievePageToolDefinition, updatePageToolDefinition, retrievePagePropertyToolDefinition, handleCreatePageTool, handleRetrievePageTool, handleUpdatePageTool, handleRetrievePagePropertyTool } from './tools/index.js';
export class NotionServer {
client;
server;
constructor(apiKey, version) {
this.client = new NotionClient(apiKey, version);
this.server = new Server({
name: 'notion-mcp',
version: '0.1.0',
}, {
capabilities: {
tools: {},
},
});
this.setupHandlers();
this.setupErrorHandling();
}
setupHandlers() {
this.server.setRequestHandler(ListToolsRequestSchema, async () => ({
tools: [
createPageToolDefinition,
retrievePageToolDefinition,
updatePageToolDefinition,
retrievePagePropertyToolDefinition
],
}));
this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
const { name, arguments: args } = request.params;
switch (name) {
case 'notion_create_page':
return handleCreatePageTool(this.client, args);
case 'notion_retrieve_page':
return handleRetrievePageTool(this.client, args);
case 'notion_update_page':
return handleUpdatePageTool(this.client, args);
case 'notion_retrieve_page_property':
return handleRetrievePagePropertyTool(this.client, args);
default:
throw new McpError(ErrorCode.MethodNotFound, `Unknown tool: ${name}`);
}
});
}
setupErrorHandling() {
this.server.onerror = (error) => console.error('[MCP Error]', error);
process.on('SIGINT', async () => {
await this.server.close();
process.exit(0);
});
}
getServer() {
return this.server;
}
}
export function createStandaloneServer(apiKey, version) {
const server = new Server({
name: "notion-mcp-standalone",
version: "0.1.0",
}, {
capabilities: {
tools: {},
},
});
const client = new NotionClient(apiKey, version);
server.setRequestHandler(ListToolsRequestSchema, async () => ({
tools: [
createPageToolDefinition,
retrievePageToolDefinition,
updatePageToolDefinition,
retrievePagePropertyToolDefinition
],
}));
server.setRequestHandler(CallToolRequestSchema, async (request) => {
const { name, arguments: args } = request.params;
switch (name) {
case 'notion_create_page':
return handleCreatePageTool(client, args);
case 'notion_retrieve_page':
return handleRetrievePageTool(client, args);
case 'notion_update_page':
return handleUpdatePageTool(client, args);
case 'notion_retrieve_page_property':
return handleRetrievePagePropertyTool(client, args);
default:
throw new McpError(ErrorCode.MethodNotFound, `Unknown tool: ${name}`);
}
});
return server;
}