search
Search Notion workspaces for pages and databases using query filters to find specific content within your workspace.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | The search query string | |
| filter_object_type | No | Filter by object type | |
| page_size | No | Number of results to return (max 100) |
Implementation Reference
- src/lib/mcp-server.ts:75-109 (handler)The main execution logic for the MCP 'search' tool: prepares params from user input, invokes NotionService.search, formats results as text content or error response.async ({ query, filter_object_type, page_size }) => { const params: any = { page_size }; if (query) params.query = query; if (filter_object_type) { params.filter = { property: "object", value: filter_object_type, }; } try { const results = await this.notionService.search(params); return { content: [ { type: "text", text: JSON.stringify(results, null, 2), }, ], }; } catch (error) { console.error("Error in search tool:", error); return { content: [ { type: "text", text: `Error: Failed to search Notion - ${ (error as Error).message }`, }, ], isError: true, }; } }
- src/lib/mcp-server.ts:62-74 (schema)Zod input validation schema for the 'search' tool parameters.{ query: z.string().optional().describe("The search query string"), filter_object_type: z .enum(["page", "database"]) .optional() .describe("Filter by object type"), page_size: z .number() .min(1) .max(100) .optional() .describe("Number of results to return (max 100)"), },
- src/lib/mcp-server.ts:59-111 (registration)Full registration of the 'search' tool using this.server.tool(), including schema and handler function.private registerSearchTool(): void { this.server.tool( "search", { query: z.string().optional().describe("The search query string"), filter_object_type: z .enum(["page", "database"]) .optional() .describe("Filter by object type"), page_size: z .number() .min(1) .max(100) .optional() .describe("Number of results to return (max 100)"), }, async ({ query, filter_object_type, page_size }) => { const params: any = { page_size }; if (query) params.query = query; if (filter_object_type) { params.filter = { property: "object", value: filter_object_type, }; } try { const results = await this.notionService.search(params); return { content: [ { type: "text", text: JSON.stringify(results, null, 2), }, ], }; } catch (error) { console.error("Error in search tool:", error); return { content: [ { type: "text", text: `Error: Failed to search Notion - ${ (error as Error).message }`, }, ], isError: true, }; } } ); }
- src/lib/notion.ts:73-79 (helper)Helper method in NotionService that calls the underlying Notion Client search API and handles errors.async search(params: SearchQuery) { try { return await this.client.search(params); } catch (error) { this.handleError(error); } }
- src/types/notion.ts:4-21 (schema)Zod schema and TypeScript type definition for SearchQuery parameters used by the NotionService.search helper.export const SearchQuerySchema = z.object({ query: z.string().optional(), filter: z .object({ value: z.enum(["page", "database"]), property: z.literal("object"), }) .optional(), sort: z .object({ direction: z.enum(["ascending", "descending"]), timestamp: z.enum(["last_edited_time"]), }) .optional(), page_size: z.number().min(1).max(100).optional(), }); export type SearchQuery = z.infer<typeof SearchQuerySchema>;