search-notion
Search and retrieve specific content from Notion workspaces to enhance productivity and streamline information access for users and LLMs.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes |
Implementation Reference
- src/index.ts:45-91 (handler)Handler function for 'search-notion' tool: performs Notion search with the given query, sorts by last edited time descending, extracts and formats page titles, IDs, URLs, types, and last edited times, returns formatted JSON or error message.async ({ query }) => { try { const results = await notion.search({ query, sort: { direction: "descending", timestamp: "last_edited_time" }, }); // Format the results nicely const formattedResults = results.results.map((item: any) => { // Safely extract title based on the item type let title = "Untitled"; if (item.object === "page" && item.properties) { // Try to find title in various typical properties const titleProp = item.properties.title || item.properties.Name; if (titleProp?.title?.[0]?.plain_text) { title = titleProp.title[0].plain_text; } } return { id: item.id, title, url: item.url || "", type: item.object, last_edited: item.last_edited_time }; }); return { content: [{ type: "text", text: JSON.stringify(formattedResults, null, 2) }] }; } catch (error: any) { return { content: [{ type: "text", text: `Error searching Notion: ${error.message}` }], isError: true }; } }
- src/index.ts:42-92 (registration)Registration of the 'search-notion' MCP tool using server.tool(), specifying input schema { query: z.string() } and the handler function.server.tool( "search-notion", { query: z.string() }, async ({ query }) => { try { const results = await notion.search({ query, sort: { direction: "descending", timestamp: "last_edited_time" }, }); // Format the results nicely const formattedResults = results.results.map((item: any) => { // Safely extract title based on the item type let title = "Untitled"; if (item.object === "page" && item.properties) { // Try to find title in various typical properties const titleProp = item.properties.title || item.properties.Name; if (titleProp?.title?.[0]?.plain_text) { title = titleProp.title[0].plain_text; } } return { id: item.id, title, url: item.url || "", type: item.object, last_edited: item.last_edited_time }; }); return { content: [{ type: "text", text: JSON.stringify(formattedResults, null, 2) }] }; } catch (error: any) { return { content: [{ type: "text", text: `Error searching Notion: ${error.message}` }], isError: true }; } } );
- src/index.ts:43-44 (schema)Input schema for 'search-notion' tool: requires a string 'query' validated by Zod."search-notion", { query: z.string() },