systemprompt-mcp-notion
Version:
A specialized Model Context Protocol (MCP) server that integrates Notion into your AI workflows. This server enables seamless access to Notion through MCP, allowing AI agents to interact with pages, databases, and comments.
332 lines (331 loc) • 9.43 kB
JavaScript
// Base schema for rich text content
export const richTextSchema = {
type: "array",
items: {
type: "object",
properties: {
type: { type: "string", enum: ["text"] },
text: {
type: "object",
properties: {
content: { type: "string" },
link: {
type: ["object", "null"],
properties: {
url: { type: "string" },
},
},
},
required: ["content"],
},
annotations: {
type: "object",
properties: {
bold: { type: "boolean" },
italic: { type: "boolean" },
strikethrough: { type: "boolean" },
underline: { type: "boolean" },
code: { type: "boolean" },
color: { type: "string" },
},
},
plain_text: { type: "string" },
href: { type: ["string", "null"] },
},
required: ["type", "text"],
},
};
// Title property schema
export const titlePropertySchema = {
type: "object",
properties: {
title: richTextSchema,
},
required: ["title"],
};
// Text property schema
export const textPropertySchema = {
type: "object",
properties: {
rich_text: richTextSchema,
},
required: ["rich_text"],
};
// Number property schema
export const numberPropertySchema = {
type: "object",
properties: {
number: { type: ["number", "null"] },
},
required: ["number"],
};
// Select property schema
export const selectPropertySchema = {
type: "object",
properties: {
select: {
type: ["object", "null"],
properties: {
id: { type: "string" },
name: { type: "string" },
color: { type: "string" },
},
},
},
required: ["select"],
};
// Multi-select property schema
export const multiSelectPropertySchema = {
type: "object",
properties: {
multi_select: {
type: "array",
items: {
type: "object",
properties: {
id: { type: "string" },
name: { type: "string" },
color: { type: "string" },
},
required: ["id", "name"],
},
},
},
required: ["multi_select"],
};
// Date property schema
export const datePropertySchema = {
type: "object",
properties: {
date: {
type: ["object", "null"],
properties: {
start: { type: "string", format: "date-time" },
end: { type: ["string", "null"], format: "date-time" },
time_zone: { type: ["string", "null"] },
},
required: ["start"],
},
},
required: ["date"],
};
// People property schema
export const peoplePropertySchema = {
type: "object",
properties: {
people: {
type: "array",
items: {
type: "object",
properties: {
id: { type: "string" },
object: { type: "string", enum: ["user"] },
},
required: ["id", "object"],
},
},
},
required: ["people"],
};
// Files property schema
export const filesPropertySchema = {
type: "object",
properties: {
files: {
type: "array",
items: {
type: "object",
properties: {
name: { type: "string" },
type: { type: "string", enum: ["file", "external"] },
file: {
type: "object",
properties: {
url: { type: "string" },
expiry_time: { type: "string", format: "date-time" },
},
},
external: {
type: "object",
properties: {
url: { type: "string" },
},
},
},
required: ["name", "type"],
},
},
},
required: ["files"],
};
// Checkbox property schema
export const checkboxPropertySchema = {
type: "object",
properties: {
checkbox: { type: "boolean" },
},
required: ["checkbox"],
};
// URL property schema
export const urlPropertySchema = {
type: "object",
properties: {
url: { type: ["string", "null"] },
},
required: ["url"],
};
// Email property schema
export const emailPropertySchema = {
type: "object",
properties: {
email: { type: ["string", "null"] },
},
required: ["email"],
};
// Phone number property schema
export const phoneNumberPropertySchema = {
type: "object",
properties: {
phone_number: { type: ["string", "null"] },
},
required: ["phone_number"],
};
// Formula property schema
export const formulaPropertySchema = {
type: "object",
properties: {
formula: {
type: "object",
properties: {
type: { type: "string", enum: ["string", "number", "boolean", "date"] },
string: { type: "string" },
number: { type: "number" },
boolean: { type: "boolean" },
date: {
type: "object",
properties: {
start: { type: "string", format: "date-time" },
end: { type: ["string", "null"], format: "date-time" },
},
},
},
required: ["type"],
},
},
required: ["formula"],
};
// Relation property schema
export const relationPropertySchema = {
type: "object",
properties: {
relation: {
type: "array",
items: {
type: "object",
properties: {
id: { type: "string" },
},
required: ["id"],
},
},
},
required: ["relation"],
};
// Rollup property schema
export const rollupPropertySchema = {
type: "object",
properties: {
rollup: {
type: "object",
properties: {
type: { type: "string", enum: ["number", "date", "array"] },
number: { type: "number" },
date: {
type: "object",
properties: {
start: { type: "string", format: "date-time" },
end: { type: ["string", "null"], format: "date-time" },
},
},
array: {
type: "array",
items: {
type: "object",
// The items can be of any property type
additionalProperties: true,
},
},
},
required: ["type"],
},
},
required: ["rollup"],
};
// Created time property schema
export const createdTimePropertySchema = {
type: "object",
properties: {
created_time: { type: "string", format: "date-time" },
},
required: ["created_time"],
};
// Created by property schema
export const createdByPropertySchema = {
type: "object",
properties: {
created_by: {
type: "object",
properties: {
id: { type: "string" },
object: { type: "string", enum: ["user"] },
},
required: ["id", "object"],
},
},
required: ["created_by"],
};
// Last edited time property schema
export const lastEditedTimePropertySchema = {
type: "object",
properties: {
last_edited_time: { type: "string", format: "date-time" },
},
required: ["last_edited_time"],
};
// Last edited by property schema
export const lastEditedByPropertySchema = {
type: "object",
properties: {
last_edited_by: {
type: "object",
properties: {
id: { type: "string" },
object: { type: "string", enum: ["user"] },
},
required: ["id", "object"],
},
},
required: ["last_edited_by"],
};
// Combined property schemas map
export const notionPropertySchemas = {
title: titlePropertySchema,
rich_text: textPropertySchema,
number: numberPropertySchema,
select: selectPropertySchema,
multi_select: multiSelectPropertySchema,
date: datePropertySchema,
people: peoplePropertySchema,
files: filesPropertySchema,
checkbox: checkboxPropertySchema,
url: urlPropertySchema,
email: emailPropertySchema,
phone_number: phoneNumberPropertySchema,
formula: formulaPropertySchema,
relation: relationPropertySchema,
rollup: rollupPropertySchema,
created_time: createdTimePropertySchema,
created_by: createdByPropertySchema,
last_edited_time: lastEditedTimePropertySchema,
last_edited_by: lastEditedByPropertySchema,
};