@papermark/mcp-server 0.6.0 → 0.7.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/dist/{chunk-DA26JZA2.js → chunk-YMSDUZ2I.js} +16 -4
- package/dist/chunk-YMSDUZ2I.js.map +1 -0
- package/dist/index.js +50 -8
- package/dist/index.js.map +1 -1
- package/dist/tools-contract.d.ts +28 -20
- package/dist/tools-contract.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-DA26JZA2.js.map +0 -1
|
@@ -67,6 +67,9 @@ var documentObjectOutputSchema = z.object({
|
|
|
67
67
|
content_type: nullableStringOutputSchema(
|
|
68
68
|
"Document MIME type, such as `application/pdf`, or null when unknown."
|
|
69
69
|
),
|
|
70
|
+
url: nullableStringOutputSchema(
|
|
71
|
+
"For `link` and `notion` documents, the external target URL the document points to. Null for file-based documents."
|
|
72
|
+
),
|
|
70
73
|
num_pages: nullableIntegerOutputSchema(
|
|
71
74
|
"Number of pages, or null when unknown."
|
|
72
75
|
),
|
|
@@ -679,11 +682,13 @@ var getDocumentVersionContract = {
|
|
|
679
682
|
var addDocumentVersionContract = {
|
|
680
683
|
name: "add_document_version",
|
|
681
684
|
title: "Add a new document version",
|
|
682
|
-
description: `
|
|
685
|
+
description: `Add a new version of an existing document. The new version becomes primary by default; live links automatically serve it.
|
|
686
|
+
|
|
687
|
+
For a file document, pass \`source_url\` \u2014 a public HTTPS URL the server fetches as the new file. For a \`link\`/\`notion\` document, pass \`external_url\` to repoint it at a new URL (its type is preserved; the URL is stored as-is, not downloaded). Provide exactly one.
|
|
683
688
|
|
|
684
689
|
WORKFLOW:
|
|
685
690
|
(1) Resolve the target document via \`search_documents\` or \`list_documents\`.
|
|
686
|
-
(2) The user must give you
|
|
691
|
+
(2) The user must give you the URL \u2014 don't fabricate one.
|
|
687
692
|
(3) After creation, mention the version_number so the user can promote/rollback later.
|
|
688
693
|
|
|
689
694
|
NOTE: Adding a version from a local file path is not supported by this MCP tool \u2014 for that, use the \`upload_document\` tool to create a new document, or have the user upload via the Papermark UI.
|
|
@@ -693,7 +698,14 @@ Requires scope \`documents.write\`.`,
|
|
|
693
698
|
document_id: z.string().min(1),
|
|
694
699
|
source_url: z.string().url().refine((s) => s.startsWith("https://"), {
|
|
695
700
|
message: "source_url must use https://"
|
|
696
|
-
}).describe(
|
|
701
|
+
}).optional().describe(
|
|
702
|
+
"Public HTTPS URL the server fetches as the new version (file documents only)"
|
|
703
|
+
),
|
|
704
|
+
external_url: z.string().url().refine((s) => s.startsWith("https://"), {
|
|
705
|
+
message: "external_url must use https://"
|
|
706
|
+
}).optional().describe(
|
|
707
|
+
"New target URL for a link/notion document, stored as-is (not downloaded). The document's type is preserved."
|
|
708
|
+
)
|
|
697
709
|
}
|
|
698
710
|
};
|
|
699
711
|
var promoteDocumentVersionContract = {
|
|
@@ -1102,4 +1114,4 @@ export {
|
|
|
1102
1114
|
getVisitorContract,
|
|
1103
1115
|
SHARED_TOOL_OUTPUT_SCHEMAS
|
|
1104
1116
|
};
|
|
1105
|
-
//# sourceMappingURL=chunk-
|
|
1117
|
+
//# sourceMappingURL=chunk-YMSDUZ2I.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tools-contract.ts"],"sourcesContent":["import { z } from \"zod\";\n\n/**\n * Single source of truth for the LLM-facing contract of each Papermark MCP\n * tool — name, title, description, and zod input schema. Both the stdio\n * transport (this repo) and the remote HTTP adapter (in the papermark app)\n * import from here so descriptions and schemas can't drift.\n *\n * Tool *bodies* (how each transport actually fulfills the request) stay in\n * the transport, because the environments differ — stdio can read local\n * files and hit the public v1 API over fetch; the in-app HTTP adapter\n * reaches the v1 routes via loopback with the caller's bearer token.\n *\n * `upload_document` is intentionally omitted: the stdio variant accepts a\n * local `file_path`, which the HTTP variant can't honor. Each side defines\n * its own upload_document contract.\n */\n\nexport interface ToolContract<TShape extends z.ZodRawShape> {\n name: string;\n title: string;\n description: string;\n inputSchema: TShape;\n}\n\nexport const anyObjectOutputSchema = z.object({}).passthrough();\n\n// Shared shape for the watermark configuration on share links.\n// Mirrors `WatermarkConfig` in the public v1 OpenAPI schema.\nconst watermarkPositionEnum = z.enum([\n \"top-left\",\n \"top-center\",\n \"top-right\",\n \"middle-left\",\n \"middle-center\",\n \"middle-right\",\n \"bottom-left\",\n \"bottom-center\",\n \"bottom-right\",\n]);\nconst watermarkRotationEnum = z.union([\n z.literal(0),\n z.literal(30),\n z.literal(45),\n z.literal(90),\n z.literal(180),\n]);\nexport const watermarkConfigInputSchema = z\n .object({\n text: z\n .string()\n .min(1)\n .describe(\n \"Watermark text. Tokens interpolated per view: {{email}}, {{date}}, {{time}}, {{link}}, {{ipAddress}}.\",\n ),\n is_tiled: z\n .boolean()\n .describe(\n \"When true, tile the watermark across the page instead of rendering at `position`.\",\n ),\n position: watermarkPositionEnum.describe(\n \"Anchor position. Ignored when `is_tiled` is true.\",\n ),\n rotation: watermarkRotationEnum.describe(\n \"Rotation in degrees. One of 0, 30, 45, 90, 180.\",\n ),\n color: z\n .string()\n .regex(/^#([0-9A-Fa-f]{3}){1,2}$/, \"Hex color like #RGB or #RRGGBB\")\n .describe(\"Text color as `#RGB` or `#RRGGBB`.\"),\n font_size: z\n .number()\n .int()\n .min(1)\n .max(96)\n .describe(\"Font size in points (1-96).\"),\n opacity: z\n .number()\n .min(0)\n .max(1)\n .describe(\"Opacity from 0 (invisible) to 1 (fully opaque).\"),\n })\n .describe(\"Watermark configuration applied when `enable_watermark` is true.\");\nconst watermarkConfigOutputSchema = z\n .object({\n text: z.string(),\n is_tiled: z.boolean(),\n position: watermarkPositionEnum,\n rotation: watermarkRotationEnum,\n color: z.string(),\n font_size: z.number().int(),\n opacity: z.number(),\n })\n .nullable()\n .describe(\n \"Watermark configuration. Null when `enable_watermark` is true but no config has been set (viewer falls back to defaults).\",\n );\n\nconst dateTimeOutputSchema = (description: string) =>\n z.string().datetime().describe(description);\nconst nullableDateTimeOutputSchema = (description: string) =>\n z.string().datetime().nullable().describe(description);\nconst nullableStringOutputSchema = (description: string) =>\n z.string().nullable().describe(description);\nconst integerOutputSchema = (description: string) =>\n z.number().int().describe(description);\nconst nullableIntegerOutputSchema = (description: string) =>\n z.number().int().nullable().describe(description);\nconst cursorOutputSchema = z\n .string()\n .nullable()\n .describe(\n \"Opaque cursor for the next page, or null when there is no next page.\",\n );\n\nexport const documentObjectOutputSchema = z\n .object({\n id: z.string().describe(\"Unique Papermark document id.\"),\n object: z\n .literal(\"document\")\n .describe(\"String representing the object's type. Always `document`.\"),\n name: z.string().describe(\"Document file name.\"),\n type: nullableStringOutputSchema(\n \"Document type, such as `pdf`, or null when unknown.\",\n ),\n content_type: nullableStringOutputSchema(\n \"Document MIME type, such as `application/pdf`, or null when unknown.\",\n ),\n url: nullableStringOutputSchema(\n \"For `link` and `notion` documents, the external target URL the document points to. Null for file-based documents.\",\n ),\n num_pages: nullableIntegerOutputSchema(\n \"Number of pages, or null when unknown.\",\n ),\n folder_id: nullableStringOutputSchema(\n \"ID of the team-library folder containing this document, or null for the library root.\",\n ),\n created: dateTimeOutputSchema(\"When the document was created.\"),\n updated_at: dateTimeOutputSchema(\"When the document was last updated.\"),\n })\n .passthrough()\n .describe(\"Papermark document object.\");\n\nexport const linkObjectOutputSchema = z\n .object({\n id: z.string().describe(\"Unique Papermark share link id.\"),\n object: z\n .literal(\"link\")\n .describe(\"String representing the object's type. Always `link`.\"),\n name: nullableStringOutputSchema(\n \"Human-readable internal label for the link, or null when unset.\",\n ),\n target_type: z\n .enum([\"document\", \"dataroom\"])\n .describe(\n \"The kind of resource this link points at. The matching `document_id` / `dataroom_id` field is populated; the other is null.\",\n ),\n document_id: nullableStringOutputSchema(\n \"Target document id when this is a document link, otherwise null.\",\n ),\n dataroom_id: nullableStringOutputSchema(\n \"Target dataroom id when this is a dataroom link, otherwise null.\",\n ),\n url: z.string().describe(\"The public view URL for this link.\"),\n domain: nullableStringOutputSchema(\n \"Custom domain the link is hosted on. The same value accepted as `domain` on create/update. Null when the link uses the default papermark.com URL.\",\n ),\n slug: nullableStringOutputSchema(\n \"Path segment for the custom-domain URL, or null when unset.\",\n ),\n expires_at: nullableDateTimeOutputSchema(\n \"Expiration timestamp, or null when the link does not expire.\",\n ),\n is_password_protected: z\n .boolean()\n .describe(\n \"True if a password is set. The password itself is never returned.\",\n ),\n email_protected: z\n .boolean()\n .describe(\"Whether viewers must provide an email address.\"),\n email_authenticated: z\n .boolean()\n .describe(\"Whether email authentication is required for viewers.\"),\n allow_download: z\n .boolean()\n .describe(\"Whether viewers can download the linked content.\"),\n allow_list: z\n .array(z.string())\n .describe(\n \"Email or domain allow list (e.g., ['@acme.com', 'bob@example.com']).\",\n ),\n deny_list: z\n .array(z.string())\n .describe(\"Blocked viewer emails or domains.\"),\n enable_watermark: z.boolean().describe(\"Whether watermarking is enabled.\"),\n watermark_config: watermarkConfigOutputSchema,\n enable_feedback: z\n .boolean()\n .describe(\"Whether viewer feedback is enabled.\"),\n enable_screenshot_protection: z\n .boolean()\n .describe(\"Whether screenshot protection is enabled.\"),\n enable_confidential_view: z\n .boolean()\n .describe(\n \"Whether confidential-view mode is enabled. When on, the viewer renders only a narrow band of each page at a time (rest is blurred) to prevent full-page screenshots.\",\n ),\n created: dateTimeOutputSchema(\"When the link was created.\"),\n updated_at: dateTimeOutputSchema(\"When the link was last updated.\"),\n })\n .passthrough()\n .describe(\"Papermark share link object.\");\n\nexport const dataroomObjectOutputSchema = z\n .object({\n id: z.string().describe(\"Unique Papermark dataroom id.\"),\n object: z\n .literal(\"dataroom\")\n .describe(\"String representing the object's type. Always `dataroom`.\"),\n pid: z\n .string()\n .describe(\n \"Stripe-style public ID, suitable for URLs and user references\",\n ),\n name: z.string().describe(\"Human-visible dataroom name.\"),\n internal_name: nullableStringOutputSchema(\n \"Private alias visible only to the team\",\n ),\n description: nullableStringOutputSchema(\n \"Dataroom description, or null when unset.\",\n ),\n document_count: integerOutputSchema(\"Number of documents in the dataroom.\"),\n folder_count: integerOutputSchema(\"Number of folders in the dataroom.\"),\n conversations_enabled: z\n .boolean()\n .describe(\"Whether conversations are enabled.\"),\n agents_enabled: z.boolean().describe(\"Whether AI agents are enabled.\"),\n allow_bulk_download: z\n .boolean()\n .describe(\"Whether viewers can bulk download dataroom contents.\"),\n is_frozen: z.boolean().describe(\"Whether the dataroom is frozen.\"),\n created: dateTimeOutputSchema(\"When the dataroom was created.\"),\n updated_at: dateTimeOutputSchema(\"When the dataroom was last updated.\"),\n })\n .passthrough()\n .describe(\"Papermark dataroom object.\");\n\nexport const folderObjectOutputSchema = z\n .object({\n id: z.string().describe(\"Unique Papermark folder id.\"),\n object: z\n .enum([\"folder\", \"dataroom_folder\"])\n .describe(\n \"String representing the object's type. Either `folder` for a team-library folder or `dataroom_folder` for a dataroom folder.\",\n ),\n name: z.string().describe(\"Folder name.\"),\n parent_id: nullableStringOutputSchema(\n \"Parent folder id, or null when the folder is at the root.\",\n ),\n path: z\n .string()\n .describe(\n \"Server-derived path of slugified folder names. Read-only — never accepted from clients.\",\n ),\n icon: nullableStringOutputSchema(\"Folder icon token, when configured.\"),\n color: nullableStringOutputSchema(\"Folder color token, when configured.\"),\n document_count: integerOutputSchema(\"Number of direct child documents.\"),\n child_folder_count: integerOutputSchema(\"Number of direct child folders.\"),\n order_index: nullableIntegerOutputSchema(\n \"Ordering index for dataroom folders, when available.\",\n ).optional(),\n created: dateTimeOutputSchema(\"When the folder was created.\"),\n updated_at: dateTimeOutputSchema(\"When the folder was last updated.\"),\n })\n .passthrough()\n .describe(\"Papermark folder object.\");\n\nexport const documentVersionObjectOutputSchema = z\n .object({\n id: z.string().describe(\"Unique Papermark document version id.\"),\n object: z\n .literal(\"document_version\")\n .describe(\n \"String representing the object's type. Always `document_version`.\",\n ),\n version_number: integerOutputSchema(\"Sequential version number.\"),\n is_primary: z\n .boolean()\n .describe(\"Whether this is the primary active version.\"),\n type: nullableStringOutputSchema(\"Document type or extension, when known.\"),\n content_type: nullableStringOutputSchema(\"Detected MIME type, when known.\"),\n num_pages: nullableIntegerOutputSchema(\"Number of pages, when known.\"),\n file_size: nullableIntegerOutputSchema(\"File size in bytes, when known.\"),\n created: dateTimeOutputSchema(\"When the version was created.\"),\n updated_at: dateTimeOutputSchema(\"When the version was last updated.\"),\n })\n .passthrough()\n .describe(\"Papermark document version object.\");\n\nexport const dataroomItemObjectOutputSchema = z\n .object({\n id: z\n .string()\n .describe(\n \"DataroomDocument id (the link between a document and the dataroom)\",\n ),\n object: z\n .literal(\"dataroom_document\")\n .describe(\n \"String representing the object's type. Always `dataroom_document`.\",\n ),\n document_id: z.string().describe(\"Underlying document id.\"),\n document_name: z.string().describe(\"Underlying document name.\"),\n content_type: nullableStringOutputSchema(\"Detected MIME type, when known.\"),\n num_pages: nullableIntegerOutputSchema(\"Number of pages, when known.\"),\n folder_id: nullableStringOutputSchema(\n \"Dataroom folder id containing the item, or null for the root.\",\n ),\n folder_path: nullableStringOutputSchema(\n \"Dataroom folder path, when present.\",\n ),\n order_index: nullableIntegerOutputSchema(\n \"Ordering index within the folder.\",\n ),\n created: dateTimeOutputSchema(\"When the document was attached.\"),\n })\n .passthrough()\n .describe(\"Papermark dataroom document attachment object.\");\n\nexport const viewObjectOutputSchema = z\n .object({\n id: z.string().describe(\"Unique Papermark view event id.\"),\n object: z\n .literal(\"view\")\n .describe(\"String representing the object's type. Always `view`.\"),\n link_id: nullableStringOutputSchema(\"Share link id for the view event.\"),\n document_id: nullableStringOutputSchema(\n \"Document id viewed, when present.\",\n ),\n dataroom_id: nullableStringOutputSchema(\n \"Dataroom id viewed, when present.\",\n ),\n viewer_email: nullableStringOutputSchema(\"Viewer email, when captured.\"),\n view_type: nullableStringOutputSchema(\"View event type.\"),\n viewed_at: dateTimeOutputSchema(\"When the view occurred.\"),\n downloaded_at: nullableDateTimeOutputSchema(\n \"When the viewer downloaded content, or null when not downloaded.\",\n ),\n download_type: nullableStringOutputSchema(\"Download type, when available.\"),\n })\n .passthrough()\n .describe(\"Papermark view event object.\");\n\nexport const visitorObjectOutputSchema = z\n .object({\n id: z.string().describe(\"Unique Papermark visitor id.\"),\n object: z\n .literal(\"visitor\")\n .describe(\"String representing the object's type. Always `visitor`.\"),\n email: z.string().describe(\"Visitor email address.\"),\n verified: z.boolean().describe(\"Whether the visitor is verified.\"),\n dataroom_id: nullableStringOutputSchema(\n \"If the visitor is tied to a specific dataroom (invitation or group member), this is its id\",\n ),\n invited_at: nullableDateTimeOutputSchema(\n \"When the visitor was invited, or null when not invited.\",\n ),\n total_views: integerOutputSchema(\"Total number of views by this visitor.\"),\n last_viewed_at: nullableDateTimeOutputSchema(\n \"Most recent view timestamp, or null when there are no views.\",\n ),\n created: dateTimeOutputSchema(\"When the visitor was created.\"),\n updated_at: dateTimeOutputSchema(\"When the visitor was last updated.\"),\n })\n .passthrough()\n .describe(\"Papermark visitor object.\");\n\nexport const visitorViewObjectOutputSchema = z\n .object({\n id: z.string().describe(\"Unique Papermark visitor view event id.\"),\n object: z\n .literal(\"visitor_view\")\n .describe(\n \"String representing the object's type. Always `visitor_view`.\",\n ),\n link_id: z.string().describe(\"Share link id for the view.\"),\n document_id: nullableStringOutputSchema(\n \"Document id viewed, when present.\",\n ),\n dataroom_id: nullableStringOutputSchema(\n \"Dataroom id viewed, when present.\",\n ),\n view_type: z.string().describe(\"View event type.\"),\n viewed_at: dateTimeOutputSchema(\"When the view occurred.\"),\n downloaded_at: nullableDateTimeOutputSchema(\n \"When the visitor downloaded content, or null when not downloaded.\",\n ),\n is_archived: z.boolean().describe(\"Whether this view is archived.\"),\n })\n .passthrough()\n .describe(\"Papermark visitor view event object.\");\n\nexport const documentAnalyticsOutputSchema = z\n .object({\n document_id: z.string().describe(\"Document id these analytics describe.\"),\n total_views: integerOutputSchema(\"Total views in the time window.\"),\n unique_viewers: integerOutputSchema(\"Unique viewers in the time window.\"),\n total_duration_seconds: z\n .number()\n .describe(\"Total read duration in seconds.\"),\n avg_page_duration_seconds: z\n .array(\n z.object({\n page_number: integerOutputSchema(\"One-indexed page number.\"),\n avg_duration_seconds: z\n .number()\n .describe(\"Average duration on this page in seconds.\"),\n }),\n )\n .describe(\"Average duration per page.\"),\n since: dateTimeOutputSchema(\"Start of the analytics window.\"),\n until: dateTimeOutputSchema(\"End of the analytics window.\"),\n })\n .passthrough()\n .describe(\"Document analytics summary.\");\n\nexport const linkAnalyticsOutputSchema = z\n .object({\n link_id: z.string().describe(\"Share link id these analytics describe.\"),\n total_views: integerOutputSchema(\"Total views in the time window.\"),\n total_duration_seconds: z\n .number()\n .describe(\"Total read duration in seconds.\"),\n unique_viewers: integerOutputSchema(\"Unique viewers in the time window.\"),\n since: dateTimeOutputSchema(\"Start of the analytics window.\"),\n until: dateTimeOutputSchema(\"End of the analytics window.\"),\n })\n .passthrough()\n .describe(\"Link analytics summary.\");\n\nexport const dataroomAnalyticsOutputSchema = z\n .object({\n dataroom_id: z.string().describe(\"Dataroom id these analytics describe.\"),\n total_views: integerOutputSchema(\"Total views in the time window.\"),\n unique_viewers: integerOutputSchema(\"Unique viewers in the time window.\"),\n total_duration_seconds: z\n .number()\n .describe(\"Total read duration in seconds.\"),\n since: dateTimeOutputSchema(\"Start of the analytics window.\"),\n until: dateTimeOutputSchema(\"End of the analytics window.\"),\n })\n .passthrough()\n .describe(\"Dataroom analytics summary.\");\n\nexport const viewAnalyticsOutputSchema = z\n .object({\n view_id: z.string().describe(\"View id these analytics describe.\"),\n document_id: nullableStringOutputSchema(\n \"Document id viewed, when present.\",\n ),\n viewer_email: nullableStringOutputSchema(\"Viewer email, when captured.\"),\n viewed_at: dateTimeOutputSchema(\"When the view occurred.\"),\n page_durations: z\n .array(\n z.object({\n page_number: integerOutputSchema(\"One-indexed page number.\"),\n duration_seconds: z\n .number()\n .describe(\"Duration on this page in seconds.\"),\n }),\n )\n .describe(\"Per-page duration details.\"),\n total_duration_seconds: z\n .number()\n .describe(\"Total read duration in seconds.\"),\n location: z\n .object({\n country: nullableStringOutputSchema(\"Viewer country, when known.\"),\n city: nullableStringOutputSchema(\"Viewer city, when known.\"),\n })\n .nullable()\n .describe(\"Approximate viewer location, or null when unknown.\"),\n client: z\n .object({\n browser: nullableStringOutputSchema(\"Viewer browser, when known.\"),\n os: nullableStringOutputSchema(\"Viewer operating system, when known.\"),\n device: nullableStringOutputSchema(\"Viewer device type, when known.\"),\n })\n .nullable()\n .describe(\"Viewer client details, or null when unknown.\"),\n })\n .passthrough()\n .describe(\"View analytics details.\");\n\nexport const documentOutputSchema = z.object({\n document: documentObjectOutputSchema.describe(\n \"Document returned by the tool.\",\n ),\n});\nexport const linkOutputSchema = z.object({\n link: linkObjectOutputSchema.describe(\"Share link returned by the tool.\"),\n});\nexport const dataroomOutputSchema = z.object({\n dataroom: dataroomObjectOutputSchema.describe(\n \"Dataroom returned by the tool.\",\n ),\n});\nexport const folderOutputSchema = z.object({\n folder: folderObjectOutputSchema.describe(\"Folder returned by the tool.\"),\n});\nexport const versionOutputSchema = z.object({\n version: documentVersionObjectOutputSchema.describe(\n \"Document version returned by the tool.\",\n ),\n});\nexport const dataroomItemOutputSchema = z.object({\n item: dataroomItemObjectOutputSchema.describe(\n \"Dataroom document attachment returned by the tool.\",\n ),\n});\n\nexport const documentsListOutputSchema = z.object({\n documents: z\n .array(documentObjectOutputSchema)\n .describe(\"Documents in the current page.\"),\n next_cursor: cursorOutputSchema,\n});\n\nexport const dataroomDocumentsListOutputSchema = z.object({\n documents: z\n .array(dataroomItemObjectOutputSchema)\n .describe(\"Dataroom document attachments in the current page.\"),\n next_cursor: cursorOutputSchema,\n});\n\nexport const linksListOutputSchema = z.object({\n links: z.array(linkObjectOutputSchema).describe(\"Links in the current page.\"),\n next_cursor: cursorOutputSchema,\n});\n\nexport const viewsListOutputSchema = z.object({\n views: z.array(viewObjectOutputSchema).describe(\"Views in the current page.\"),\n next_cursor: cursorOutputSchema,\n});\n\nexport const dataroomsListOutputSchema = z.object({\n datarooms: z\n .array(dataroomObjectOutputSchema)\n .describe(\"Datarooms in the current page.\"),\n next_cursor: cursorOutputSchema,\n});\n\nexport const visitorsListOutputSchema = z.object({\n visitors: z\n .array(visitorObjectOutputSchema)\n .describe(\"Visitors in the current page.\"),\n next_cursor: cursorOutputSchema,\n});\n\nexport const visitorViewsListOutputSchema = z.object({\n views: z\n .array(visitorViewObjectOutputSchema)\n .describe(\"Visitor views in the current page.\"),\n next_cursor: cursorOutputSchema,\n});\n\nexport const foldersListOutputSchema = z.object({\n folders: z\n .array(folderObjectOutputSchema)\n .describe(\"Folders in the current page.\"),\n next_cursor: cursorOutputSchema,\n});\n\nexport const versionsListOutputSchema = z.object({\n versions: z\n .array(documentVersionObjectOutputSchema)\n .describe(\"Document versions.\"),\n});\n\nexport const deletedObjectOutputSchema = z.object({\n id: z.string().describe(\"ID of the deleted object.\"),\n object: z\n .enum([\n \"document\",\n \"folder\",\n \"link\",\n \"dataroom\",\n \"dataroom_folder\",\n \"dataroom_document\",\n ])\n .describe(\"The type of object that was deleted.\"),\n deleted: z\n .literal(true)\n .describe(\"Always `true`. Confirms the object was deleted.\"),\n});\n\nexport const listDocumentsContract = {\n name: \"list_documents\",\n title: \"List documents\",\n description:\n \"List documents in the authenticated Papermark team. Returns up to `limit` results (default 25, max 100) and a `next_cursor` for pagination. Use this before any tool that takes a `document_id` — never fabricate ids. Requires scope `documents.read`.\",\n inputSchema: {\n limit: z\n .number()\n .int()\n .min(1)\n .max(100)\n .optional()\n .describe(\"Page size (1-100, default 25)\"),\n cursor: z\n .string()\n .optional()\n .describe(\"Opaque cursor from the previous page's `next_cursor`\"),\n query: z\n .string()\n .optional()\n .describe(\n \"Optional substring filter on document name — for richer search use `search_documents`\",\n ),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const getDocumentContract = {\n name: \"get_document\",\n title: \"Get document\",\n description:\n \"Fetch a single document by id. `document_id` must come from `list_documents` or `search_documents` — never invent one. If the user referred to a document by name, call `search_documents` first. Requires scope `documents.read`.\",\n inputSchema: {\n document_id: z.string().min(1).describe(\"Document id (e.g. `doc_abc123`)\"),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const searchDocumentsContract = {\n name: \"search_documents\",\n title: \"Search documents\",\n description:\n \"Substring-search document names in the authenticated team. Use this when the user refers to a document by name or topic rather than id. Requires scope `documents.read`.\",\n inputSchema: {\n query: z\n .string()\n .min(1)\n .describe(\"Search string (matched against document name)\"),\n limit: z\n .number()\n .int()\n .min(1)\n .max(50)\n .optional()\n .describe(\"Max results (default 10)\"),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const createLinkContract = {\n name: \"create_link\",\n title: \"Create share link\",\n description: `Create a share link for a document (or dataroom). The returned \\`url\\` is what users share.\n\nWORKFLOW:\n(1) Resolve the target: the user may say \"the Q3 deck\" or \"the Acme dataroom\" — call \\`search_documents\\` (for a document) or \\`search_datarooms\\` (for a dataroom) first to get a real id. Set exactly one of \\`document_id\\` or \\`dataroom_id\\` on the created link.\n(2) Clarify ANY of these that the user didn't state explicitly — do NOT invent values:\n • expiry (\\`expires_at\\`, ISO 8601) — confirm with the user, default is no expiry\n • password — if the user wants password protection, either ASK them for a password OR generate a random one AND tell the user the exact value you set\n • email gating (\\`email_protected\\`) — ask if unclear\n • downloads (\\`allow_download\\`) — default off for external sharing\n(3) Create the link, then surface both the URL and the security settings so the user can verify.\n\nNever share a link to a document the user didn't explicitly name. Requires scope \\`links.write\\`.`,\n inputSchema: {\n document_id: z\n .string()\n .optional()\n .describe(\"Document id — required unless `dataroom_id` is set\"),\n dataroom_id: z\n .string()\n .optional()\n .describe(\"Dataroom id — alternative to document_id\"),\n name: z.string().optional().describe(\"Human-readable label for the link\"),\n expires_at: z\n .string()\n .datetime()\n .optional()\n .describe(\"ISO 8601 timestamp after which the link stops working\"),\n password: z\n .string()\n .optional()\n .describe(\"Require viewers to enter this password\"),\n email_protected: z\n .boolean()\n .optional()\n .describe(\"Require viewers enter an email address before viewing\"),\n allow_download: z\n .boolean()\n .optional()\n .describe(\"Let viewers download the underlying file\"),\n enable_confidential_view: z\n .boolean()\n .optional()\n .describe(\n \"Enable confidential view: viewer renders only a narrow band of each page at a time (rest is blurred) to prevent capturing the whole document in a single screenshot.\",\n ),\n enable_watermark: z\n .boolean()\n .optional()\n .describe(\n \"Enable dynamic watermarks on every rendered page. Pair with `watermark_config` to control text, position, color, etc.\",\n ),\n watermark_config: watermarkConfigInputSchema\n .optional()\n .describe(\n \"Watermark settings. Only applied when `enable_watermark` is true. Optional even when watermark is enabled — omit to use viewer defaults.\",\n ),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const listLinksContract = {\n name: \"list_links\",\n title: \"List share links\",\n description:\n \"List share links in the authenticated team. Optionally filter by `document_id` or `dataroom_id`. Requires scope `links.read`.\",\n inputSchema: {\n document_id: z\n .string()\n .optional()\n .describe(\"Filter links for a specific document\"),\n dataroom_id: z\n .string()\n .optional()\n .describe(\"Filter links for a specific dataroom\"),\n limit: z.number().int().min(1).max(100).optional().describe(\"Page size\"),\n cursor: z.string().optional().describe(\"Pagination cursor\"),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\n// Raw view events for a link — renamed from get_link_analytics so the\n// aggregate analytics tool can claim that name.\nexport const listLinkViewsContract = {\n name: \"list_link_views\",\n title: \"List a link's view events\",\n description:\n \"Return the raw view events for a share link, newest first. Each view includes viewer email (if captured), view timestamp, and download status. For aggregate metrics (total views, total read time), use `get_link_analytics` instead. Requires scope `analytics.read`.\",\n inputSchema: {\n link_id: z.string().min(1).describe(\"Link id (e.g. `lnk_abc123`)\"),\n limit: z\n .number()\n .int()\n .min(1)\n .max(100)\n .optional()\n .describe(\"Page size (default 25)\"),\n cursor: z.string().optional().describe(\"Pagination cursor\"),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\n// ─── Datarooms ───────────────────────────────────────────────────────────\n\nexport const listDataroomsContract = {\n name: \"list_datarooms\",\n title: \"List datarooms\",\n description:\n \"List datarooms in the authenticated team. Returns up to `limit` results with a cursor. Requires scope `datarooms.read`.\",\n inputSchema: {\n limit: z.number().int().min(1).max(100).optional(),\n cursor: z.string().optional(),\n query: z\n .string()\n .optional()\n .describe(\"Optional substring filter on dataroom name\"),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const searchDataroomsContract = {\n name: \"search_datarooms\",\n title: \"Search datarooms\",\n description:\n \"Substring-search dataroom names in the authenticated team. Use when the user refers to a dataroom by name (e.g. 'the Acme room') rather than id — before calling `create_link`, `get_dataroom_analytics`, or any other tool that takes a `dataroom_id`. Requires scope `datarooms.read`.\",\n inputSchema: {\n query: z\n .string()\n .min(1)\n .describe(\"Search string (matched against dataroom name)\"),\n limit: z\n .number()\n .int()\n .min(1)\n .max(50)\n .optional()\n .describe(\"Max results (default 10)\"),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const getDataroomContract = {\n name: \"get_dataroom\",\n title: \"Get a dataroom\",\n description:\n \"Fetch a single dataroom by its id (accepts either the internal cuid or the `dr_...` public id). Requires scope `datarooms.read`.\",\n inputSchema: {\n dataroom_id: z\n .string()\n .min(1)\n .describe(\"Dataroom id or `dr_...` public id\"),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const createDataroomContract = {\n name: \"create_dataroom\",\n title: \"Create a dataroom\",\n description: `Create a new (empty) dataroom. Documents can be added using the \\`attach_dataroom_document\\` tool after creating the dataroom.\n\nWORKFLOW:\n(1) Confirm with the user: exact dataroom name, optional internal_name, optional description. Do NOT invent these.\n(2) Check \\`list_datarooms\\` first if the user said \"my Acme room\" — they may already have one and not want a duplicate.\n(3) Create the dataroom; return the new dataroom id so the caller can add documents with \\`attach_dataroom_document\\`.\n\nRequires scope \\`datarooms.write\\`.`,\n inputSchema: {\n name: z.string().min(1).describe(\"Human-visible dataroom name\"),\n internal_name: z\n .string()\n .optional()\n .describe(\"Private alias visible only to the team\"),\n description: z.string().optional(),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const listDataroomDocumentsContract = {\n name: \"list_dataroom_documents\",\n title: \"List documents in a dataroom\",\n description:\n \"Return the documents contained in a dataroom, ordered by folder and custom order. Requires scope `datarooms.read`.\",\n inputSchema: {\n dataroom_id: z.string().min(1),\n folder_id: z\n .string()\n .optional()\n .describe(\"Filter to documents inside a specific folder\"),\n limit: z.number().int().min(1).max(100).optional(),\n cursor: z.string().optional(),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\n// ─── Visitors ────────────────────────────────────────────────────────────\n\nexport const listVisitorsContract = {\n name: \"list_visitors\",\n title: \"List visitors\",\n description:\n \"Persistent visitors (Viewer rows) for the team. Use `email` to find a specific person; use `dataroom_id` to scope to visitors of a particular dataroom. For anonymous views that never tied to a Viewer row, use `list_link_views` against the relevant link. Requires scope `visitors.read`.\",\n inputSchema: {\n email: z\n .string()\n .optional()\n .describe(\"Exact email match, case-insensitive\"),\n dataroom_id: z.string().optional(),\n limit: z.number().int().min(1).max(100).optional(),\n cursor: z.string().optional(),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const listVisitorViewsContract = {\n name: \"list_visitor_views\",\n title: \"List a visitor's views\",\n description:\n \"All view events tied to a single visitor, newest first. Useful for answering questions like 'what has jane@acme.com looked at?'. Use `list_visitors` with an email filter to find the visitor id. Requires scope `visitors.read`.\",\n inputSchema: {\n visitor_id: z.string().min(1),\n limit: z.number().int().min(1).max(100).optional(),\n cursor: z.string().optional(),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\n// ─── Analytics (Tinybird-backed, tighter rate limit) ────────────────────\n\nexport const getDocumentAnalyticsContract = {\n name: \"get_document_analytics\",\n title: \"Get document analytics\",\n description:\n \"Aggregate analytics for a document over a time window: total views, unique viewers, total read time (seconds), and per-page average duration. Defaults to the last 30 days. Requires scope `analytics.read`. NOTE: Subject to a tighter rate limit — cache results when possible.\",\n inputSchema: {\n document_id: z.string().min(1),\n since: z\n .number()\n .int()\n .optional()\n .describe(\"Unix milliseconds — start of window (default: 30 days ago)\"),\n until: z\n .number()\n .int()\n .optional()\n .describe(\"Unix milliseconds — end of window (default: now)\"),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const getLinkAnalyticsContract = {\n name: \"get_link_analytics\",\n title: \"Get link analytics\",\n description:\n \"Aggregate analytics for a single share link: total views, unique viewers, total read time over the selected window. For the raw event list (one row per view), use `list_link_views`. Requires scope `analytics.read`.\",\n inputSchema: {\n link_id: z.string().min(1),\n since: z.number().int().optional(),\n until: z.number().int().optional(),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const getDataroomAnalyticsContract = {\n name: \"get_dataroom_analytics\",\n title: \"Get dataroom analytics\",\n description:\n \"Aggregate analytics across all documents in a dataroom: total views, unique viewers, total read time. Defaults to the last 30 days. Requires scope `analytics.read`.\",\n inputSchema: {\n dataroom_id: z.string().min(1),\n since: z.number().int().optional(),\n until: z.number().int().optional(),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const getViewAnalyticsContract = {\n name: \"get_view_analytics\",\n title: \"Get per-view breakdown\",\n description:\n \"For a single view event: page-by-page time spent, total duration, and the viewer's country/city/browser/os/device. Use `list_link_views` or `list_visitor_views` to discover view ids. Requires scope `analytics.read`.\",\n inputSchema: {\n view_id: z.string().min(1),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\n// ─── Folder enums (shared between team and dataroom folder contracts) ───\nconst FolderIconEnum = z.enum([\n \"folder\",\n \"folder-open\",\n \"briefcase\",\n \"archive\",\n \"box\",\n \"file\",\n \"book\",\n \"bookmark\",\n \"star\",\n \"heart\",\n \"lock\",\n \"shield\",\n \"users\",\n \"settings\",\n \"tag\",\n \"layers\",\n \"globe\",\n \"home\",\n \"mail\",\n \"image\",\n \"video\",\n \"music\",\n \"palette\",\n \"pen-tool\",\n \"lightbulb\",\n \"zap\",\n \"wrench\",\n \"sparkles\",\n \"cloud\",\n \"flag\",\n \"award\",\n \"flame\",\n \"bell\",\n \"sun\",\n \"hash\",\n]);\n\nconst FolderColorEnum = z.enum([\n \"gray\",\n \"red\",\n \"orange\",\n \"yellow\",\n \"green\",\n \"blue\",\n \"black\",\n]);\n\n// ─── Document mutations ─────────────────────────────────────────────────\n\nexport const updateDocumentContract = {\n name: \"update_document\",\n title: \"Update a document\",\n description: `Rename a document or move it to a different team-library folder. Replacing the file content is a separate operation — use \\`add_document_version\\`.\n\nWORKFLOW:\n(1) Resolve the document via \\`search_documents\\` or \\`list_documents\\` — never invent ids.\n(2) Confirm with the user what they want to change. Pass \\`folder_id: null\\` to move the document back to the library root. Pass a real folder id (resolved via \\`list_folders\\`) to relocate it.\n\nRequires scope \\`documents.write\\`.`,\n inputSchema: {\n document_id: z.string().min(1),\n name: z.string().min(1).max(512).optional(),\n folder_id: z\n .string()\n .nullable()\n .optional()\n .describe(\n \"Target folder id, or null to move to the library root. Omit to leave the folder unchanged.\",\n ),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const deleteDocumentContract = {\n name: \"delete_document\",\n title: \"Delete a document\",\n description: `Permanently delete a document. This is irreversible: every share link, version, and view history attached to the document goes with it.\n\nWORKFLOW:\n(1) Resolve the document via \\`search_documents\\` — never delete based on a guessed id.\n(2) Confirm with the user (echo the document name) before calling. Treat this like \\`rm -rf\\`: don't infer intent from passing references.\n\nRequires scope \\`documents.write\\`.`,\n inputSchema: {\n document_id: z.string().min(1),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\n// ─── Document versions ──────────────────────────────────────────────────\n\nexport const listDocumentVersionsContract = {\n name: \"list_document_versions\",\n title: \"List document versions\",\n description:\n \"List every version of a document, primary first. Use this to find a version id before promoting an older one with `promote_document_version`. Requires scope `documents.read`.\",\n inputSchema: {\n document_id: z.string().min(1),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const getDocumentVersionContract = {\n name: \"get_document_version\",\n title: \"Get a document version\",\n description:\n \"Fetch a single version of a document by its id. Requires scope `documents.read`.\",\n inputSchema: {\n document_id: z.string().min(1),\n version_id: z.string().min(1),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const addDocumentVersionContract = {\n name: \"add_document_version\",\n title: \"Add a new document version\",\n description: `Add a new version of an existing document. The new version becomes primary by default; live links automatically serve it.\n\nFor a file document, pass \\`source_url\\` — a public HTTPS URL the server fetches as the new file. For a \\`link\\`/\\`notion\\` document, pass \\`external_url\\` to repoint it at a new URL (its type is preserved; the URL is stored as-is, not downloaded). Provide exactly one.\n\nWORKFLOW:\n(1) Resolve the target document via \\`search_documents\\` or \\`list_documents\\`.\n(2) The user must give you the URL — don't fabricate one.\n(3) After creation, mention the version_number so the user can promote/rollback later.\n\nNOTE: Adding a version from a local file path is not supported by this MCP tool — for that, use the \\`upload_document\\` tool to create a new document, or have the user upload via the Papermark UI.\n\nRequires scope \\`documents.write\\`.`,\n inputSchema: {\n document_id: z.string().min(1),\n source_url: z\n .string()\n .url()\n .refine((s) => s.startsWith(\"https://\"), {\n message: \"source_url must use https://\",\n })\n .optional()\n .describe(\n \"Public HTTPS URL the server fetches as the new version (file documents only)\",\n ),\n external_url: z\n .string()\n .url()\n .refine((s) => s.startsWith(\"https://\"), {\n message: \"external_url must use https://\",\n })\n .optional()\n .describe(\n \"New target URL for a link/notion document, stored as-is (not downloaded). The document's type is preserved.\",\n ),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const promoteDocumentVersionContract = {\n name: \"promote_document_version\",\n title: \"Promote a version to primary\",\n description: `Roll back (or roll forward) by making a non-primary version the active one. The previous primary is demoted in the same transaction; share links immediately serve the new primary.\n\nWORKFLOW:\n(1) Call \\`list_document_versions\\` to find the right version id.\n(2) Confirm with the user before promoting — this changes what every existing link serves.\n\nRequires scope \\`documents.write\\`.`,\n inputSchema: {\n document_id: z.string().min(1),\n version_id: z.string().min(1),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\n// ─── Folders (team library) ─────────────────────────────────────────────\n\nexport const listFoldersContract = {\n name: \"list_folders\",\n title: \"List folders\",\n description: `List folders in the team library. Pass \\`parent_id: \"root\"\\` to list top-level folders, a folder id to list direct children, or omit \\`parent_id\\` to list every folder.\n\nUSE THIS when the user wants to know which folders exist, or you need a \\`folder_id\\` to pass to \\`update_document\\` / \\`upload_document\\` / \\`create_folder\\`. Requires scope \\`documents.read\\`.`,\n inputSchema: {\n parent_id: z\n .string()\n .optional()\n .describe(\n \"Restrict to direct children of this folder. Use 'root' for top-level folders. Omit for all folders.\",\n ),\n limit: z.number().int().min(1).max(100).optional(),\n cursor: z.string().optional(),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const getFolderContract = {\n name: \"get_folder\",\n title: \"Get a folder\",\n description:\n \"Fetch a single team-library folder by id. Requires scope `documents.read`.\",\n inputSchema: {\n folder_id: z.string().min(1),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const createFolderContract = {\n name: \"create_folder\",\n title: \"Create a folder\",\n description: `Create a folder in the team library. Pass an existing folder id as \\`parent_id\\` to nest, or omit it for the root.\n\nWORKFLOW:\n(1) Confirm name and parent with the user. Don't invent folder names.\n(2) If they referred to \"the Pitches folder\" but didn't give an id, call \\`list_folders\\` first.\n\nRequires scope \\`documents.write\\`.`,\n inputSchema: {\n name: z.string().min(1).max(256),\n parent_id: z\n .string()\n .nullable()\n .optional()\n .describe(\n \"Parent folder id; omit or pass null for the team-library root\",\n ),\n icon: FolderIconEnum.optional(),\n color: FolderColorEnum.optional(),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const updateFolderContract = {\n name: \"update_folder\",\n title: \"Update a folder\",\n description:\n \"Rename a folder, change its icon or color. Pass null to clear icon/color. Use `move_folder` to change its parent. Requires scope `documents.write`.\",\n inputSchema: {\n folder_id: z.string().min(1),\n name: z.string().min(1).max(256).optional(),\n icon: FolderIconEnum.nullable().optional(),\n color: FolderColorEnum.nullable().optional(),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const deleteFolderContract = {\n name: \"delete_folder\",\n title: \"Delete a folder\",\n description: `Delete a folder. By default this only succeeds if the folder is empty. Pass \\`cascade: true\\` to also delete every nested folder and document — this is destructive and irreversible.\n\nAlways confirm with the user before passing cascade. Requires scope \\`documents.write\\`.`,\n inputSchema: {\n folder_id: z.string().min(1),\n cascade: z\n .boolean()\n .optional()\n .describe(\n \"When true, deletes the folder and every nested folder + document. Defaults to false.\",\n ),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const moveFolderContract = {\n name: \"move_folder\",\n title: \"Move a folder\",\n description:\n \"Move a folder under a different parent. Pass `parent_id: null` to move it to the library root. Requires scope `documents.write`.\",\n inputSchema: {\n folder_id: z.string().min(1),\n parent_id: z\n .string()\n .nullable()\n .describe(\"Target parent folder id, or null for the library root\"),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\n// ─── Link mutations ─────────────────────────────────────────────────────\n\nexport const getLinkContract = {\n name: \"get_link\",\n title: \"Get a share link\",\n description:\n \"Fetch a single share link by id. Use this to confirm current settings before calling `update_link` so you don't accidentally clobber other fields. Requires scope `links.read`.\",\n inputSchema: {\n link_id: z.string().min(1),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const updateLinkContract = {\n name: \"update_link\",\n title: \"Update a share link\",\n description: `Change the security settings of an existing share link. The URL stays the same — viewers don't need to be re-notified.\n\nWORKFLOW:\n(1) Get the current settings via \\`get_link\\` first if you're not certain. PATCH semantics: omitted fields are unchanged, but a passed value REPLACES the current one.\n(2) Pass \\`expires_at: null\\` or \\`password: null\\` to clear those fields. \\`allow_list: []\\` empties the list.\n(3) Confirm any change to password / expiry / email gating with the user.\n\nRequires scope \\`links.write\\`.`,\n inputSchema: {\n link_id: z.string().min(1),\n name: z.string().optional(),\n expires_at: z\n .string()\n .datetime()\n .nullable()\n .optional()\n .describe(\"ISO 8601 timestamp, or null to clear the expiry\"),\n password: z\n .string()\n .min(1)\n .nullable()\n .optional()\n .describe(\"New password, or null to remove password protection\"),\n email_protected: z.boolean().optional(),\n email_authenticated: z.boolean().optional(),\n allow_download: z.boolean().optional(),\n allow_list: z\n .array(z.string())\n .optional()\n .describe(\"Email or domain allow list (e.g. ['@acme.com', 'bob@x.com'])\"),\n deny_list: z.array(z.string()).optional(),\n enable_watermark: z.boolean().optional(),\n watermark_config: watermarkConfigInputSchema\n .nullable()\n .optional()\n .describe(\n \"Watermark settings. Pass an object to replace the existing config, or `null` to clear it. Omit to leave unchanged.\",\n ),\n enable_screenshot_protection: z.boolean().optional(),\n enable_confidential_view: z.boolean().optional(),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const deleteLinkContract = {\n name: \"delete_link\",\n title: \"Revoke a share link\",\n description: `Revoke a share link (soft delete). Anyone who tries to open the URL will see a \"link unavailable\" page. The view history is preserved for analytics.\n\nConfirm with the user before revoking — they may have already shared the URL. Requires scope \\`links.write\\`.`,\n inputSchema: {\n link_id: z.string().min(1),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\n// ─── Dataroom mutations ─────────────────────────────────────────────────\n\nexport const updateDataroomContract = {\n name: \"update_dataroom\",\n title: \"Update a dataroom\",\n description: `Change a dataroom's name, internal alias, description, or whether viewers can bulk-download. PATCH semantics — omitted fields stay as they are.\n\nWORKFLOW:\n(1) Resolve the dataroom via \\`search_datarooms\\` or \\`list_datarooms\\`.\n(2) Confirm any toggle of \\`allow_bulk_download\\` with the user — it affects every link tied to this dataroom.\n\nRequires scope \\`datarooms.write\\`.`,\n inputSchema: {\n dataroom_id: z.string().min(1),\n name: z.string().min(1).optional(),\n internal_name: z.string().nullable().optional(),\n description: z.string().nullable().optional(),\n allow_bulk_download: z.boolean().optional(),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const deleteDataroomContract = {\n name: \"delete_dataroom\",\n title: \"Delete a dataroom\",\n description: `Permanently delete a dataroom. Every link and folder attached to it goes with it. Documents themselves stay in the team library — only their attachments to this dataroom are removed.\n\nALWAYS confirm with the user (echo the dataroom name and how many documents it contains, via \\`get_dataroom\\`) before calling. This is irreversible. Requires scope \\`datarooms.write\\`.`,\n inputSchema: {\n dataroom_id: z.string().min(1),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const attachDataroomDocumentContract = {\n name: \"attach_dataroom_document\",\n title: \"Attach a document to a dataroom\",\n description: `Add an existing team-library document to a dataroom. The document stays in the library; this only creates the attachment.\n\nWORKFLOW:\n(1) Resolve both ids — the dataroom via \\`search_datarooms\\`, the document via \\`search_documents\\`.\n(2) Optionally pass a dataroom \\`folder_id\\` (created via \\`create_dataroom_folder\\`) to nest the attachment under a folder.\n\nRequires scope \\`datarooms.write\\`.`,\n inputSchema: {\n dataroom_id: z.string().min(1),\n document_id: z.string().min(1),\n folder_id: z\n .string()\n .optional()\n .describe(\n \"Optional dataroom-folder id to place the attachment under. Folder must belong to this dataroom.\",\n ),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const detachDataroomDocumentContract = {\n name: \"detach_dataroom_document\",\n title: \"Detach a document from a dataroom\",\n description: `Remove a single document's attachment to a dataroom, identified by its dataroom-document id — the \\`id\\` returned by \\`attach_dataroom_document\\` or \\`list_dataroom_documents\\`, NOT the underlying \\`document_id\\`. The document stays in the team library and remains attached to any other datarooms; only this one attachment is removed.\n\nPrefer this over deleting and recreating a folder when you only need to remove one file. Requires scope \\`datarooms.write\\`.`,\n inputSchema: {\n dataroom_id: z.string().min(1),\n dataroom_document_id: z.string().min(1),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const moveDataroomDocumentContract = {\n name: \"move_dataroom_document\",\n title: \"Move a document within a dataroom\",\n description: `Move a dataroom document into a different folder of the same dataroom. Identify it by its dataroom-document id — the \\`id\\` from \\`attach_dataroom_document\\` or \\`list_dataroom_documents\\`, NOT the underlying \\`document_id\\`. Pass \\`folder_id: null\\` to move it to the dataroom root. The target folder must belong to this dataroom. Requires scope \\`datarooms.write\\`.`,\n inputSchema: {\n dataroom_id: z.string().min(1),\n dataroom_document_id: z.string().min(1),\n folder_id: z\n .string()\n .nullable()\n .describe(\n \"Target dataroom-folder id to move the document into, or null for the dataroom root.\",\n ),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\n// ─── Dataroom folders ───────────────────────────────────────────────────\n\nexport const listDataroomFoldersContract = {\n name: \"list_dataroom_folders\",\n title: \"List folders in a dataroom\",\n description: `List folders inside a dataroom. Pass \\`parent_id: \"root\"\\` for top-level, a folder id for direct children, or omit for every folder in the dataroom.\n\nUSE THIS when you need a dataroom \\`folder_id\\` for \\`attach_dataroom_document\\` or \\`create_dataroom_folder\\`. Requires scope \\`datarooms.read\\`.`,\n inputSchema: {\n dataroom_id: z.string().min(1),\n parent_id: z.string().optional(),\n limit: z.number().int().min(1).max(100).optional(),\n cursor: z.string().optional(),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const getDataroomFolderContract = {\n name: \"get_dataroom_folder\",\n title: \"Get a dataroom folder\",\n description:\n \"Fetch a single dataroom folder. Requires scope `datarooms.read`.\",\n inputSchema: {\n dataroom_id: z.string().min(1),\n folder_id: z.string().min(1),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const createDataroomFolderContract = {\n name: \"create_dataroom_folder\",\n title: \"Create a folder in a dataroom\",\n description:\n \"Create a folder inside a dataroom. Pass an existing dataroom-folder id as `parent_id` to nest, omit for the dataroom root. Folders here are scoped to a single dataroom and are separate from team-library folders. Requires scope `datarooms.write`.\",\n inputSchema: {\n dataroom_id: z.string().min(1),\n name: z.string().min(1).max(256),\n parent_id: z.string().nullable().optional(),\n icon: FolderIconEnum.optional(),\n color: FolderColorEnum.optional(),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const updateDataroomFolderContract = {\n name: \"update_dataroom_folder\",\n title: \"Update a dataroom folder\",\n description:\n \"Rename a dataroom folder, change its icon/color. Pass null to clear icon/color. Use `move_dataroom_folder` to change its parent. Requires scope `datarooms.write`.\",\n inputSchema: {\n dataroom_id: z.string().min(1),\n folder_id: z.string().min(1),\n name: z.string().min(1).max(256).optional(),\n icon: FolderIconEnum.nullable().optional(),\n color: FolderColorEnum.nullable().optional(),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const deleteDataroomFolderContract = {\n name: \"delete_dataroom_folder\",\n title: \"Delete a dataroom folder\",\n description: `Delete a dataroom folder. By default this only succeeds if the folder is empty. Pass \\`cascade: true\\` to also delete every nested folder + dataroom-document attachment beneath it. The underlying documents in the team library are NOT deleted — only their attachments to this dataroom.\n\nConfirm with the user before passing cascade. Requires scope \\`datarooms.write\\`.`,\n inputSchema: {\n dataroom_id: z.string().min(1),\n folder_id: z.string().min(1),\n cascade: z.boolean().optional(),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const moveDataroomFolderContract = {\n name: \"move_dataroom_folder\",\n title: \"Move a dataroom folder\",\n description:\n \"Move a folder under a different parent within the same dataroom. Pass `parent_id: null` to move to the dataroom root. Requires scope `datarooms.write`.\",\n inputSchema: {\n dataroom_id: z.string().min(1),\n folder_id: z.string().min(1),\n parent_id: z.string().nullable(),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\n// ─── Visitors ───────────────────────────────────────────────────────────\n\nexport const getVisitorContract = {\n name: \"get_visitor\",\n title: \"Get a visitor\",\n description:\n \"Fetch a single visitor (Viewer row) by id, including total view count and last-seen timestamp. Use `list_visitors` with an email filter to find the id. Requires scope `visitors.read`.\",\n inputSchema: {\n visitor_id: z.string().min(1),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const SHARED_TOOL_OUTPUT_SCHEMAS = {\n [listDocumentsContract.name]: documentsListOutputSchema,\n [getDocumentContract.name]: documentObjectOutputSchema,\n [searchDocumentsContract.name]: documentsListOutputSchema,\n [createLinkContract.name]: linkOutputSchema,\n [listLinksContract.name]: linksListOutputSchema,\n [listLinkViewsContract.name]: viewsListOutputSchema,\n [listDataroomsContract.name]: dataroomsListOutputSchema,\n [searchDataroomsContract.name]: dataroomsListOutputSchema,\n [getDataroomContract.name]: dataroomObjectOutputSchema,\n [createDataroomContract.name]: dataroomOutputSchema,\n [listDataroomDocumentsContract.name]: dataroomDocumentsListOutputSchema,\n [listVisitorsContract.name]: visitorsListOutputSchema,\n [listVisitorViewsContract.name]: visitorViewsListOutputSchema,\n [getDocumentAnalyticsContract.name]: documentAnalyticsOutputSchema,\n [getLinkAnalyticsContract.name]: linkAnalyticsOutputSchema,\n [getDataroomAnalyticsContract.name]: dataroomAnalyticsOutputSchema,\n [getViewAnalyticsContract.name]: viewAnalyticsOutputSchema,\n [updateDocumentContract.name]: documentOutputSchema,\n [deleteDocumentContract.name]: deletedObjectOutputSchema,\n [listDocumentVersionsContract.name]: versionsListOutputSchema,\n [getDocumentVersionContract.name]: documentVersionObjectOutputSchema,\n [addDocumentVersionContract.name]: versionOutputSchema,\n [promoteDocumentVersionContract.name]: versionOutputSchema,\n [listFoldersContract.name]: foldersListOutputSchema,\n [getFolderContract.name]: folderObjectOutputSchema,\n [createFolderContract.name]: folderOutputSchema,\n [updateFolderContract.name]: folderOutputSchema,\n [deleteFolderContract.name]: deletedObjectOutputSchema,\n [moveFolderContract.name]: folderOutputSchema,\n [getLinkContract.name]: linkOutputSchema,\n [updateLinkContract.name]: linkOutputSchema,\n [deleteLinkContract.name]: deletedObjectOutputSchema,\n [updateDataroomContract.name]: dataroomOutputSchema,\n [deleteDataroomContract.name]: deletedObjectOutputSchema,\n [attachDataroomDocumentContract.name]: dataroomItemOutputSchema,\n [detachDataroomDocumentContract.name]: deletedObjectOutputSchema,\n [moveDataroomDocumentContract.name]: dataroomItemOutputSchema,\n [listDataroomFoldersContract.name]: foldersListOutputSchema,\n [getDataroomFolderContract.name]: folderObjectOutputSchema,\n [createDataroomFolderContract.name]: folderOutputSchema,\n [updateDataroomFolderContract.name]: folderOutputSchema,\n [deleteDataroomFolderContract.name]: deletedObjectOutputSchema,\n [moveDataroomFolderContract.name]: folderOutputSchema,\n [getVisitorContract.name]: visitorObjectOutputSchema,\n} as const satisfies Record<string, unknown>;\n"],"mappings":";;;AAAA,SAAS,SAAS;AAyBX,IAAM,wBAAwB,EAAE,OAAO,CAAC,CAAC,EAAE,YAAY;AAI9D,IAAM,wBAAwB,EAAE,KAAK;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAM,wBAAwB,EAAE,MAAM;AAAA,EACpC,EAAE,QAAQ,CAAC;AAAA,EACX,EAAE,QAAQ,EAAE;AAAA,EACZ,EAAE,QAAQ,EAAE;AAAA,EACZ,EAAE,QAAQ,EAAE;AAAA,EACZ,EAAE,QAAQ,GAAG;AACf,CAAC;AACM,IAAM,6BAA6B,EACvC,OAAO;AAAA,EACN,MAAM,EACH,OAAO,EACP,IAAI,CAAC,EACL;AAAA,IACC;AAAA,EACF;AAAA,EACF,UAAU,EACP,QAAQ,EACR;AAAA,IACC;AAAA,EACF;AAAA,EACF,UAAU,sBAAsB;AAAA,IAC9B;AAAA,EACF;AAAA,EACA,UAAU,sBAAsB;AAAA,IAC9B;AAAA,EACF;AAAA,EACA,OAAO,EACJ,OAAO,EACP,MAAM,4BAA4B,gCAAgC,EAClE,SAAS,oCAAoC;AAAA,EAChD,WAAW,EACR,OAAO,EACP,IAAI,EACJ,IAAI,CAAC,EACL,IAAI,EAAE,EACN,SAAS,6BAA6B;AAAA,EACzC,SAAS,EACN,OAAO,EACP,IAAI,CAAC,EACL,IAAI,CAAC,EACL,SAAS,iDAAiD;AAC/D,CAAC,EACA,SAAS,kEAAkE;AAC9E,IAAM,8BAA8B,EACjC,OAAO;AAAA,EACN,MAAM,EAAE,OAAO;AAAA,EACf,UAAU,EAAE,QAAQ;AAAA,EACpB,UAAU;AAAA,EACV,UAAU;AAAA,EACV,OAAO,EAAE,OAAO;AAAA,EAChB,WAAW,EAAE,OAAO,EAAE,IAAI;AAAA,EAC1B,SAAS,EAAE,OAAO;AACpB,CAAC,EACA,SAAS,EACT;AAAA,EACC;AACF;AAEF,IAAM,uBAAuB,CAAC,gBAC5B,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,WAAW;AAC5C,IAAM,+BAA+B,CAAC,gBACpC,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,WAAW;AACvD,IAAM,6BAA6B,CAAC,gBAClC,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,WAAW;AAC5C,IAAM,sBAAsB,CAAC,gBAC3B,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,WAAW;AACvC,IAAM,8BAA8B,CAAC,gBACnC,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,WAAW;AAClD,IAAM,qBAAqB,EACxB,OAAO,EACP,SAAS,EACT;AAAA,EACC;AACF;AAEK,IAAM,6BAA6B,EACvC,OAAO;AAAA,EACN,IAAI,EAAE,OAAO,EAAE,SAAS,+BAA+B;AAAA,EACvD,QAAQ,EACL,QAAQ,UAAU,EAClB,SAAS,2DAA2D;AAAA,EACvE,MAAM,EAAE,OAAO,EAAE,SAAS,qBAAqB;AAAA,EAC/C,MAAM;AAAA,IACJ;AAAA,EACF;AAAA,EACA,cAAc;AAAA,IACZ;AAAA,EACF;AAAA,EACA,KAAK;AAAA,IACH;AAAA,EACF;AAAA,EACA,WAAW;AAAA,IACT;AAAA,EACF;AAAA,EACA,WAAW;AAAA,IACT;AAAA,EACF;AAAA,EACA,SAAS,qBAAqB,gCAAgC;AAAA,EAC9D,YAAY,qBAAqB,qCAAqC;AACxE,CAAC,EACA,YAAY,EACZ,SAAS,4BAA4B;AAEjC,IAAM,yBAAyB,EACnC,OAAO;AAAA,EACN,IAAI,EAAE,OAAO,EAAE,SAAS,iCAAiC;AAAA,EACzD,QAAQ,EACL,QAAQ,MAAM,EACd,SAAS,uDAAuD;AAAA,EACnE,MAAM;AAAA,IACJ;AAAA,EACF;AAAA,EACA,aAAa,EACV,KAAK,CAAC,YAAY,UAAU,CAAC,EAC7B;AAAA,IACC;AAAA,EACF;AAAA,EACF,aAAa;AAAA,IACX;AAAA,EACF;AAAA,EACA,aAAa;AAAA,IACX;AAAA,EACF;AAAA,EACA,KAAK,EAAE,OAAO,EAAE,SAAS,oCAAoC;AAAA,EAC7D,QAAQ;AAAA,IACN;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV;AAAA,EACF;AAAA,EACA,uBAAuB,EACpB,QAAQ,EACR;AAAA,IACC;AAAA,EACF;AAAA,EACF,iBAAiB,EACd,QAAQ,EACR,SAAS,gDAAgD;AAAA,EAC5D,qBAAqB,EAClB,QAAQ,EACR,SAAS,uDAAuD;AAAA,EACnE,gBAAgB,EACb,QAAQ,EACR,SAAS,kDAAkD;AAAA,EAC9D,YAAY,EACT,MAAM,EAAE,OAAO,CAAC,EAChB;AAAA,IACC;AAAA,EACF;AAAA,EACF,WAAW,EACR,MAAM,EAAE,OAAO,CAAC,EAChB,SAAS,mCAAmC;AAAA,EAC/C,kBAAkB,EAAE,QAAQ,EAAE,SAAS,kCAAkC;AAAA,EACzE,kBAAkB;AAAA,EAClB,iBAAiB,EACd,QAAQ,EACR,SAAS,qCAAqC;AAAA,EACjD,8BAA8B,EAC3B,QAAQ,EACR,SAAS,2CAA2C;AAAA,EACvD,0BAA0B,EACvB,QAAQ,EACR;AAAA,IACC;AAAA,EACF;AAAA,EACF,SAAS,qBAAqB,4BAA4B;AAAA,EAC1D,YAAY,qBAAqB,iCAAiC;AACpE,CAAC,EACA,YAAY,EACZ,SAAS,8BAA8B;AAEnC,IAAM,6BAA6B,EACvC,OAAO;AAAA,EACN,IAAI,EAAE,OAAO,EAAE,SAAS,+BAA+B;AAAA,EACvD,QAAQ,EACL,QAAQ,UAAU,EAClB,SAAS,2DAA2D;AAAA,EACvE,KAAK,EACF,OAAO,EACP;AAAA,IACC;AAAA,EACF;AAAA,EACF,MAAM,EAAE,OAAO,EAAE,SAAS,8BAA8B;AAAA,EACxD,eAAe;AAAA,IACb;AAAA,EACF;AAAA,EACA,aAAa;AAAA,IACX;AAAA,EACF;AAAA,EACA,gBAAgB,oBAAoB,sCAAsC;AAAA,EAC1E,cAAc,oBAAoB,oCAAoC;AAAA,EACtE,uBAAuB,EACpB,QAAQ,EACR,SAAS,oCAAoC;AAAA,EAChD,gBAAgB,EAAE,QAAQ,EAAE,SAAS,gCAAgC;AAAA,EACrE,qBAAqB,EAClB,QAAQ,EACR,SAAS,sDAAsD;AAAA,EAClE,WAAW,EAAE,QAAQ,EAAE,SAAS,iCAAiC;AAAA,EACjE,SAAS,qBAAqB,gCAAgC;AAAA,EAC9D,YAAY,qBAAqB,qCAAqC;AACxE,CAAC,EACA,YAAY,EACZ,SAAS,4BAA4B;AAEjC,IAAM,2BAA2B,EACrC,OAAO;AAAA,EACN,IAAI,EAAE,OAAO,EAAE,SAAS,6BAA6B;AAAA,EACrD,QAAQ,EACL,KAAK,CAAC,UAAU,iBAAiB,CAAC,EAClC;AAAA,IACC;AAAA,EACF;AAAA,EACF,MAAM,EAAE,OAAO,EAAE,SAAS,cAAc;AAAA,EACxC,WAAW;AAAA,IACT;AAAA,EACF;AAAA,EACA,MAAM,EACH,OAAO,EACP;AAAA,IACC;AAAA,EACF;AAAA,EACF,MAAM,2BAA2B,qCAAqC;AAAA,EACtE,OAAO,2BAA2B,sCAAsC;AAAA,EACxE,gBAAgB,oBAAoB,mCAAmC;AAAA,EACvE,oBAAoB,oBAAoB,iCAAiC;AAAA,EACzE,aAAa;AAAA,IACX;AAAA,EACF,EAAE,SAAS;AAAA,EACX,SAAS,qBAAqB,8BAA8B;AAAA,EAC5D,YAAY,qBAAqB,mCAAmC;AACtE,CAAC,EACA,YAAY,EACZ,SAAS,0BAA0B;AAE/B,IAAM,oCAAoC,EAC9C,OAAO;AAAA,EACN,IAAI,EAAE,OAAO,EAAE,SAAS,uCAAuC;AAAA,EAC/D,QAAQ,EACL,QAAQ,kBAAkB,EAC1B;AAAA,IACC;AAAA,EACF;AAAA,EACF,gBAAgB,oBAAoB,4BAA4B;AAAA,EAChE,YAAY,EACT,QAAQ,EACR,SAAS,6CAA6C;AAAA,EACzD,MAAM,2BAA2B,yCAAyC;AAAA,EAC1E,cAAc,2BAA2B,iCAAiC;AAAA,EAC1E,WAAW,4BAA4B,8BAA8B;AAAA,EACrE,WAAW,4BAA4B,iCAAiC;AAAA,EACxE,SAAS,qBAAqB,+BAA+B;AAAA,EAC7D,YAAY,qBAAqB,oCAAoC;AACvE,CAAC,EACA,YAAY,EACZ,SAAS,oCAAoC;AAEzC,IAAM,iCAAiC,EAC3C,OAAO;AAAA,EACN,IAAI,EACD,OAAO,EACP;AAAA,IACC;AAAA,EACF;AAAA,EACF,QAAQ,EACL,QAAQ,mBAAmB,EAC3B;AAAA,IACC;AAAA,EACF;AAAA,EACF,aAAa,EAAE,OAAO,EAAE,SAAS,yBAAyB;AAAA,EAC1D,eAAe,EAAE,OAAO,EAAE,SAAS,2BAA2B;AAAA,EAC9D,cAAc,2BAA2B,iCAAiC;AAAA,EAC1E,WAAW,4BAA4B,8BAA8B;AAAA,EACrE,WAAW;AAAA,IACT;AAAA,EACF;AAAA,EACA,aAAa;AAAA,IACX;AAAA,EACF;AAAA,EACA,aAAa;AAAA,IACX;AAAA,EACF;AAAA,EACA,SAAS,qBAAqB,iCAAiC;AACjE,CAAC,EACA,YAAY,EACZ,SAAS,gDAAgD;AAErD,IAAM,yBAAyB,EACnC,OAAO;AAAA,EACN,IAAI,EAAE,OAAO,EAAE,SAAS,iCAAiC;AAAA,EACzD,QAAQ,EACL,QAAQ,MAAM,EACd,SAAS,uDAAuD;AAAA,EACnE,SAAS,2BAA2B,mCAAmC;AAAA,EACvE,aAAa;AAAA,IACX;AAAA,EACF;AAAA,EACA,aAAa;AAAA,IACX;AAAA,EACF;AAAA,EACA,cAAc,2BAA2B,8BAA8B;AAAA,EACvE,WAAW,2BAA2B,kBAAkB;AAAA,EACxD,WAAW,qBAAqB,yBAAyB;AAAA,EACzD,eAAe;AAAA,IACb;AAAA,EACF;AAAA,EACA,eAAe,2BAA2B,gCAAgC;AAC5E,CAAC,EACA,YAAY,EACZ,SAAS,8BAA8B;AAEnC,IAAM,4BAA4B,EACtC,OAAO;AAAA,EACN,IAAI,EAAE,OAAO,EAAE,SAAS,8BAA8B;AAAA,EACtD,QAAQ,EACL,QAAQ,SAAS,EACjB,SAAS,0DAA0D;AAAA,EACtE,OAAO,EAAE,OAAO,EAAE,SAAS,wBAAwB;AAAA,EACnD,UAAU,EAAE,QAAQ,EAAE,SAAS,kCAAkC;AAAA,EACjE,aAAa;AAAA,IACX;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV;AAAA,EACF;AAAA,EACA,aAAa,oBAAoB,wCAAwC;AAAA,EACzE,gBAAgB;AAAA,IACd;AAAA,EACF;AAAA,EACA,SAAS,qBAAqB,+BAA+B;AAAA,EAC7D,YAAY,qBAAqB,oCAAoC;AACvE,CAAC,EACA,YAAY,EACZ,SAAS,2BAA2B;AAEhC,IAAM,gCAAgC,EAC1C,OAAO;AAAA,EACN,IAAI,EAAE,OAAO,EAAE,SAAS,yCAAyC;AAAA,EACjE,QAAQ,EACL,QAAQ,cAAc,EACtB;AAAA,IACC;AAAA,EACF;AAAA,EACF,SAAS,EAAE,OAAO,EAAE,SAAS,6BAA6B;AAAA,EAC1D,aAAa;AAAA,IACX;AAAA,EACF;AAAA,EACA,aAAa;AAAA,IACX;AAAA,EACF;AAAA,EACA,WAAW,EAAE,OAAO,EAAE,SAAS,kBAAkB;AAAA,EACjD,WAAW,qBAAqB,yBAAyB;AAAA,EACzD,eAAe;AAAA,IACb;AAAA,EACF;AAAA,EACA,aAAa,EAAE,QAAQ,EAAE,SAAS,gCAAgC;AACpE,CAAC,EACA,YAAY,EACZ,SAAS,sCAAsC;AAE3C,IAAM,gCAAgC,EAC1C,OAAO;AAAA,EACN,aAAa,EAAE,OAAO,EAAE,SAAS,uCAAuC;AAAA,EACxE,aAAa,oBAAoB,iCAAiC;AAAA,EAClE,gBAAgB,oBAAoB,oCAAoC;AAAA,EACxE,wBAAwB,EACrB,OAAO,EACP,SAAS,iCAAiC;AAAA,EAC7C,2BAA2B,EACxB;AAAA,IACC,EAAE,OAAO;AAAA,MACP,aAAa,oBAAoB,0BAA0B;AAAA,MAC3D,sBAAsB,EACnB,OAAO,EACP,SAAS,2CAA2C;AAAA,IACzD,CAAC;AAAA,EACH,EACC,SAAS,4BAA4B;AAAA,EACxC,OAAO,qBAAqB,gCAAgC;AAAA,EAC5D,OAAO,qBAAqB,8BAA8B;AAC5D,CAAC,EACA,YAAY,EACZ,SAAS,6BAA6B;AAElC,IAAM,4BAA4B,EACtC,OAAO;AAAA,EACN,SAAS,EAAE,OAAO,EAAE,SAAS,yCAAyC;AAAA,EACtE,aAAa,oBAAoB,iCAAiC;AAAA,EAClE,wBAAwB,EACrB,OAAO,EACP,SAAS,iCAAiC;AAAA,EAC7C,gBAAgB,oBAAoB,oCAAoC;AAAA,EACxE,OAAO,qBAAqB,gCAAgC;AAAA,EAC5D,OAAO,qBAAqB,8BAA8B;AAC5D,CAAC,EACA,YAAY,EACZ,SAAS,yBAAyB;AAE9B,IAAM,gCAAgC,EAC1C,OAAO;AAAA,EACN,aAAa,EAAE,OAAO,EAAE,SAAS,uCAAuC;AAAA,EACxE,aAAa,oBAAoB,iCAAiC;AAAA,EAClE,gBAAgB,oBAAoB,oCAAoC;AAAA,EACxE,wBAAwB,EACrB,OAAO,EACP,SAAS,iCAAiC;AAAA,EAC7C,OAAO,qBAAqB,gCAAgC;AAAA,EAC5D,OAAO,qBAAqB,8BAA8B;AAC5D,CAAC,EACA,YAAY,EACZ,SAAS,6BAA6B;AAElC,IAAM,4BAA4B,EACtC,OAAO;AAAA,EACN,SAAS,EAAE,OAAO,EAAE,SAAS,mCAAmC;AAAA,EAChE,aAAa;AAAA,IACX;AAAA,EACF;AAAA,EACA,cAAc,2BAA2B,8BAA8B;AAAA,EACvE,WAAW,qBAAqB,yBAAyB;AAAA,EACzD,gBAAgB,EACb;AAAA,IACC,EAAE,OAAO;AAAA,MACP,aAAa,oBAAoB,0BAA0B;AAAA,MAC3D,kBAAkB,EACf,OAAO,EACP,SAAS,mCAAmC;AAAA,IACjD,CAAC;AAAA,EACH,EACC,SAAS,4BAA4B;AAAA,EACxC,wBAAwB,EACrB,OAAO,EACP,SAAS,iCAAiC;AAAA,EAC7C,UAAU,EACP,OAAO;AAAA,IACN,SAAS,2BAA2B,6BAA6B;AAAA,IACjE,MAAM,2BAA2B,0BAA0B;AAAA,EAC7D,CAAC,EACA,SAAS,EACT,SAAS,oDAAoD;AAAA,EAChE,QAAQ,EACL,OAAO;AAAA,IACN,SAAS,2BAA2B,6BAA6B;AAAA,IACjE,IAAI,2BAA2B,sCAAsC;AAAA,IACrE,QAAQ,2BAA2B,iCAAiC;AAAA,EACtE,CAAC,EACA,SAAS,EACT,SAAS,8CAA8C;AAC5D,CAAC,EACA,YAAY,EACZ,SAAS,yBAAyB;AAE9B,IAAM,uBAAuB,EAAE,OAAO;AAAA,EAC3C,UAAU,2BAA2B;AAAA,IACnC;AAAA,EACF;AACF,CAAC;AACM,IAAM,mBAAmB,EAAE,OAAO;AAAA,EACvC,MAAM,uBAAuB,SAAS,kCAAkC;AAC1E,CAAC;AACM,IAAM,uBAAuB,EAAE,OAAO;AAAA,EAC3C,UAAU,2BAA2B;AAAA,IACnC;AAAA,EACF;AACF,CAAC;AACM,IAAM,qBAAqB,EAAE,OAAO;AAAA,EACzC,QAAQ,yBAAyB,SAAS,8BAA8B;AAC1E,CAAC;AACM,IAAM,sBAAsB,EAAE,OAAO;AAAA,EAC1C,SAAS,kCAAkC;AAAA,IACzC;AAAA,EACF;AACF,CAAC;AACM,IAAM,2BAA2B,EAAE,OAAO;AAAA,EAC/C,MAAM,+BAA+B;AAAA,IACnC;AAAA,EACF;AACF,CAAC;AAEM,IAAM,4BAA4B,EAAE,OAAO;AAAA,EAChD,WAAW,EACR,MAAM,0BAA0B,EAChC,SAAS,gCAAgC;AAAA,EAC5C,aAAa;AACf,CAAC;AAEM,IAAM,oCAAoC,EAAE,OAAO;AAAA,EACxD,WAAW,EACR,MAAM,8BAA8B,EACpC,SAAS,oDAAoD;AAAA,EAChE,aAAa;AACf,CAAC;AAEM,IAAM,wBAAwB,EAAE,OAAO;AAAA,EAC5C,OAAO,EAAE,MAAM,sBAAsB,EAAE,SAAS,4BAA4B;AAAA,EAC5E,aAAa;AACf,CAAC;AAEM,IAAM,wBAAwB,EAAE,OAAO;AAAA,EAC5C,OAAO,EAAE,MAAM,sBAAsB,EAAE,SAAS,4BAA4B;AAAA,EAC5E,aAAa;AACf,CAAC;AAEM,IAAM,4BAA4B,EAAE,OAAO;AAAA,EAChD,WAAW,EACR,MAAM,0BAA0B,EAChC,SAAS,gCAAgC;AAAA,EAC5C,aAAa;AACf,CAAC;AAEM,IAAM,2BAA2B,EAAE,OAAO;AAAA,EAC/C,UAAU,EACP,MAAM,yBAAyB,EAC/B,SAAS,+BAA+B;AAAA,EAC3C,aAAa;AACf,CAAC;AAEM,IAAM,+BAA+B,EAAE,OAAO;AAAA,EACnD,OAAO,EACJ,MAAM,6BAA6B,EACnC,SAAS,oCAAoC;AAAA,EAChD,aAAa;AACf,CAAC;AAEM,IAAM,0BAA0B,EAAE,OAAO;AAAA,EAC9C,SAAS,EACN,MAAM,wBAAwB,EAC9B,SAAS,8BAA8B;AAAA,EAC1C,aAAa;AACf,CAAC;AAEM,IAAM,2BAA2B,EAAE,OAAO;AAAA,EAC/C,UAAU,EACP,MAAM,iCAAiC,EACvC,SAAS,oBAAoB;AAClC,CAAC;AAEM,IAAM,4BAA4B,EAAE,OAAO;AAAA,EAChD,IAAI,EAAE,OAAO,EAAE,SAAS,2BAA2B;AAAA,EACnD,QAAQ,EACL,KAAK;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC,EACA,SAAS,sCAAsC;AAAA,EAClD,SAAS,EACN,QAAQ,IAAI,EACZ,SAAS,iDAAiD;AAC/D,CAAC;AAEM,IAAM,wBAAwB;AAAA,EACnC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aACE;AAAA,EACF,aAAa;AAAA,IACX,OAAO,EACJ,OAAO,EACP,IAAI,EACJ,IAAI,CAAC,EACL,IAAI,GAAG,EACP,SAAS,EACT,SAAS,+BAA+B;AAAA,IAC3C,QAAQ,EACL,OAAO,EACP,SAAS,EACT,SAAS,sDAAsD;AAAA,IAClE,OAAO,EACJ,OAAO,EACP,SAAS,EACT;AAAA,MACC;AAAA,IACF;AAAA,EACJ;AACF;AAEO,IAAM,sBAAsB;AAAA,EACjC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aACE;AAAA,EACF,aAAa;AAAA,IACX,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,iCAAiC;AAAA,EAC3E;AACF;AAEO,IAAM,0BAA0B;AAAA,EACrC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aACE;AAAA,EACF,aAAa;AAAA,IACX,OAAO,EACJ,OAAO,EACP,IAAI,CAAC,EACL,SAAS,+CAA+C;AAAA,IAC3D,OAAO,EACJ,OAAO,EACP,IAAI,EACJ,IAAI,CAAC,EACL,IAAI,EAAE,EACN,SAAS,EACT,SAAS,0BAA0B;AAAA,EACxC;AACF;AAEO,IAAM,qBAAqB;AAAA,EAChC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYb,aAAa;AAAA,IACX,aAAa,EACV,OAAO,EACP,SAAS,EACT,SAAS,yDAAoD;AAAA,IAChE,aAAa,EACV,OAAO,EACP,SAAS,EACT,SAAS,+CAA0C;AAAA,IACtD,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,mCAAmC;AAAA,IACxE,YAAY,EACT,OAAO,EACP,SAAS,EACT,SAAS,EACT,SAAS,uDAAuD;AAAA,IACnE,UAAU,EACP,OAAO,EACP,SAAS,EACT,SAAS,wCAAwC;AAAA,IACpD,iBAAiB,EACd,QAAQ,EACR,SAAS,EACT,SAAS,uDAAuD;AAAA,IACnE,gBAAgB,EACb,QAAQ,EACR,SAAS,EACT,SAAS,0CAA0C;AAAA,IACtD,0BAA0B,EACvB,QAAQ,EACR,SAAS,EACT;AAAA,MACC;AAAA,IACF;AAAA,IACF,kBAAkB,EACf,QAAQ,EACR,SAAS,EACT;AAAA,MACC;AAAA,IACF;AAAA,IACF,kBAAkB,2BACf,SAAS,EACT;AAAA,MACC;AAAA,IACF;AAAA,EACJ;AACF;AAEO,IAAM,oBAAoB;AAAA,EAC/B,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aACE;AAAA,EACF,aAAa;AAAA,IACX,aAAa,EACV,OAAO,EACP,SAAS,EACT,SAAS,sCAAsC;AAAA,IAClD,aAAa,EACV,OAAO,EACP,SAAS,EACT,SAAS,sCAAsC;AAAA,IAClD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,EAAE,SAAS,WAAW;AAAA,IACvE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,mBAAmB;AAAA,EAC5D;AACF;AAIO,IAAM,wBAAwB;AAAA,EACnC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aACE;AAAA,EACF,aAAa;AAAA,IACX,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,6BAA6B;AAAA,IACjE,OAAO,EACJ,OAAO,EACP,IAAI,EACJ,IAAI,CAAC,EACL,IAAI,GAAG,EACP,SAAS,EACT,SAAS,wBAAwB;AAAA,IACpC,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,mBAAmB;AAAA,EAC5D;AACF;AAIO,IAAM,wBAAwB;AAAA,EACnC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aACE;AAAA,EACF,aAAa;AAAA,IACX,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS;AAAA,IACjD,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,IAC5B,OAAO,EACJ,OAAO,EACP,SAAS,EACT,SAAS,4CAA4C;AAAA,EAC1D;AACF;AAEO,IAAM,0BAA0B;AAAA,EACrC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aACE;AAAA,EACF,aAAa;AAAA,IACX,OAAO,EACJ,OAAO,EACP,IAAI,CAAC,EACL,SAAS,+CAA+C;AAAA,IAC3D,OAAO,EACJ,OAAO,EACP,IAAI,EACJ,IAAI,CAAC,EACL,IAAI,EAAE,EACN,SAAS,EACT,SAAS,0BAA0B;AAAA,EACxC;AACF;AAEO,IAAM,sBAAsB;AAAA,EACjC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aACE;AAAA,EACF,aAAa;AAAA,IACX,aAAa,EACV,OAAO,EACP,IAAI,CAAC,EACL,SAAS,mCAAmC;AAAA,EACjD;AACF;AAEO,IAAM,yBAAyB;AAAA,EACpC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQb,aAAa;AAAA,IACX,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,6BAA6B;AAAA,IAC9D,eAAe,EACZ,OAAO,EACP,SAAS,EACT,SAAS,wCAAwC;AAAA,IACpD,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACnC;AACF;AAEO,IAAM,gCAAgC;AAAA,EAC3C,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aACE;AAAA,EACF,aAAa;AAAA,IACX,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC7B,WAAW,EACR,OAAO,EACP,SAAS,EACT,SAAS,8CAA8C;AAAA,IAC1D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS;AAAA,IACjD,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9B;AACF;AAIO,IAAM,uBAAuB;AAAA,EAClC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aACE;AAAA,EACF,aAAa;AAAA,IACX,OAAO,EACJ,OAAO,EACP,SAAS,EACT,SAAS,qCAAqC;AAAA,IACjD,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,IACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS;AAAA,IACjD,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9B;AACF;AAEO,IAAM,2BAA2B;AAAA,EACtC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aACE;AAAA,EACF,aAAa;AAAA,IACX,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC5B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS;AAAA,IACjD,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9B;AACF;AAIO,IAAM,+BAA+B;AAAA,EAC1C,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aACE;AAAA,EACF,aAAa;AAAA,IACX,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC7B,OAAO,EACJ,OAAO,EACP,IAAI,EACJ,SAAS,EACT,SAAS,iEAA4D;AAAA,IACxE,OAAO,EACJ,OAAO,EACP,IAAI,EACJ,SAAS,EACT,SAAS,uDAAkD;AAAA,EAChE;AACF;AAEO,IAAM,2BAA2B;AAAA,EACtC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aACE;AAAA,EACF,aAAa;AAAA,IACX,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IACzB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,IACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EACnC;AACF;AAEO,IAAM,+BAA+B;AAAA,EAC1C,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aACE;AAAA,EACF,aAAa;AAAA,IACX,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC7B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,IACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EACnC;AACF;AAEO,IAAM,2BAA2B;AAAA,EACtC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aACE;AAAA,EACF,aAAa;AAAA,IACX,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC3B;AACF;AAGA,IAAM,iBAAiB,EAAE,KAAK;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,kBAAkB,EAAE,KAAK;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAIM,IAAM,yBAAyB;AAAA,EACpC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOb,aAAa;AAAA,IACX,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC7B,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS;AAAA,IAC1C,WAAW,EACR,OAAO,EACP,SAAS,EACT,SAAS,EACT;AAAA,MACC;AAAA,IACF;AAAA,EACJ;AACF;AAEO,IAAM,yBAAyB;AAAA,EACpC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOb,aAAa;AAAA,IACX,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC/B;AACF;AAIO,IAAM,+BAA+B;AAAA,EAC1C,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aACE;AAAA,EACF,aAAa;AAAA,IACX,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC/B;AACF;AAEO,IAAM,6BAA6B;AAAA,EACxC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aACE;AAAA,EACF,aAAa;AAAA,IACX,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC7B,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC9B;AACF;AAEO,IAAM,6BAA6B;AAAA,EACxC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYb,aAAa;AAAA,IACX,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC7B,YAAY,EACT,OAAO,EACP,IAAI,EACJ,OAAO,CAAC,MAAM,EAAE,WAAW,UAAU,GAAG;AAAA,MACvC,SAAS;AAAA,IACX,CAAC,EACA,SAAS,EACT;AAAA,MACC;AAAA,IACF;AAAA,IACF,cAAc,EACX,OAAO,EACP,IAAI,EACJ,OAAO,CAAC,MAAM,EAAE,WAAW,UAAU,GAAG;AAAA,MACvC,SAAS;AAAA,IACX,CAAC,EACA,SAAS,EACT;AAAA,MACC;AAAA,IACF;AAAA,EACJ;AACF;AAEO,IAAM,iCAAiC;AAAA,EAC5C,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOb,aAAa;AAAA,IACX,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC7B,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC9B;AACF;AAIO,IAAM,sBAAsB;AAAA,EACjC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aAAa;AAAA;AAAA;AAAA,EAGb,aAAa;AAAA,IACX,WAAW,EACR,OAAO,EACP,SAAS,EACT;AAAA,MACC;AAAA,IACF;AAAA,IACF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS;AAAA,IACjD,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9B;AACF;AAEO,IAAM,oBAAoB;AAAA,EAC/B,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aACE;AAAA,EACF,aAAa;AAAA,IACX,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC7B;AACF;AAEO,IAAM,uBAAuB;AAAA,EAClC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOb,aAAa;AAAA,IACX,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,IAC/B,WAAW,EACR,OAAO,EACP,SAAS,EACT,SAAS,EACT;AAAA,MACC;AAAA,IACF;AAAA,IACF,MAAM,eAAe,SAAS;AAAA,IAC9B,OAAO,gBAAgB,SAAS;AAAA,EAClC;AACF;AAEO,IAAM,uBAAuB;AAAA,EAClC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aACE;AAAA,EACF,aAAa;AAAA,IACX,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC3B,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS;AAAA,IAC1C,MAAM,eAAe,SAAS,EAAE,SAAS;AAAA,IACzC,OAAO,gBAAgB,SAAS,EAAE,SAAS;AAAA,EAC7C;AACF;AAEO,IAAM,uBAAuB;AAAA,EAClC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aAAa;AAAA;AAAA;AAAA,EAGb,aAAa;AAAA,IACX,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC3B,SAAS,EACN,QAAQ,EACR,SAAS,EACT;AAAA,MACC;AAAA,IACF;AAAA,EACJ;AACF;AAEO,IAAM,qBAAqB;AAAA,EAChC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aACE;AAAA,EACF,aAAa;AAAA,IACX,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC3B,WAAW,EACR,OAAO,EACP,SAAS,EACT,SAAS,uDAAuD;AAAA,EACrE;AACF;AAIO,IAAM,kBAAkB;AAAA,EAC7B,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aACE;AAAA,EACF,aAAa;AAAA,IACX,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC3B;AACF;AAEO,IAAM,qBAAqB;AAAA,EAChC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQb,aAAa;AAAA,IACX,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IACzB,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,IAC1B,YAAY,EACT,OAAO,EACP,SAAS,EACT,SAAS,EACT,SAAS,EACT,SAAS,iDAAiD;AAAA,IAC7D,UAAU,EACP,OAAO,EACP,IAAI,CAAC,EACL,SAAS,EACT,SAAS,EACT,SAAS,qDAAqD;AAAA,IACjE,iBAAiB,EAAE,QAAQ,EAAE,SAAS;AAAA,IACtC,qBAAqB,EAAE,QAAQ,EAAE,SAAS;AAAA,IAC1C,gBAAgB,EAAE,QAAQ,EAAE,SAAS;AAAA,IACrC,YAAY,EACT,MAAM,EAAE,OAAO,CAAC,EAChB,SAAS,EACT,SAAS,8DAA8D;AAAA,IAC1E,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,IACxC,kBAAkB,EAAE,QAAQ,EAAE,SAAS;AAAA,IACvC,kBAAkB,2BACf,SAAS,EACT,SAAS,EACT;AAAA,MACC;AAAA,IACF;AAAA,IACF,8BAA8B,EAAE,QAAQ,EAAE,SAAS;AAAA,IACnD,0BAA0B,EAAE,QAAQ,EAAE,SAAS;AAAA,EACjD;AACF;AAEO,IAAM,qBAAqB;AAAA,EAChC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aAAa;AAAA;AAAA;AAAA,EAGb,aAAa;AAAA,IACX,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC3B;AACF;AAIO,IAAM,yBAAyB;AAAA,EACpC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOb,aAAa;AAAA,IACX,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC7B,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,IACjC,eAAe,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,IAC9C,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,IAC5C,qBAAqB,EAAE,QAAQ,EAAE,SAAS;AAAA,EAC5C;AACF;AAEO,IAAM,yBAAyB;AAAA,EACpC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aAAa;AAAA;AAAA;AAAA,EAGb,aAAa;AAAA,IACX,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC/B;AACF;AAEO,IAAM,iCAAiC;AAAA,EAC5C,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOb,aAAa;AAAA,IACX,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC7B,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC7B,WAAW,EACR,OAAO,EACP,SAAS,EACT;AAAA,MACC;AAAA,IACF;AAAA,EACJ;AACF;AAEO,IAAM,iCAAiC;AAAA,EAC5C,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aAAa;AAAA;AAAA;AAAA,EAGb,aAAa;AAAA,IACX,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC7B,sBAAsB,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACxC;AACF;AAEO,IAAM,+BAA+B;AAAA,EAC1C,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa;AAAA,IACX,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC7B,sBAAsB,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IACtC,WAAW,EACR,OAAO,EACP,SAAS,EACT;AAAA,MACC;AAAA,IACF;AAAA,EACJ;AACF;AAIO,IAAM,8BAA8B;AAAA,EACzC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aAAa;AAAA;AAAA;AAAA,EAGb,aAAa;AAAA,IACX,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC7B,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,IAC/B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS;AAAA,IACjD,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9B;AACF;AAEO,IAAM,4BAA4B;AAAA,EACvC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aACE;AAAA,EACF,aAAa;AAAA,IACX,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC7B,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC7B;AACF;AAEO,IAAM,+BAA+B;AAAA,EAC1C,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aACE;AAAA,EACF,aAAa;AAAA,IACX,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC7B,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,IAC/B,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,IAC1C,MAAM,eAAe,SAAS;AAAA,IAC9B,OAAO,gBAAgB,SAAS;AAAA,EAClC;AACF;AAEO,IAAM,+BAA+B;AAAA,EAC1C,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aACE;AAAA,EACF,aAAa;AAAA,IACX,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC7B,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC3B,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS;AAAA,IAC1C,MAAM,eAAe,SAAS,EAAE,SAAS;AAAA,IACzC,OAAO,gBAAgB,SAAS,EAAE,SAAS;AAAA,EAC7C;AACF;AAEO,IAAM,+BAA+B;AAAA,EAC1C,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aAAa;AAAA;AAAA;AAAA,EAGb,aAAa;AAAA,IACX,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC7B,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC3B,SAAS,EAAE,QAAQ,EAAE,SAAS;AAAA,EAChC;AACF;AAEO,IAAM,6BAA6B;AAAA,EACxC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aACE;AAAA,EACF,aAAa;AAAA,IACX,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC7B,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC3B,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC;AACF;AAIO,IAAM,qBAAqB;AAAA,EAChC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aACE;AAAA,EACF,aAAa;AAAA,IACX,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC9B;AACF;AAEO,IAAM,6BAA6B;AAAA,EACxC,CAAC,sBAAsB,IAAI,GAAG;AAAA,EAC9B,CAAC,oBAAoB,IAAI,GAAG;AAAA,EAC5B,CAAC,wBAAwB,IAAI,GAAG;AAAA,EAChC,CAAC,mBAAmB,IAAI,GAAG;AAAA,EAC3B,CAAC,kBAAkB,IAAI,GAAG;AAAA,EAC1B,CAAC,sBAAsB,IAAI,GAAG;AAAA,EAC9B,CAAC,sBAAsB,IAAI,GAAG;AAAA,EAC9B,CAAC,wBAAwB,IAAI,GAAG;AAAA,EAChC,CAAC,oBAAoB,IAAI,GAAG;AAAA,EAC5B,CAAC,uBAAuB,IAAI,GAAG;AAAA,EAC/B,CAAC,8BAA8B,IAAI,GAAG;AAAA,EACtC,CAAC,qBAAqB,IAAI,GAAG;AAAA,EAC7B,CAAC,yBAAyB,IAAI,GAAG;AAAA,EACjC,CAAC,6BAA6B,IAAI,GAAG;AAAA,EACrC,CAAC,yBAAyB,IAAI,GAAG;AAAA,EACjC,CAAC,6BAA6B,IAAI,GAAG;AAAA,EACrC,CAAC,yBAAyB,IAAI,GAAG;AAAA,EACjC,CAAC,uBAAuB,IAAI,GAAG;AAAA,EAC/B,CAAC,uBAAuB,IAAI,GAAG;AAAA,EAC/B,CAAC,6BAA6B,IAAI,GAAG;AAAA,EACrC,CAAC,2BAA2B,IAAI,GAAG;AAAA,EACnC,CAAC,2BAA2B,IAAI,GAAG;AAAA,EACnC,CAAC,+BAA+B,IAAI,GAAG;AAAA,EACvC,CAAC,oBAAoB,IAAI,GAAG;AAAA,EAC5B,CAAC,kBAAkB,IAAI,GAAG;AAAA,EAC1B,CAAC,qBAAqB,IAAI,GAAG;AAAA,EAC7B,CAAC,qBAAqB,IAAI,GAAG;AAAA,EAC7B,CAAC,qBAAqB,IAAI,GAAG;AAAA,EAC7B,CAAC,mBAAmB,IAAI,GAAG;AAAA,EAC3B,CAAC,gBAAgB,IAAI,GAAG;AAAA,EACxB,CAAC,mBAAmB,IAAI,GAAG;AAAA,EAC3B,CAAC,mBAAmB,IAAI,GAAG;AAAA,EAC3B,CAAC,uBAAuB,IAAI,GAAG;AAAA,EAC/B,CAAC,uBAAuB,IAAI,GAAG;AAAA,EAC/B,CAAC,+BAA+B,IAAI,GAAG;AAAA,EACvC,CAAC,+BAA+B,IAAI,GAAG;AAAA,EACvC,CAAC,6BAA6B,IAAI,GAAG;AAAA,EACrC,CAAC,4BAA4B,IAAI,GAAG;AAAA,EACpC,CAAC,0BAA0B,IAAI,GAAG;AAAA,EAClC,CAAC,6BAA6B,IAAI,GAAG;AAAA,EACrC,CAAC,6BAA6B,IAAI,GAAG;AAAA,EACrC,CAAC,6BAA6B,IAAI,GAAG;AAAA,EACrC,CAAC,2BAA2B,IAAI,GAAG;AAAA,EACnC,CAAC,mBAAmB,IAAI,GAAG;AAC7B;","names":[]}
|
package/dist/index.js
CHANGED
|
@@ -46,7 +46,7 @@ import {
|
|
|
46
46
|
updateDocumentContract,
|
|
47
47
|
updateFolderContract,
|
|
48
48
|
updateLinkContract
|
|
49
|
-
} from "./chunk-
|
|
49
|
+
} from "./chunk-YMSDUZ2I.js";
|
|
50
50
|
|
|
51
51
|
// src/index.ts
|
|
52
52
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
@@ -498,14 +498,17 @@ function registerTools(server) {
|
|
|
498
498
|
"upload_document",
|
|
499
499
|
{
|
|
500
500
|
title: "Upload a document",
|
|
501
|
-
description: `
|
|
501
|
+
description: `Add a document to Papermark from a local file path, a public HTTPS URL to fetch, OR a non-file source (an external link / public Notion page).
|
|
502
502
|
|
|
503
503
|
WORKFLOW:
|
|
504
|
-
(1) Resolve the source
|
|
505
|
-
(
|
|
504
|
+
(1) Resolve the source \u2014 exactly one of:
|
|
505
|
+
\u2022 \`file_path\` (local filesystem \u2014 stdio mode only). Never guess a path; if the user attached a file in chat but didn't give a local path, ASK them to save it and provide the path.
|
|
506
|
+
\u2022 \`source_url\` (public HTTPS) \u2014 the server fetches and stores the file.
|
|
507
|
+
\u2022 \`type\` (\`link\` or \`notion\`) + \`external_url\` \u2014 stores a document that points at the URL without downloading it. Use \`notion\` for a publicly-accessible Notion page, \`link\` for any other external page.
|
|
508
|
+
(2) Confirm the target \`name\` if the user wants something other than the filename / URL.
|
|
506
509
|
(3) If the user wants a share link in the same breath, set \`create_link: true\` \u2014 otherwise follow up with \`create_link\` so you can set password/expiry/email gating explicitly.
|
|
507
510
|
|
|
508
|
-
Don't
|
|
511
|
+
Don't add any source the user didn't explicitly point at. Requires scope \`documents.write\`.`,
|
|
509
512
|
inputSchema: {
|
|
510
513
|
file_path: z.string().optional().describe(
|
|
511
514
|
"Absolute local path \u2014 only works when the MCP server runs on the same machine as the file (stdio mode)"
|
|
@@ -513,9 +516,17 @@ Don't upload any file the user didn't explicitly point at. Requires scope \`docu
|
|
|
513
516
|
source_url: z.string().url().refine((s) => s.startsWith("https://"), {
|
|
514
517
|
message: "source_url must use https:// (http is rejected by the API)"
|
|
515
518
|
}).optional().describe(
|
|
516
|
-
"Public HTTPS URL the server should fetch (alternative to file_path)"
|
|
519
|
+
"Public HTTPS URL the server should fetch and store (alternative to file_path)"
|
|
517
520
|
),
|
|
518
|
-
|
|
521
|
+
type: z.enum(["link", "notion"]).optional().describe(
|
|
522
|
+
"Create a non-file document from `external_url`: `link` (any external page) or `notion` (a public Notion page). Omit for file uploads via file_path/source_url."
|
|
523
|
+
),
|
|
524
|
+
external_url: z.string().url().refine((s) => s.startsWith("https://"), {
|
|
525
|
+
message: "external_url must use https:// (http is rejected by the API)"
|
|
526
|
+
}).optional().describe(
|
|
527
|
+
"Target URL stored as-is (not downloaded) for `type` link/notion documents. Required when `type` is set."
|
|
528
|
+
),
|
|
529
|
+
name: z.string().optional().describe("Display name; defaults to the filename or URL"),
|
|
519
530
|
content_type: z.string().optional().describe("MIME type; inferred from extension when omitted"),
|
|
520
531
|
folder_id: z.string().optional().describe(
|
|
521
532
|
"Destination folder id (created beforehand via `create_folder`). Omit for the team-library root."
|
|
@@ -524,6 +535,31 @@ Don't upload any file the user didn't explicitly point at. Requires scope \`docu
|
|
|
524
535
|
}
|
|
525
536
|
},
|
|
526
537
|
async (args) => run(async () => {
|
|
538
|
+
if (args.type) {
|
|
539
|
+
if (!args.external_url) {
|
|
540
|
+
throw new Error(
|
|
541
|
+
`external_url is required when type is "${args.type}".`
|
|
542
|
+
);
|
|
543
|
+
}
|
|
544
|
+
if (args.file_path || args.source_url) {
|
|
545
|
+
throw new Error(
|
|
546
|
+
"For type link/notion, provide external_url only (not file_path or source_url)."
|
|
547
|
+
);
|
|
548
|
+
}
|
|
549
|
+
const doc2 = await api.createDocument({
|
|
550
|
+
name: args.name ?? args.external_url,
|
|
551
|
+
type: args.type,
|
|
552
|
+
external_url: args.external_url,
|
|
553
|
+
folder_id: args.folder_id,
|
|
554
|
+
create_link: args.create_link
|
|
555
|
+
});
|
|
556
|
+
return { document: doc2 };
|
|
557
|
+
}
|
|
558
|
+
if (args.external_url) {
|
|
559
|
+
throw new Error(
|
|
560
|
+
'external_url requires type to be "link" or "notion".'
|
|
561
|
+
);
|
|
562
|
+
}
|
|
527
563
|
if (!args.file_path && !args.source_url) {
|
|
528
564
|
throw new Error(
|
|
529
565
|
"Provide either file_path (local) or source_url (remote)."
|
|
@@ -847,8 +883,14 @@ Don't upload any file the user didn't explicitly point at. Requires scope \`docu
|
|
|
847
883
|
inputSchema: addDocumentVersionContract.inputSchema
|
|
848
884
|
},
|
|
849
885
|
async (args) => run(async () => {
|
|
886
|
+
if (!!args.source_url === !!args.external_url) {
|
|
887
|
+
throw new Error(
|
|
888
|
+
"Provide exactly one of source_url (file documents) or external_url (link/notion documents)."
|
|
889
|
+
);
|
|
890
|
+
}
|
|
850
891
|
const v = await api.addDocumentVersion(args.document_id, {
|
|
851
|
-
source_url: args.source_url
|
|
892
|
+
source_url: args.source_url,
|
|
893
|
+
external_url: args.external_url
|
|
852
894
|
});
|
|
853
895
|
return { version: v };
|
|
854
896
|
}, "add_document_version")
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/tools.ts","../src/config.ts","../src/client.ts"],"sourcesContent":["import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\n\nimport { registerTools } from \"./tools.js\";\n\nconst SERVER_INFO = {\n name: \"papermark-mcp\",\n version: \"0.1.0\",\n} as const;\n\nasync function main(): Promise<void> {\n const server = new McpServer(SERVER_INFO, { capabilities: { tools: {} } });\n registerTools(server);\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n\nmain().catch((err) => {\n process.stderr.write(\n `[papermark-mcp] fatal: ${err instanceof Error ? err.stack ?? err.message : String(err)}\\n`,\n );\n process.exit(1);\n});\n","import { readFile, stat } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { lookup as lookupMimeType } from \"mime-types\";\nimport { z } from \"zod\";\n\nimport { ApiError, AuthRequiredError, NetworkError, api } from \"./client.js\";\nimport {\n addDocumentVersionContract,\n attachDataroomDocumentContract,\n createDataroomContract,\n createDataroomFolderContract,\n createFolderContract,\n createLinkContract,\n deleteDataroomContract,\n deleteDataroomFolderContract,\n deleteDocumentContract,\n deleteFolderContract,\n deleteLinkContract,\n detachDataroomDocumentContract,\n getDataroomAnalyticsContract,\n getDataroomContract,\n getDataroomFolderContract,\n getDocumentAnalyticsContract,\n getDocumentContract,\n getDocumentVersionContract,\n getFolderContract,\n getLinkAnalyticsContract,\n getLinkContract,\n getViewAnalyticsContract,\n getVisitorContract,\n listDataroomDocumentsContract,\n listDataroomFoldersContract,\n listDataroomsContract,\n listDocumentVersionsContract,\n listDocumentsContract,\n listFoldersContract,\n listLinksContract,\n listLinkViewsContract,\n listVisitorViewsContract,\n listVisitorsContract,\n moveDataroomDocumentContract,\n moveDataroomFolderContract,\n moveFolderContract,\n promoteDocumentVersionContract,\n searchDataroomsContract,\n searchDocumentsContract,\n SHARED_TOOL_OUTPUT_SCHEMAS,\n documentOutputSchema,\n updateDataroomContract,\n updateDataroomFolderContract,\n updateDocumentContract,\n updateFolderContract,\n updateLinkContract,\n} from \"./tools-contract.js\";\n\ntype ToolResult = {\n content: Array<{ type: \"text\"; text: string }>;\n structuredContent?: Record<string, unknown>;\n isError?: boolean;\n};\n\nconst readTool = (openWorldHint = false) =>\n ({ readOnlyHint: true, destructiveHint: false, openWorldHint }) as const;\n\nconst writeTool = (openWorldHint = false) =>\n ({ readOnlyHint: false, destructiveHint: false, openWorldHint }) as const;\n\nconst destructiveTool = (openWorldHint = false) =>\n ({ readOnlyHint: false, destructiveHint: true, openWorldHint }) as const;\n\nconst TOOL_ANNOTATIONS: Record<\n string,\n { readOnlyHint?: boolean; destructiveHint?: boolean; openWorldHint?: boolean }\n> = {\n list_documents: readTool(),\n get_document: readTool(),\n search_documents: readTool(),\n upload_document: writeTool(true),\n create_link: writeTool(),\n list_links: readTool(),\n list_link_views: readTool(),\n list_datarooms: readTool(),\n search_datarooms: readTool(),\n get_dataroom: readTool(),\n create_dataroom: writeTool(),\n list_dataroom_documents: readTool(),\n list_visitors: readTool(),\n list_visitor_views: readTool(),\n get_document_analytics: readTool(),\n get_link_analytics: readTool(),\n get_dataroom_analytics: readTool(),\n get_view_analytics: readTool(),\n update_document: destructiveTool(),\n delete_document: destructiveTool(),\n list_document_versions: readTool(),\n get_document_version: readTool(),\n add_document_version: destructiveTool(true),\n promote_document_version: destructiveTool(),\n list_folders: readTool(),\n get_folder: readTool(),\n create_folder: writeTool(),\n update_folder: destructiveTool(),\n delete_folder: destructiveTool(),\n move_folder: destructiveTool(),\n get_link: readTool(),\n update_link: destructiveTool(),\n delete_link: destructiveTool(),\n update_dataroom: destructiveTool(),\n delete_dataroom: destructiveTool(),\n attach_dataroom_document: writeTool(),\n detach_dataroom_document: destructiveTool(),\n move_dataroom_document: destructiveTool(),\n list_dataroom_folders: readTool(),\n get_dataroom_folder: readTool(),\n create_dataroom_folder: writeTool(),\n update_dataroom_folder: destructiveTool(),\n delete_dataroom_folder: destructiveTool(),\n move_dataroom_folder: destructiveTool(),\n get_visitor: readTool(),\n};\n\nconst TOOL_OUTPUT_SCHEMAS: Record<string, unknown> = {\n ...SHARED_TOOL_OUTPUT_SCHEMAS,\n upload_document: documentOutputSchema,\n};\n\nfunction toStructuredContent(result: unknown): Record<string, unknown> {\n if (result && typeof result === \"object\" && !Array.isArray(result)) {\n return result as Record<string, unknown>;\n }\n return { result };\n}\n\nasync function run<T>(\n fn: () => Promise<T>,\n label: string,\n): Promise<ToolResult> {\n try {\n const result = await fn();\n const structuredContent = toStructuredContent(result);\n return {\n structuredContent,\n content: [\n { type: \"text\", text: JSON.stringify(structuredContent, null, 2) },\n ],\n };\n } catch (err) {\n if (err instanceof ApiError) {\n // Field-level validation detail from the v1 API (e.g. a 422's zod\n // `.flatten()` naming the offending field). Without this the caller\n // only sees the generic top-level message and can't self-correct.\n const detail =\n err.details !== undefined && err.details !== null\n ? `\\nDetails: ${JSON.stringify(err.details)}`\n : \"\";\n const hint = err.docUrl ? `\\nDocs: ${err.docUrl}` : \"\";\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text: `${label} failed (${err.status} ${err.code}): ${err.message}${detail}${hint}`,\n },\n ],\n };\n }\n if (err instanceof NetworkError) {\n return {\n isError: true,\n content: [{ type: \"text\", text: `${label} failed: ${err.message}` }],\n };\n }\n if (err instanceof AuthRequiredError) {\n return { isError: true, content: [{ type: \"text\", text: err.message }] };\n }\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text: `${label} failed: ${err instanceof Error ? err.message : String(err)}`,\n },\n ],\n };\n }\n}\n\nfunction guessContentType(fileName: string): string {\n return lookupMimeType(fileName) || \"application/octet-stream\";\n}\n\nfunction filenameFromUrl(rawUrl: string): string {\n try {\n const u = new URL(rawUrl);\n const last = u.pathname.split(\"/\").filter(Boolean).pop();\n if (!last) return \"document\";\n return decodeURIComponent(last);\n } catch {\n return \"document\";\n }\n}\n\nexport function registerTools(server: McpServer): void {\n const baseRegisterTool = server.registerTool.bind(server);\n server.registerTool = ((\n name: string,\n config: { annotations?: object; outputSchema?: unknown },\n cb: unknown,\n ) => {\n const annotations = TOOL_ANNOTATIONS[name];\n if (!annotations) {\n throw new Error(`MCP tool \"${name}\" has no annotations entry`);\n }\n const outputSchema = TOOL_OUTPUT_SCHEMAS[name];\n if (!outputSchema) {\n throw new Error(`MCP tool \"${name}\" has no output schema entry`);\n }\n return baseRegisterTool(\n name,\n {\n ...config,\n annotations: { ...annotations, ...config.annotations },\n outputSchema: config.outputSchema ?? outputSchema,\n } as never,\n cb as never,\n );\n }) as unknown as typeof server.registerTool;\n\n server.registerTool(\n listDocumentsContract.name,\n {\n title: listDocumentsContract.title,\n description: listDocumentsContract.description,\n inputSchema: listDocumentsContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const list = await api.listDocuments({\n limit: args.limit,\n cursor: args.cursor,\n query: args.query,\n });\n return {\n documents: list.data,\n next_cursor: list.next_cursor,\n };\n }, \"list_documents\"),\n );\n\n server.registerTool(\n getDocumentContract.name,\n {\n title: getDocumentContract.title,\n description: getDocumentContract.description,\n inputSchema: getDocumentContract.inputSchema,\n },\n async (args) =>\n run(() => api.getDocument(args.document_id), \"get_document\"),\n );\n\n server.registerTool(\n searchDocumentsContract.name,\n {\n title: searchDocumentsContract.title,\n description: searchDocumentsContract.description,\n inputSchema: searchDocumentsContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const list = await api.searchDocuments(args.query, args.limit);\n return {\n documents: list.data,\n next_cursor: list.next_cursor,\n };\n }, \"search_documents\"),\n );\n\n // upload_document stays local to the stdio transport because it can read\n // the user's filesystem. The remote HTTP adapter exposes a stripped-down\n // variant that only accepts source_url.\n server.registerTool(\n \"upload_document\",\n {\n title: \"Upload a document\",\n description: `Upload a document to Papermark from a local file path OR a public HTTPS URL.\n\nWORKFLOW:\n(1) Resolve the source: the user must name either a \\`file_path\\` (local filesystem — stdio mode only) OR a \\`source_url\\` (public HTTPS). Never guess a path; if the user attached a file in chat but didn't give a local path, ASK them to save it and provide the path.\n(2) Confirm the target \\`name\\` if the user wants something other than the filename.\n(3) If the user wants a share link in the same breath, set \\`create_link: true\\` — otherwise follow up with \\`create_link\\` so you can set password/expiry/email gating explicitly.\n\nDon't upload any file the user didn't explicitly point at. Requires scope \\`documents.write\\`.`,\n inputSchema: {\n file_path: z\n .string()\n .optional()\n .describe(\n \"Absolute local path — only works when the MCP server runs on the same machine as the file (stdio mode)\",\n ),\n source_url: z\n .string()\n .url()\n .refine((s) => s.startsWith(\"https://\"), {\n message:\n \"source_url must use https:// (http is rejected by the API)\",\n })\n .optional()\n .describe(\n \"Public HTTPS URL the server should fetch (alternative to file_path)\",\n ),\n name: z\n .string()\n .optional()\n .describe(\"Display name; defaults to the filename\"),\n content_type: z\n .string()\n .optional()\n .describe(\"MIME type; inferred from extension when omitted\"),\n folder_id: z\n .string()\n .optional()\n .describe(\n \"Destination folder id (created beforehand via `create_folder`). Omit for the team-library root.\",\n ),\n create_link: z\n .boolean()\n .optional()\n .describe(\"Create a default share link after upload\"),\n },\n },\n async (args) =>\n run(async () => {\n if (!args.file_path && !args.source_url) {\n throw new Error(\n \"Provide either file_path (local) or source_url (remote).\",\n );\n }\n if (args.file_path && args.source_url) {\n throw new Error(\"Provide only one of file_path or source_url.\");\n }\n\n if (args.source_url) {\n // Parse via URL so query strings and fragments don't end up in the\n // inferred filename — `https://example.com/x.pdf?token=abc` should\n // be `x.pdf`, not `x.pdf?token=abc`.\n const name = args.name ?? filenameFromUrl(args.source_url);\n const doc = await api.createDocument({\n name,\n source_url: args.source_url,\n folder_id: args.folder_id,\n create_link: args.create_link,\n });\n return { document: doc };\n }\n\n const filePath = args.file_path!;\n const stats = await stat(filePath);\n const fileName = basename(filePath);\n const contentType = args.content_type ?? guessContentType(fileName);\n const body = await readFile(filePath);\n\n const presigned = await api.uploadUrl({\n file_name: fileName,\n content_type: contentType,\n content_length: stats.size,\n });\n\n // Bound the PUT so a hung S3 / Vercel Blob connection can't park the\n // agent loop forever. 5 minutes is generous — a 200MB upload on a\n // slow link still fits — but bounded enough that a truly stuck\n // connection surfaces as a typed error instead of an indefinite wait.\n const putController = new AbortController();\n const putTimer = setTimeout(() => putController.abort(), 5 * 60_000);\n let put: Response;\n try {\n put = await fetch(presigned.upload_url, {\n method: \"PUT\",\n headers: presigned.required_headers,\n body,\n signal: putController.signal,\n });\n } catch (err) {\n if (\n putController.signal.aborted ||\n (err instanceof Error && err.name === \"AbortError\")\n ) {\n throw new Error(\n \"Storage PUT aborted: presigned upload exceeded 5 minute timeout. The connection to object storage stalled — retry with a smaller file or a faster network.\",\n );\n }\n throw err;\n } finally {\n clearTimeout(putTimer);\n }\n if (!put.ok) {\n throw new Error(\n `Storage PUT failed: HTTP ${put.status} ${put.statusText}`,\n );\n }\n\n const doc = await api.createDocument({\n name: args.name ?? fileName,\n upload_id: presigned.upload_id,\n folder_id: args.folder_id,\n create_link: args.create_link,\n });\n return { document: doc };\n }, \"upload_document\"),\n );\n\n server.registerTool(\n createLinkContract.name,\n {\n title: createLinkContract.title,\n description: createLinkContract.description,\n inputSchema: createLinkContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const hasDoc = Boolean(args.document_id);\n const hasDr = Boolean(args.dataroom_id);\n if (!hasDoc && !hasDr) {\n throw new Error(\"Provide document_id or dataroom_id.\");\n }\n if (hasDoc && hasDr) {\n throw new Error(\n \"Provide exactly one of document_id or dataroom_id, not both.\",\n );\n }\n const link = await api.createLink(args);\n return { link };\n }, \"create_link\"),\n );\n\n server.registerTool(\n listLinksContract.name,\n {\n title: listLinksContract.title,\n description: listLinksContract.description,\n inputSchema: listLinksContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const list = await api.listLinks(args);\n return {\n links: list.data,\n next_cursor: list.next_cursor,\n };\n }, \"list_links\"),\n );\n\n server.registerTool(\n listLinkViewsContract.name,\n {\n title: listLinkViewsContract.title,\n description: listLinkViewsContract.description,\n inputSchema: listLinkViewsContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const list = await api.listViews(args.link_id, {\n limit: args.limit,\n cursor: args.cursor,\n });\n return {\n views: list.data,\n next_cursor: list.next_cursor,\n };\n }, \"list_link_views\"),\n );\n\n // ─── Datarooms ───────────────────────────────────────────────────────\n server.registerTool(\n listDataroomsContract.name,\n {\n title: listDataroomsContract.title,\n description: listDataroomsContract.description,\n inputSchema: listDataroomsContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const list = await api.listDatarooms(args);\n return { datarooms: list.data, next_cursor: list.next_cursor };\n }, \"list_datarooms\"),\n );\n\n server.registerTool(\n searchDataroomsContract.name,\n {\n title: searchDataroomsContract.title,\n description: searchDataroomsContract.description,\n inputSchema: searchDataroomsContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const list = await api.listDatarooms({\n query: args.query,\n limit: args.limit ?? 10,\n });\n return { datarooms: list.data, next_cursor: list.next_cursor };\n }, \"search_datarooms\"),\n );\n\n server.registerTool(\n getDataroomContract.name,\n {\n title: getDataroomContract.title,\n description: getDataroomContract.description,\n inputSchema: getDataroomContract.inputSchema,\n },\n async (args) =>\n run(() => api.getDataroom(args.dataroom_id), \"get_dataroom\"),\n );\n\n server.registerTool(\n createDataroomContract.name,\n {\n title: createDataroomContract.title,\n description: createDataroomContract.description,\n inputSchema: createDataroomContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const dr = await api.createDataroom(args);\n return { dataroom: dr };\n }, \"create_dataroom\"),\n );\n\n server.registerTool(\n listDataroomDocumentsContract.name,\n {\n title: listDataroomDocumentsContract.title,\n description: listDataroomDocumentsContract.description,\n inputSchema: listDataroomDocumentsContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const list = await api.listDataroomDocuments(args.dataroom_id, {\n limit: args.limit,\n cursor: args.cursor,\n folder_id: args.folder_id,\n });\n return { documents: list.data, next_cursor: list.next_cursor };\n }, \"list_dataroom_documents\"),\n );\n\n // ─── Visitors ────────────────────────────────────────────────────────\n server.registerTool(\n listVisitorsContract.name,\n {\n title: listVisitorsContract.title,\n description: listVisitorsContract.description,\n inputSchema: listVisitorsContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const list = await api.listVisitors(args);\n return { visitors: list.data, next_cursor: list.next_cursor };\n }, \"list_visitors\"),\n );\n\n server.registerTool(\n listVisitorViewsContract.name,\n {\n title: listVisitorViewsContract.title,\n description: listVisitorViewsContract.description,\n inputSchema: listVisitorViewsContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const list = await api.listVisitorViews(args.visitor_id, {\n limit: args.limit,\n cursor: args.cursor,\n });\n return { views: list.data, next_cursor: list.next_cursor };\n }, \"list_visitor_views\"),\n );\n\n // ─── Analytics ───────────────────────────────────────────────────────\n server.registerTool(\n getDocumentAnalyticsContract.name,\n {\n title: getDocumentAnalyticsContract.title,\n description: getDocumentAnalyticsContract.description,\n inputSchema: getDocumentAnalyticsContract.inputSchema,\n },\n async (args) =>\n run(\n () =>\n api.documentAnalytics(args.document_id, {\n since: args.since,\n until: args.until,\n }),\n \"get_document_analytics\",\n ),\n );\n\n server.registerTool(\n getLinkAnalyticsContract.name,\n {\n title: getLinkAnalyticsContract.title,\n description: getLinkAnalyticsContract.description,\n inputSchema: getLinkAnalyticsContract.inputSchema,\n },\n async (args) =>\n run(\n () =>\n api.linkAnalytics(args.link_id, {\n since: args.since,\n until: args.until,\n }),\n \"get_link_analytics\",\n ),\n );\n\n server.registerTool(\n getDataroomAnalyticsContract.name,\n {\n title: getDataroomAnalyticsContract.title,\n description: getDataroomAnalyticsContract.description,\n inputSchema: getDataroomAnalyticsContract.inputSchema,\n },\n async (args) =>\n run(\n () =>\n api.dataroomAnalytics(args.dataroom_id, {\n since: args.since,\n until: args.until,\n }),\n \"get_dataroom_analytics\",\n ),\n );\n\n server.registerTool(\n getViewAnalyticsContract.name,\n {\n title: getViewAnalyticsContract.title,\n description: getViewAnalyticsContract.description,\n inputSchema: getViewAnalyticsContract.inputSchema,\n },\n async (args) =>\n run(() => api.viewAnalytics(args.view_id), \"get_view_analytics\"),\n );\n\n // ─── Document mutations ──────────────────────────────────────────────\n server.registerTool(\n updateDocumentContract.name,\n {\n title: updateDocumentContract.title,\n description: updateDocumentContract.description,\n inputSchema: updateDocumentContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const body: { name?: string; folder_id?: string | null } = {};\n if (args.name !== undefined) body.name = args.name;\n if (args.folder_id !== undefined) body.folder_id = args.folder_id;\n if (Object.keys(body).length === 0) {\n throw new Error(\"Provide at least one of `name` or `folder_id`.\");\n }\n const doc = await api.updateDocument(args.document_id, body);\n return { document: doc };\n }, \"update_document\"),\n );\n\n server.registerTool(\n deleteDocumentContract.name,\n {\n title: deleteDocumentContract.title,\n description: deleteDocumentContract.description,\n inputSchema: deleteDocumentContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n return await api.deleteDocument(args.document_id);\n }, \"delete_document\"),\n );\n\n // ─── Document versions ───────────────────────────────────────────────\n server.registerTool(\n listDocumentVersionsContract.name,\n {\n title: listDocumentVersionsContract.title,\n description: listDocumentVersionsContract.description,\n inputSchema: listDocumentVersionsContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const list = await api.listDocumentVersions(args.document_id);\n return { versions: list.data };\n }, \"list_document_versions\"),\n );\n\n server.registerTool(\n getDocumentVersionContract.name,\n {\n title: getDocumentVersionContract.title,\n description: getDocumentVersionContract.description,\n inputSchema: getDocumentVersionContract.inputSchema,\n },\n async (args) =>\n run(\n () => api.getDocumentVersion(args.document_id, args.version_id),\n \"get_document_version\",\n ),\n );\n\n server.registerTool(\n addDocumentVersionContract.name,\n {\n title: addDocumentVersionContract.title,\n description: addDocumentVersionContract.description,\n inputSchema: addDocumentVersionContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const v = await api.addDocumentVersion(args.document_id, {\n source_url: args.source_url,\n });\n return { version: v };\n }, \"add_document_version\"),\n );\n\n server.registerTool(\n promoteDocumentVersionContract.name,\n {\n title: promoteDocumentVersionContract.title,\n description: promoteDocumentVersionContract.description,\n inputSchema: promoteDocumentVersionContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const v = await api.promoteDocumentVersion(\n args.document_id,\n args.version_id,\n );\n return { version: v };\n }, \"promote_document_version\"),\n );\n\n // ─── Folders ─────────────────────────────────────────────────────────\n server.registerTool(\n listFoldersContract.name,\n {\n title: listFoldersContract.title,\n description: listFoldersContract.description,\n inputSchema: listFoldersContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const list = await api.listFolders(args);\n return { folders: list.data, next_cursor: list.next_cursor };\n }, \"list_folders\"),\n );\n\n server.registerTool(\n getFolderContract.name,\n {\n title: getFolderContract.title,\n description: getFolderContract.description,\n inputSchema: getFolderContract.inputSchema,\n },\n async (args) => run(() => api.getFolder(args.folder_id), \"get_folder\"),\n );\n\n server.registerTool(\n createFolderContract.name,\n {\n title: createFolderContract.title,\n description: createFolderContract.description,\n inputSchema: createFolderContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const f = await api.createFolder(args);\n return { folder: f };\n }, \"create_folder\"),\n );\n\n server.registerTool(\n updateFolderContract.name,\n {\n title: updateFolderContract.title,\n description: updateFolderContract.description,\n inputSchema: updateFolderContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const body: Parameters<typeof api.updateFolder>[1] = {};\n if (args.name !== undefined) body.name = args.name;\n if (args.icon !== undefined) body.icon = args.icon;\n if (args.color !== undefined) body.color = args.color;\n if (Object.keys(body).length === 0) {\n throw new Error(\"Provide at least one of `name`, `icon`, `color`.\");\n }\n const f = await api.updateFolder(args.folder_id, body);\n return { folder: f };\n }, \"update_folder\"),\n );\n\n server.registerTool(\n deleteFolderContract.name,\n {\n title: deleteFolderContract.title,\n description: deleteFolderContract.description,\n inputSchema: deleteFolderContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n return await api.deleteFolder(args.folder_id, {\n cascade: args.cascade,\n });\n }, \"delete_folder\"),\n );\n\n server.registerTool(\n moveFolderContract.name,\n {\n title: moveFolderContract.title,\n description: moveFolderContract.description,\n inputSchema: moveFolderContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const f = await api.moveFolder(args.folder_id, {\n parent_id: args.parent_id,\n });\n return { folder: f };\n }, \"move_folder\"),\n );\n\n // ─── Link mutations ──────────────────────────────────────────────────\n server.registerTool(\n getLinkContract.name,\n {\n title: getLinkContract.title,\n description: getLinkContract.description,\n inputSchema: getLinkContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const link = await api.getLink(args.link_id);\n return { link };\n }, \"get_link\"),\n );\n\n server.registerTool(\n updateLinkContract.name,\n {\n title: updateLinkContract.title,\n description: updateLinkContract.description,\n inputSchema: updateLinkContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const { link_id, ...rest } = args;\n if (Object.keys(rest).length === 0) {\n throw new Error(\"Provide at least one field to update.\");\n }\n const link = await api.updateLink(link_id, rest);\n return { link };\n }, \"update_link\"),\n );\n\n server.registerTool(\n deleteLinkContract.name,\n {\n title: deleteLinkContract.title,\n description: deleteLinkContract.description,\n inputSchema: deleteLinkContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n return await api.deleteLink(args.link_id);\n }, \"delete_link\"),\n );\n\n // ─── Dataroom mutations ──────────────────────────────────────────────\n server.registerTool(\n updateDataroomContract.name,\n {\n title: updateDataroomContract.title,\n description: updateDataroomContract.description,\n inputSchema: updateDataroomContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const { dataroom_id, ...rest } = args;\n if (Object.keys(rest).length === 0) {\n throw new Error(\"Provide at least one field to update.\");\n }\n const dr = await api.updateDataroom(dataroom_id, rest);\n return { dataroom: dr };\n }, \"update_dataroom\"),\n );\n\n server.registerTool(\n deleteDataroomContract.name,\n {\n title: deleteDataroomContract.title,\n description: deleteDataroomContract.description,\n inputSchema: deleteDataroomContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n return await api.deleteDataroom(args.dataroom_id);\n }, \"delete_dataroom\"),\n );\n\n server.registerTool(\n attachDataroomDocumentContract.name,\n {\n title: attachDataroomDocumentContract.title,\n description: attachDataroomDocumentContract.description,\n inputSchema: attachDataroomDocumentContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const item = await api.attachDataroomDocument(args.dataroom_id, {\n document_id: args.document_id,\n folder_id: args.folder_id,\n });\n return { item };\n }, \"attach_dataroom_document\"),\n );\n\n server.registerTool(\n detachDataroomDocumentContract.name,\n {\n title: detachDataroomDocumentContract.title,\n description: detachDataroomDocumentContract.description,\n inputSchema: detachDataroomDocumentContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n return await api.detachDataroomDocument(\n args.dataroom_id,\n args.dataroom_document_id,\n );\n }, \"detach_dataroom_document\"),\n );\n\n server.registerTool(\n moveDataroomDocumentContract.name,\n {\n title: moveDataroomDocumentContract.title,\n description: moveDataroomDocumentContract.description,\n inputSchema: moveDataroomDocumentContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const item = await api.moveDataroomDocument(\n args.dataroom_id,\n args.dataroom_document_id,\n { folder_id: args.folder_id },\n );\n return { item };\n }, \"move_dataroom_document\"),\n );\n\n // ─── Dataroom folders ────────────────────────────────────────────────\n server.registerTool(\n listDataroomFoldersContract.name,\n {\n title: listDataroomFoldersContract.title,\n description: listDataroomFoldersContract.description,\n inputSchema: listDataroomFoldersContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const list = await api.listDataroomFolders(args.dataroom_id, {\n parent_id: args.parent_id,\n limit: args.limit,\n cursor: args.cursor,\n });\n return { folders: list.data, next_cursor: list.next_cursor };\n }, \"list_dataroom_folders\"),\n );\n\n server.registerTool(\n getDataroomFolderContract.name,\n {\n title: getDataroomFolderContract.title,\n description: getDataroomFolderContract.description,\n inputSchema: getDataroomFolderContract.inputSchema,\n },\n async (args) =>\n run(\n () => api.getDataroomFolder(args.dataroom_id, args.folder_id),\n \"get_dataroom_folder\",\n ),\n );\n\n server.registerTool(\n createDataroomFolderContract.name,\n {\n title: createDataroomFolderContract.title,\n description: createDataroomFolderContract.description,\n inputSchema: createDataroomFolderContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const { dataroom_id, ...body } = args;\n const f = await api.createDataroomFolder(dataroom_id, body);\n return { folder: f };\n }, \"create_dataroom_folder\"),\n );\n\n server.registerTool(\n updateDataroomFolderContract.name,\n {\n title: updateDataroomFolderContract.title,\n description: updateDataroomFolderContract.description,\n inputSchema: updateDataroomFolderContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const body: Parameters<typeof api.updateDataroomFolder>[2] = {};\n if (args.name !== undefined) body.name = args.name;\n if (args.icon !== undefined) body.icon = args.icon;\n if (args.color !== undefined) body.color = args.color;\n if (Object.keys(body).length === 0) {\n throw new Error(\"Provide at least one of `name`, `icon`, `color`.\");\n }\n const f = await api.updateDataroomFolder(\n args.dataroom_id,\n args.folder_id,\n body,\n );\n return { folder: f };\n }, \"update_dataroom_folder\"),\n );\n\n server.registerTool(\n deleteDataroomFolderContract.name,\n {\n title: deleteDataroomFolderContract.title,\n description: deleteDataroomFolderContract.description,\n inputSchema: deleteDataroomFolderContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n return await api.deleteDataroomFolder(\n args.dataroom_id,\n args.folder_id,\n { cascade: args.cascade },\n );\n }, \"delete_dataroom_folder\"),\n );\n\n server.registerTool(\n moveDataroomFolderContract.name,\n {\n title: moveDataroomFolderContract.title,\n description: moveDataroomFolderContract.description,\n inputSchema: moveDataroomFolderContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const f = await api.moveDataroomFolder(\n args.dataroom_id,\n args.folder_id,\n { parent_id: args.parent_id },\n );\n return { folder: f };\n }, \"move_dataroom_folder\"),\n );\n\n // ─── Visitors ────────────────────────────────────────────────────────\n server.registerTool(\n getVisitorContract.name,\n {\n title: getVisitorContract.title,\n description: getVisitorContract.description,\n inputSchema: getVisitorContract.inputSchema,\n },\n async (args) => run(() => api.getVisitor(args.visitor_id), \"get_visitor\"),\n );\n}\n","const DEFAULT_API_URL = \"https://api.papermark.com\";\n\nexport function getToken(): string | undefined {\n return process.env.PAPERMARK_TOKEN?.trim() || undefined;\n}\n\nexport function getApiUrl(): string {\n return process.env.PAPERMARK_API_URL?.trim() || DEFAULT_API_URL;\n}\n","import { getApiUrl, getToken } from \"./config.js\";\n\nexport interface ApiErrorBody {\n error: {\n code: string;\n message: string;\n doc_url?: string;\n details?: unknown;\n };\n}\n\nexport class ApiError extends Error {\n code: string;\n status: number;\n docUrl?: string;\n details?: unknown;\n\n constructor(status: number, body: ApiErrorBody[\"error\"] | string) {\n const message = typeof body === \"string\" ? body : body.message;\n super(message);\n this.status = status;\n if (typeof body === \"string\") {\n this.code = \"unknown\";\n } else {\n this.code = body.code;\n this.docUrl = body.doc_url;\n this.details = body.details;\n }\n }\n}\n\nexport class AuthRequiredError extends Error {\n constructor() {\n super(\n \"No API token configured. Set PAPERMARK_TOKEN in the MCP server env (get one from papermark.com/settings/tokens).\",\n );\n this.name = \"AuthRequiredError\";\n }\n}\n\nexport class NetworkError extends Error {\n url: string;\n cause: unknown;\n constructor(url: string, cause: unknown) {\n const reason = extractNetworkReason(cause);\n super(`Network request to ${url} failed: ${reason}`);\n this.name = \"NetworkError\";\n this.url = url;\n this.cause = cause;\n }\n}\n\nfunction extractNetworkReason(err: unknown): string {\n if (err && typeof err === \"object\" && \"cause\" in err) {\n const c = (err as { cause: unknown }).cause;\n if (c && typeof c === \"object\") {\n const code = (c as { code?: string }).code;\n const msg = (c as { message?: string }).message;\n if (code || msg) return `${code ?? \"\"}${code && msg ? \" — \" : \"\"}${msg ?? \"\"}`.trim();\n }\n }\n if (err instanceof Error) return err.message;\n return String(err);\n}\n\ninterface RequestOptions {\n method?: string;\n body?: unknown;\n query?: Record<string, string | number | undefined>;\n anonymous?: boolean;\n headers?: Record<string, string>;\n /** Override the token for this call (used by OAuth transport layer). */\n token?: string;\n /** Per-request timeout in ms; defaults to DEFAULT_TIMEOUT_MS. */\n timeout?: number;\n}\n\n// 60s is generous for v1 endpoints (most return in <1s) but covers the slow\n// Tinybird-backed analytics calls that sometimes take 5-10s on cold caches.\nconst DEFAULT_TIMEOUT_MS = 60_000;\n\nfunction buildUrl(path: string, query?: RequestOptions[\"query\"]): string {\n const base = getApiUrl().replace(/\\/$/, \"\");\n let fullPath = path.startsWith(\"/\") ? path : `/${path}`;\n if (base.endsWith(\"/api\") && fullPath.startsWith(\"/api/\")) {\n fullPath = fullPath.slice(4);\n }\n const url = new URL(base + fullPath);\n if (query) {\n for (const [k, v] of Object.entries(query)) {\n if (v !== undefined && v !== null && v !== \"\") {\n url.searchParams.set(k, String(v));\n }\n }\n }\n return url.toString();\n}\n\nexport async function request<T = unknown>(\n path: string,\n opts: RequestOptions = {},\n): Promise<T> {\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n ...(opts.headers ?? {}),\n };\n if (!opts.anonymous) {\n const token = opts.token ?? getToken();\n if (!token) throw new AuthRequiredError();\n headers.Authorization = `Bearer ${token}`;\n }\n let body: BodyInit | undefined;\n if (opts.body !== undefined) {\n if (opts.body instanceof Uint8Array || opts.body instanceof ArrayBuffer) {\n body = opts.body as BodyInit;\n } else {\n body = JSON.stringify(opts.body);\n headers[\"Content-Type\"] = \"application/json\";\n }\n }\n\n const url = buildUrl(path, opts.query);\n // Time out stalled upstream connections so an MCP tool call doesn't hang\n // the agent loop. AbortError surfaces through the same NetworkError path\n // as DNS / TLS failures so callers see one error type for \"the request\n // never produced a response\".\n const controller = new AbortController();\n const timeoutMs = opts.timeout ?? DEFAULT_TIMEOUT_MS;\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n let res: Response;\n try {\n res = await fetch(url, {\n method: opts.method ?? (opts.body ? \"POST\" : \"GET\"),\n headers,\n body,\n signal: controller.signal,\n });\n } catch (err) {\n if (\n controller.signal.aborted ||\n (err instanceof Error && err.name === \"AbortError\")\n ) {\n throw new NetworkError(\n url,\n new Error(`Request exceeded ${timeoutMs}ms timeout`),\n );\n }\n throw new NetworkError(url, err);\n } finally {\n clearTimeout(timer);\n }\n\n if (res.status === 204) return undefined as T;\n\n const text = await res.text();\n const parsed = text ? safeParseJson(text) : null;\n\n if (!res.ok) {\n if (parsed && typeof parsed === \"object\" && \"error\" in parsed) {\n throw new ApiError(res.status, (parsed as ApiErrorBody).error);\n }\n const looksLikeHtml = text.trimStart().toLowerCase().startsWith(\"<\");\n const msg = looksLikeHtml\n ? `HTTP ${res.status} (server returned HTML, not JSON — is the API reachable?)`\n : text || `HTTP ${res.status}`;\n throw new ApiError(res.status, msg);\n }\n\n return (parsed as T) ?? (undefined as T);\n}\n\nfunction safeParseJson(s: string): unknown {\n try {\n return JSON.parse(s);\n } catch {\n return null;\n }\n}\n\nexport interface PublicDocument {\n id: string;\n object: \"document\";\n name: string;\n type: string | null;\n content_type: string | null;\n num_pages: number | null;\n folder_id: string | null;\n created: string;\n updated_at: string;\n}\n\nexport interface PublicDocumentVersion {\n id: string;\n object: \"document_version\";\n version_number: number;\n is_primary: boolean;\n type: string | null;\n content_type: string | null;\n num_pages: number | null;\n file_size: number | null;\n created: string;\n updated_at: string;\n}\n\nexport interface DocumentVersionList {\n data: PublicDocumentVersion[];\n}\n\nexport type FolderIcon =\n | \"folder\"\n | \"folder-open\"\n | \"briefcase\"\n | \"archive\"\n | \"box\"\n | \"file\"\n | \"book\"\n | \"bookmark\"\n | \"star\"\n | \"heart\"\n | \"lock\"\n | \"shield\"\n | \"users\"\n | \"settings\"\n | \"tag\"\n | \"layers\"\n | \"globe\"\n | \"home\"\n | \"mail\"\n | \"image\"\n | \"video\"\n | \"music\"\n | \"palette\"\n | \"pen-tool\"\n | \"lightbulb\"\n | \"zap\"\n | \"wrench\"\n | \"sparkles\"\n | \"cloud\"\n | \"flag\"\n | \"award\"\n | \"flame\"\n | \"bell\"\n | \"sun\"\n | \"hash\";\n\nexport type FolderColor =\n | \"gray\"\n | \"red\"\n | \"orange\"\n | \"yellow\"\n | \"green\"\n | \"blue\"\n | \"black\";\n\nexport interface PublicFolder {\n id: string;\n object: \"folder\";\n name: string;\n parent_id: string | null;\n path: string;\n icon: string | null;\n color: string | null;\n document_count: number;\n child_folder_count: number;\n created: string;\n updated_at: string;\n}\n\nexport interface FolderList {\n data: PublicFolder[];\n next_cursor: string | null;\n}\n\nexport interface PublicDataroomFolder {\n id: string;\n object: \"dataroom_folder\";\n name: string;\n parent_id: string | null;\n path: string;\n icon: string | null;\n color: string | null;\n document_count: number;\n child_folder_count: number;\n order_index: number | null;\n created: string;\n updated_at: string;\n}\n\nexport interface DataroomFolderList {\n data: PublicDataroomFolder[];\n next_cursor: string | null;\n}\n\nexport interface DocumentList {\n data: PublicDocument[];\n next_cursor: string | null;\n}\n\nexport interface UploadUrlResponse {\n upload_url: string;\n upload_id: string;\n required_headers: Record<string, string>;\n expires_at: string;\n}\n\nexport type WatermarkPosition =\n | \"top-left\"\n | \"top-center\"\n | \"top-right\"\n | \"middle-left\"\n | \"middle-center\"\n | \"middle-right\"\n | \"bottom-left\"\n | \"bottom-center\"\n | \"bottom-right\";\n\nexport type WatermarkRotation = 0 | 30 | 45 | 90 | 180;\n\nexport interface WatermarkConfig {\n text: string;\n is_tiled: boolean;\n position: WatermarkPosition;\n rotation: WatermarkRotation;\n color: string;\n font_size: number;\n opacity: number;\n}\n\nexport interface PublicLink {\n id: string;\n object: \"link\";\n name: string | null;\n target_type: \"document\" | \"dataroom\";\n document_id: string | null;\n dataroom_id: string | null;\n url: string;\n domain: string | null;\n slug: string | null;\n expires_at: string | null;\n is_password_protected: boolean;\n email_protected: boolean;\n email_authenticated: boolean;\n allow_download: boolean;\n allow_list: string[];\n deny_list: string[];\n enable_watermark: boolean;\n watermark_config: WatermarkConfig | null;\n enable_feedback: boolean;\n enable_screenshot_protection: boolean;\n enable_confidential_view: boolean;\n created: string;\n updated_at: string;\n}\n\nexport interface LinkList {\n data: PublicLink[];\n next_cursor: string | null;\n}\n\nexport interface PublicView {\n id: string;\n object: \"view\";\n link_id: string | null;\n document_id: string | null;\n dataroom_id: string | null;\n viewer_email: string | null;\n view_type: string | null;\n viewed_at: string;\n downloaded_at: string | null;\n download_type: string | null;\n}\n\nexport interface ViewList {\n data: PublicView[];\n next_cursor: string | null;\n}\n\nexport interface UpdateDocumentBody {\n name?: string;\n folder_id?: string | null;\n}\n\nexport interface UpdateLinkBody {\n name?: string;\n expires_at?: string | null;\n password?: string | null;\n email_protected?: boolean;\n email_authenticated?: boolean;\n allow_download?: boolean;\n allow_list?: string[];\n deny_list?: string[];\n enable_watermark?: boolean;\n watermark_config?: WatermarkConfig | null;\n enable_screenshot_protection?: boolean;\n enable_confidential_view?: boolean;\n}\n\n// Uniform acknowledgment returned by every v1 DELETE endpoint.\nexport interface DeletedObject {\n id: string;\n object:\n | \"document\"\n | \"folder\"\n | \"link\"\n | \"dataroom\"\n | \"dataroom_folder\"\n | \"dataroom_document\";\n deleted: true;\n}\n\nexport const api = {\n // Documents\n listDocuments: (\n query?: { limit?: number; cursor?: string; query?: string },\n token?: string,\n ) => request<DocumentList>(\"/v1/documents\", { query, token }),\n\n getDocument: (id: string, token?: string) =>\n request<PublicDocument>(`/v1/documents/${id}`, { token }),\n\n searchDocuments: (q: string, limit?: number, token?: string) =>\n request<DocumentList>(\"/v1/documents/search\", { query: { q, limit }, token }),\n\n updateDocument: (id: string, body: UpdateDocumentBody, token?: string) =>\n request<PublicDocument>(`/v1/documents/${id}`, {\n method: \"PATCH\",\n body,\n token,\n }),\n\n deleteDocument: (id: string, token?: string) =>\n request<DeletedObject>(`/v1/documents/${id}`, { method: \"DELETE\", token }),\n\n uploadUrl: (\n body: { file_name: string; content_type: string; content_length?: number },\n token?: string,\n ) =>\n request<UploadUrlResponse>(\"/v1/documents/upload-url\", {\n method: \"POST\",\n body,\n token,\n }),\n\n createDocument: (\n body: {\n name: string;\n upload_id?: string;\n source_url?: string;\n folder_id?: string;\n create_link?: boolean;\n },\n token?: string,\n ) =>\n request<PublicDocument>(\"/v1/documents\", { method: \"POST\", body, token }),\n\n // Document versions\n listDocumentVersions: (id: string, token?: string) =>\n request<DocumentVersionList>(`/v1/documents/${id}/versions`, { token }),\n addDocumentVersion: (\n id: string,\n body: { upload_id?: string; source_url?: string },\n token?: string,\n ) =>\n request<PublicDocumentVersion>(`/v1/documents/${id}/versions`, {\n method: \"POST\",\n body,\n token,\n }),\n getDocumentVersion: (id: string, vid: string, token?: string) =>\n request<PublicDocumentVersion>(`/v1/documents/${id}/versions/${vid}`, {\n token,\n }),\n promoteDocumentVersion: (id: string, vid: string, token?: string) =>\n request<PublicDocumentVersion>(`/v1/documents/${id}/versions/${vid}`, {\n method: \"PATCH\",\n body: { is_primary: true },\n token,\n }),\n\n // Folders\n listFolders: (\n query?: { limit?: number; cursor?: string; parent_id?: string },\n token?: string,\n ) => request<FolderList>(\"/v1/folders\", { query, token }),\n createFolder: (\n body: {\n name: string;\n parent_id?: string | null;\n icon?: FolderIcon;\n color?: FolderColor;\n },\n token?: string,\n ) => request<PublicFolder>(\"/v1/folders\", { method: \"POST\", body, token }),\n getFolder: (id: string, token?: string) =>\n request<PublicFolder>(`/v1/folders/${id}`, { token }),\n updateFolder: (\n id: string,\n body: { name?: string; icon?: FolderIcon | null; color?: FolderColor | null },\n token?: string,\n ) =>\n request<PublicFolder>(`/v1/folders/${id}`, { method: \"PATCH\", body, token }),\n deleteFolder: (id: string, opts?: { cascade?: boolean }, token?: string) =>\n request<DeletedObject>(`/v1/folders/${id}`, {\n method: \"DELETE\",\n query: opts?.cascade ? { cascade: \"true\" } : undefined,\n token,\n }),\n moveFolder: (\n id: string,\n body: { parent_id: string | null },\n token?: string,\n ) =>\n request<PublicFolder>(`/v1/folders/${id}/move`, {\n method: \"POST\",\n body,\n token,\n }),\n\n // Links\n listLinks: (\n query?: {\n limit?: number;\n cursor?: string;\n document_id?: string;\n dataroom_id?: string;\n },\n token?: string,\n ) => request<LinkList>(\"/v1/links\", { query, token }),\n\n getLink: (id: string, token?: string) =>\n request<PublicLink>(`/v1/links/${id}`, { token }),\n\n createLink: (\n body: {\n document_id?: string;\n dataroom_id?: string;\n name?: string;\n expires_at?: string;\n password?: string;\n email_protected?: boolean;\n allow_download?: boolean;\n enable_confidential_view?: boolean;\n enable_watermark?: boolean;\n watermark_config?: WatermarkConfig;\n },\n token?: string,\n ) => request<PublicLink>(\"/v1/links\", { method: \"POST\", body, token }),\n\n updateLink: (id: string, body: UpdateLinkBody, token?: string) =>\n request<PublicLink>(`/v1/links/${id}`, { method: \"PATCH\", body, token }),\n\n deleteLink: (id: string, token?: string) =>\n request<DeletedObject>(`/v1/links/${id}`, { method: \"DELETE\", token }),\n\n listViews: (\n linkId: string,\n query?: { limit?: number; cursor?: string },\n token?: string,\n ) => request<ViewList>(`/v1/links/${linkId}/views`, { query, token }),\n\n // Datarooms\n listDatarooms: (\n query?: { limit?: number; cursor?: string; query?: string },\n token?: string,\n ) => request<DataroomList>(\"/v1/datarooms\", { query, token }),\n getDataroom: (id: string, token?: string) =>\n request<PublicDataroom>(`/v1/datarooms/${id}`, { token }),\n createDataroom: (\n body: { name: string; internal_name?: string; description?: string },\n token?: string,\n ) => request<PublicDataroom>(\"/v1/datarooms\", { method: \"POST\", body, token }),\n updateDataroom: (\n id: string,\n body: {\n name?: string;\n internal_name?: string | null;\n description?: string | null;\n allow_bulk_download?: boolean;\n },\n token?: string,\n ) =>\n request<PublicDataroom>(`/v1/datarooms/${id}`, { method: \"PATCH\", body, token }),\n deleteDataroom: (id: string, token?: string) =>\n request<DeletedObject>(`/v1/datarooms/${id}`, { method: \"DELETE\", token }),\n listDataroomDocuments: (\n id: string,\n query?: { limit?: number; cursor?: string; folder_id?: string },\n token?: string,\n ) => request<DataroomItemList>(`/v1/datarooms/${id}/documents`, { query, token }),\n attachDataroomDocument: (\n id: string,\n body: { document_id: string; folder_id?: string },\n token?: string,\n ) =>\n request<PublicDataroomItem>(`/v1/datarooms/${id}/documents`, {\n method: \"POST\",\n body,\n token,\n }),\n detachDataroomDocument: (id: string, ddId: string, token?: string) =>\n request<DeletedObject>(`/v1/datarooms/${id}/documents/${ddId}`, {\n method: \"DELETE\",\n token,\n }),\n moveDataroomDocument: (\n id: string,\n ddId: string,\n body: { folder_id: string | null },\n token?: string,\n ) =>\n request<PublicDataroomItem>(`/v1/datarooms/${id}/documents/${ddId}/move`, {\n method: \"POST\",\n body,\n token,\n }),\n\n // Dataroom folders\n listDataroomFolders: (\n id: string,\n query?: { limit?: number; cursor?: string; parent_id?: string },\n token?: string,\n ) =>\n request<DataroomFolderList>(`/v1/datarooms/${id}/folders`, {\n query,\n token,\n }),\n createDataroomFolder: (\n id: string,\n body: {\n name: string;\n parent_id?: string | null;\n icon?: FolderIcon;\n color?: FolderColor;\n },\n token?: string,\n ) =>\n request<PublicDataroomFolder>(`/v1/datarooms/${id}/folders`, {\n method: \"POST\",\n body,\n token,\n }),\n getDataroomFolder: (id: string, fid: string, token?: string) =>\n request<PublicDataroomFolder>(`/v1/datarooms/${id}/folders/${fid}`, {\n token,\n }),\n updateDataroomFolder: (\n id: string,\n fid: string,\n body: { name?: string; icon?: FolderIcon | null; color?: FolderColor | null },\n token?: string,\n ) =>\n request<PublicDataroomFolder>(`/v1/datarooms/${id}/folders/${fid}`, {\n method: \"PATCH\",\n body,\n token,\n }),\n deleteDataroomFolder: (\n id: string,\n fid: string,\n opts?: { cascade?: boolean },\n token?: string,\n ) =>\n request<DeletedObject>(`/v1/datarooms/${id}/folders/${fid}`, {\n method: \"DELETE\",\n query: opts?.cascade ? { cascade: \"true\" } : undefined,\n token,\n }),\n moveDataroomFolder: (\n id: string,\n fid: string,\n body: { parent_id: string | null },\n token?: string,\n ) =>\n request<PublicDataroomFolder>(`/v1/datarooms/${id}/folders/${fid}/move`, {\n method: \"POST\",\n body,\n token,\n }),\n\n // Visitors\n listVisitors: (\n query?: {\n limit?: number;\n cursor?: string;\n email?: string;\n dataroom_id?: string;\n },\n token?: string,\n ) => request<VisitorList>(\"/v1/visitors\", { query, token }),\n getVisitor: (id: string, token?: string) =>\n request<PublicVisitor>(`/v1/visitors/${id}`, { token }),\n listVisitorViews: (\n id: string,\n query?: { limit?: number; cursor?: string },\n token?: string,\n ) => request<VisitorViewList>(`/v1/visitors/${id}/views`, { query, token }),\n\n // Analytics\n documentAnalytics: (\n id: string,\n query?: { since?: number; until?: number },\n token?: string,\n ) => request<DocumentAnalytics>(`/v1/analytics/documents/${id}`, { query, token }),\n linkAnalytics: (\n id: string,\n query?: { since?: number; until?: number },\n token?: string,\n ) => request<LinkAnalytics>(`/v1/analytics/links/${id}`, { query, token }),\n dataroomAnalytics: (\n id: string,\n query?: { since?: number; until?: number },\n token?: string,\n ) => request<DataroomAnalytics>(`/v1/analytics/datarooms/${id}`, { query, token }),\n viewAnalytics: (id: string, token?: string) =>\n request<ViewAnalytics>(`/v1/analytics/views/${id}`, { token }),\n};\n\nexport interface PublicDataroom {\n id: string;\n object: \"dataroom\";\n pid: string;\n name: string;\n internal_name: string | null;\n description: string | null;\n document_count: number;\n folder_count: number;\n conversations_enabled: boolean;\n agents_enabled: boolean;\n allow_bulk_download: boolean;\n is_frozen: boolean;\n created: string;\n updated_at: string;\n}\n\nexport interface DataroomList {\n data: PublicDataroom[];\n next_cursor: string | null;\n}\n\nexport interface PublicDataroomItem {\n id: string;\n object: \"dataroom_document\";\n document_id: string;\n document_name: string;\n content_type: string | null;\n num_pages: number | null;\n folder_id: string | null;\n folder_path: string | null;\n order_index: number | null;\n created: string;\n}\n\nexport interface DataroomItemList {\n data: PublicDataroomItem[];\n next_cursor: string | null;\n}\n\nexport interface PublicVisitor {\n id: string;\n object: \"visitor\";\n email: string;\n verified: boolean;\n dataroom_id: string | null;\n invited_at: string | null;\n total_views: number;\n last_viewed_at: string | null;\n created: string;\n updated_at: string;\n}\n\nexport interface VisitorList {\n data: PublicVisitor[];\n next_cursor: string | null;\n}\n\nexport interface PublicVisitorView {\n id: string;\n object: \"visitor_view\";\n link_id: string;\n document_id: string | null;\n dataroom_id: string | null;\n view_type: string;\n viewed_at: string;\n downloaded_at: string | null;\n is_archived: boolean;\n}\n\nexport interface VisitorViewList {\n data: PublicVisitorView[];\n next_cursor: string | null;\n}\n\nexport interface DocumentAnalytics {\n document_id: string;\n total_views: number;\n unique_viewers: number;\n total_duration_seconds: number;\n avg_page_duration_seconds: { page_number: number; avg_duration_seconds: number }[];\n since: string;\n until: string;\n}\n\nexport interface LinkAnalytics {\n link_id: string;\n total_views: number;\n total_duration_seconds: number;\n unique_viewers: number;\n since: string;\n until: string;\n}\n\nexport interface DataroomAnalytics {\n dataroom_id: string;\n total_views: number;\n unique_viewers: number;\n total_duration_seconds: number;\n since: string;\n until: string;\n}\n\nexport interface ViewAnalytics {\n view_id: string;\n document_id: string | null;\n viewer_email: string | null;\n viewed_at: string;\n page_durations: { page_number: number; duration_seconds: number }[];\n total_duration_seconds: number;\n location: { country: string | null; city: string | null } | null;\n client: { browser: string | null; os: string | null; device: string | null } | null;\n}\n"],"mappings":"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","names":["doc"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/tools.ts","../src/config.ts","../src/client.ts"],"sourcesContent":["import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\n\nimport { registerTools } from \"./tools.js\";\n\nconst SERVER_INFO = {\n name: \"papermark-mcp\",\n version: \"0.1.0\",\n} as const;\n\nasync function main(): Promise<void> {\n const server = new McpServer(SERVER_INFO, { capabilities: { tools: {} } });\n registerTools(server);\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n\nmain().catch((err) => {\n process.stderr.write(\n `[papermark-mcp] fatal: ${err instanceof Error ? err.stack ?? err.message : String(err)}\\n`,\n );\n process.exit(1);\n});\n","import { readFile, stat } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { lookup as lookupMimeType } from \"mime-types\";\nimport { z } from \"zod\";\n\nimport { ApiError, AuthRequiredError, NetworkError, api } from \"./client.js\";\nimport {\n addDocumentVersionContract,\n attachDataroomDocumentContract,\n createDataroomContract,\n createDataroomFolderContract,\n createFolderContract,\n createLinkContract,\n deleteDataroomContract,\n deleteDataroomFolderContract,\n deleteDocumentContract,\n deleteFolderContract,\n deleteLinkContract,\n detachDataroomDocumentContract,\n getDataroomAnalyticsContract,\n getDataroomContract,\n getDataroomFolderContract,\n getDocumentAnalyticsContract,\n getDocumentContract,\n getDocumentVersionContract,\n getFolderContract,\n getLinkAnalyticsContract,\n getLinkContract,\n getViewAnalyticsContract,\n getVisitorContract,\n listDataroomDocumentsContract,\n listDataroomFoldersContract,\n listDataroomsContract,\n listDocumentVersionsContract,\n listDocumentsContract,\n listFoldersContract,\n listLinksContract,\n listLinkViewsContract,\n listVisitorViewsContract,\n listVisitorsContract,\n moveDataroomDocumentContract,\n moveDataroomFolderContract,\n moveFolderContract,\n promoteDocumentVersionContract,\n searchDataroomsContract,\n searchDocumentsContract,\n SHARED_TOOL_OUTPUT_SCHEMAS,\n documentOutputSchema,\n updateDataroomContract,\n updateDataroomFolderContract,\n updateDocumentContract,\n updateFolderContract,\n updateLinkContract,\n} from \"./tools-contract.js\";\n\ntype ToolResult = {\n content: Array<{ type: \"text\"; text: string }>;\n structuredContent?: Record<string, unknown>;\n isError?: boolean;\n};\n\nconst readTool = (openWorldHint = false) =>\n ({ readOnlyHint: true, destructiveHint: false, openWorldHint }) as const;\n\nconst writeTool = (openWorldHint = false) =>\n ({ readOnlyHint: false, destructiveHint: false, openWorldHint }) as const;\n\nconst destructiveTool = (openWorldHint = false) =>\n ({ readOnlyHint: false, destructiveHint: true, openWorldHint }) as const;\n\nconst TOOL_ANNOTATIONS: Record<\n string,\n { readOnlyHint?: boolean; destructiveHint?: boolean; openWorldHint?: boolean }\n> = {\n list_documents: readTool(),\n get_document: readTool(),\n search_documents: readTool(),\n upload_document: writeTool(true),\n create_link: writeTool(),\n list_links: readTool(),\n list_link_views: readTool(),\n list_datarooms: readTool(),\n search_datarooms: readTool(),\n get_dataroom: readTool(),\n create_dataroom: writeTool(),\n list_dataroom_documents: readTool(),\n list_visitors: readTool(),\n list_visitor_views: readTool(),\n get_document_analytics: readTool(),\n get_link_analytics: readTool(),\n get_dataroom_analytics: readTool(),\n get_view_analytics: readTool(),\n update_document: destructiveTool(),\n delete_document: destructiveTool(),\n list_document_versions: readTool(),\n get_document_version: readTool(),\n add_document_version: destructiveTool(true),\n promote_document_version: destructiveTool(),\n list_folders: readTool(),\n get_folder: readTool(),\n create_folder: writeTool(),\n update_folder: destructiveTool(),\n delete_folder: destructiveTool(),\n move_folder: destructiveTool(),\n get_link: readTool(),\n update_link: destructiveTool(),\n delete_link: destructiveTool(),\n update_dataroom: destructiveTool(),\n delete_dataroom: destructiveTool(),\n attach_dataroom_document: writeTool(),\n detach_dataroom_document: destructiveTool(),\n move_dataroom_document: destructiveTool(),\n list_dataroom_folders: readTool(),\n get_dataroom_folder: readTool(),\n create_dataroom_folder: writeTool(),\n update_dataroom_folder: destructiveTool(),\n delete_dataroom_folder: destructiveTool(),\n move_dataroom_folder: destructiveTool(),\n get_visitor: readTool(),\n};\n\nconst TOOL_OUTPUT_SCHEMAS: Record<string, unknown> = {\n ...SHARED_TOOL_OUTPUT_SCHEMAS,\n upload_document: documentOutputSchema,\n};\n\nfunction toStructuredContent(result: unknown): Record<string, unknown> {\n if (result && typeof result === \"object\" && !Array.isArray(result)) {\n return result as Record<string, unknown>;\n }\n return { result };\n}\n\nasync function run<T>(\n fn: () => Promise<T>,\n label: string,\n): Promise<ToolResult> {\n try {\n const result = await fn();\n const structuredContent = toStructuredContent(result);\n return {\n structuredContent,\n content: [\n { type: \"text\", text: JSON.stringify(structuredContent, null, 2) },\n ],\n };\n } catch (err) {\n if (err instanceof ApiError) {\n // Field-level validation detail from the v1 API (e.g. a 422's zod\n // `.flatten()` naming the offending field). Without this the caller\n // only sees the generic top-level message and can't self-correct.\n const detail =\n err.details !== undefined && err.details !== null\n ? `\\nDetails: ${JSON.stringify(err.details)}`\n : \"\";\n const hint = err.docUrl ? `\\nDocs: ${err.docUrl}` : \"\";\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text: `${label} failed (${err.status} ${err.code}): ${err.message}${detail}${hint}`,\n },\n ],\n };\n }\n if (err instanceof NetworkError) {\n return {\n isError: true,\n content: [{ type: \"text\", text: `${label} failed: ${err.message}` }],\n };\n }\n if (err instanceof AuthRequiredError) {\n return { isError: true, content: [{ type: \"text\", text: err.message }] };\n }\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text: `${label} failed: ${err instanceof Error ? err.message : String(err)}`,\n },\n ],\n };\n }\n}\n\nfunction guessContentType(fileName: string): string {\n return lookupMimeType(fileName) || \"application/octet-stream\";\n}\n\nfunction filenameFromUrl(rawUrl: string): string {\n try {\n const u = new URL(rawUrl);\n const last = u.pathname.split(\"/\").filter(Boolean).pop();\n if (!last) return \"document\";\n return decodeURIComponent(last);\n } catch {\n return \"document\";\n }\n}\n\nexport function registerTools(server: McpServer): void {\n const baseRegisterTool = server.registerTool.bind(server);\n server.registerTool = ((\n name: string,\n config: { annotations?: object; outputSchema?: unknown },\n cb: unknown,\n ) => {\n const annotations = TOOL_ANNOTATIONS[name];\n if (!annotations) {\n throw new Error(`MCP tool \"${name}\" has no annotations entry`);\n }\n const outputSchema = TOOL_OUTPUT_SCHEMAS[name];\n if (!outputSchema) {\n throw new Error(`MCP tool \"${name}\" has no output schema entry`);\n }\n return baseRegisterTool(\n name,\n {\n ...config,\n annotations: { ...annotations, ...config.annotations },\n outputSchema: config.outputSchema ?? outputSchema,\n } as never,\n cb as never,\n );\n }) as unknown as typeof server.registerTool;\n\n server.registerTool(\n listDocumentsContract.name,\n {\n title: listDocumentsContract.title,\n description: listDocumentsContract.description,\n inputSchema: listDocumentsContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const list = await api.listDocuments({\n limit: args.limit,\n cursor: args.cursor,\n query: args.query,\n });\n return {\n documents: list.data,\n next_cursor: list.next_cursor,\n };\n }, \"list_documents\"),\n );\n\n server.registerTool(\n getDocumentContract.name,\n {\n title: getDocumentContract.title,\n description: getDocumentContract.description,\n inputSchema: getDocumentContract.inputSchema,\n },\n async (args) =>\n run(() => api.getDocument(args.document_id), \"get_document\"),\n );\n\n server.registerTool(\n searchDocumentsContract.name,\n {\n title: searchDocumentsContract.title,\n description: searchDocumentsContract.description,\n inputSchema: searchDocumentsContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const list = await api.searchDocuments(args.query, args.limit);\n return {\n documents: list.data,\n next_cursor: list.next_cursor,\n };\n }, \"search_documents\"),\n );\n\n // upload_document stays local to the stdio transport because it can read\n // the user's filesystem. The remote HTTP adapter exposes a stripped-down\n // variant that only accepts source_url.\n server.registerTool(\n \"upload_document\",\n {\n title: \"Upload a document\",\n description: `Add a document to Papermark from a local file path, a public HTTPS URL to fetch, OR a non-file source (an external link / public Notion page).\n\nWORKFLOW:\n(1) Resolve the source — exactly one of:\n • \\`file_path\\` (local filesystem — stdio mode only). Never guess a path; if the user attached a file in chat but didn't give a local path, ASK them to save it and provide the path.\n • \\`source_url\\` (public HTTPS) — the server fetches and stores the file.\n • \\`type\\` (\\`link\\` or \\`notion\\`) + \\`external_url\\` — stores a document that points at the URL without downloading it. Use \\`notion\\` for a publicly-accessible Notion page, \\`link\\` for any other external page.\n(2) Confirm the target \\`name\\` if the user wants something other than the filename / URL.\n(3) If the user wants a share link in the same breath, set \\`create_link: true\\` — otherwise follow up with \\`create_link\\` so you can set password/expiry/email gating explicitly.\n\nDon't add any source the user didn't explicitly point at. Requires scope \\`documents.write\\`.`,\n inputSchema: {\n file_path: z\n .string()\n .optional()\n .describe(\n \"Absolute local path — only works when the MCP server runs on the same machine as the file (stdio mode)\",\n ),\n source_url: z\n .string()\n .url()\n .refine((s) => s.startsWith(\"https://\"), {\n message:\n \"source_url must use https:// (http is rejected by the API)\",\n })\n .optional()\n .describe(\n \"Public HTTPS URL the server should fetch and store (alternative to file_path)\",\n ),\n type: z\n .enum([\"link\", \"notion\"])\n .optional()\n .describe(\n \"Create a non-file document from `external_url`: `link` (any external page) or `notion` (a public Notion page). Omit for file uploads via file_path/source_url.\",\n ),\n external_url: z\n .string()\n .url()\n .refine((s) => s.startsWith(\"https://\"), {\n message:\n \"external_url must use https:// (http is rejected by the API)\",\n })\n .optional()\n .describe(\n \"Target URL stored as-is (not downloaded) for `type` link/notion documents. Required when `type` is set.\",\n ),\n name: z\n .string()\n .optional()\n .describe(\"Display name; defaults to the filename or URL\"),\n content_type: z\n .string()\n .optional()\n .describe(\"MIME type; inferred from extension when omitted\"),\n folder_id: z\n .string()\n .optional()\n .describe(\n \"Destination folder id (created beforehand via `create_folder`). Omit for the team-library root.\",\n ),\n create_link: z\n .boolean()\n .optional()\n .describe(\"Create a default share link after upload\"),\n },\n },\n async (args) =>\n run(async () => {\n // Non-file documents (link / notion): store the URL as-is.\n if (args.type) {\n if (!args.external_url) {\n throw new Error(\n `external_url is required when type is \"${args.type}\".`,\n );\n }\n if (args.file_path || args.source_url) {\n throw new Error(\n \"For type link/notion, provide external_url only (not file_path or source_url).\",\n );\n }\n const doc = await api.createDocument({\n name: args.name ?? args.external_url,\n type: args.type,\n external_url: args.external_url,\n folder_id: args.folder_id,\n create_link: args.create_link,\n });\n return { document: doc };\n }\n if (args.external_url) {\n throw new Error(\n 'external_url requires type to be \"link\" or \"notion\".',\n );\n }\n\n if (!args.file_path && !args.source_url) {\n throw new Error(\n \"Provide either file_path (local) or source_url (remote).\",\n );\n }\n if (args.file_path && args.source_url) {\n throw new Error(\"Provide only one of file_path or source_url.\");\n }\n\n if (args.source_url) {\n // Parse via URL so query strings and fragments don't end up in the\n // inferred filename — `https://example.com/x.pdf?token=abc` should\n // be `x.pdf`, not `x.pdf?token=abc`.\n const name = args.name ?? filenameFromUrl(args.source_url);\n const doc = await api.createDocument({\n name,\n source_url: args.source_url,\n folder_id: args.folder_id,\n create_link: args.create_link,\n });\n return { document: doc };\n }\n\n const filePath = args.file_path!;\n const stats = await stat(filePath);\n const fileName = basename(filePath);\n const contentType = args.content_type ?? guessContentType(fileName);\n const body = await readFile(filePath);\n\n const presigned = await api.uploadUrl({\n file_name: fileName,\n content_type: contentType,\n content_length: stats.size,\n });\n\n // Bound the PUT so a hung S3 / Vercel Blob connection can't park the\n // agent loop forever. 5 minutes is generous — a 200MB upload on a\n // slow link still fits — but bounded enough that a truly stuck\n // connection surfaces as a typed error instead of an indefinite wait.\n const putController = new AbortController();\n const putTimer = setTimeout(() => putController.abort(), 5 * 60_000);\n let put: Response;\n try {\n put = await fetch(presigned.upload_url, {\n method: \"PUT\",\n headers: presigned.required_headers,\n body,\n signal: putController.signal,\n });\n } catch (err) {\n if (\n putController.signal.aborted ||\n (err instanceof Error && err.name === \"AbortError\")\n ) {\n throw new Error(\n \"Storage PUT aborted: presigned upload exceeded 5 minute timeout. The connection to object storage stalled — retry with a smaller file or a faster network.\",\n );\n }\n throw err;\n } finally {\n clearTimeout(putTimer);\n }\n if (!put.ok) {\n throw new Error(\n `Storage PUT failed: HTTP ${put.status} ${put.statusText}`,\n );\n }\n\n const doc = await api.createDocument({\n name: args.name ?? fileName,\n upload_id: presigned.upload_id,\n folder_id: args.folder_id,\n create_link: args.create_link,\n });\n return { document: doc };\n }, \"upload_document\"),\n );\n\n server.registerTool(\n createLinkContract.name,\n {\n title: createLinkContract.title,\n description: createLinkContract.description,\n inputSchema: createLinkContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const hasDoc = Boolean(args.document_id);\n const hasDr = Boolean(args.dataroom_id);\n if (!hasDoc && !hasDr) {\n throw new Error(\"Provide document_id or dataroom_id.\");\n }\n if (hasDoc && hasDr) {\n throw new Error(\n \"Provide exactly one of document_id or dataroom_id, not both.\",\n );\n }\n const link = await api.createLink(args);\n return { link };\n }, \"create_link\"),\n );\n\n server.registerTool(\n listLinksContract.name,\n {\n title: listLinksContract.title,\n description: listLinksContract.description,\n inputSchema: listLinksContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const list = await api.listLinks(args);\n return {\n links: list.data,\n next_cursor: list.next_cursor,\n };\n }, \"list_links\"),\n );\n\n server.registerTool(\n listLinkViewsContract.name,\n {\n title: listLinkViewsContract.title,\n description: listLinkViewsContract.description,\n inputSchema: listLinkViewsContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const list = await api.listViews(args.link_id, {\n limit: args.limit,\n cursor: args.cursor,\n });\n return {\n views: list.data,\n next_cursor: list.next_cursor,\n };\n }, \"list_link_views\"),\n );\n\n // ─── Datarooms ───────────────────────────────────────────────────────\n server.registerTool(\n listDataroomsContract.name,\n {\n title: listDataroomsContract.title,\n description: listDataroomsContract.description,\n inputSchema: listDataroomsContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const list = await api.listDatarooms(args);\n return { datarooms: list.data, next_cursor: list.next_cursor };\n }, \"list_datarooms\"),\n );\n\n server.registerTool(\n searchDataroomsContract.name,\n {\n title: searchDataroomsContract.title,\n description: searchDataroomsContract.description,\n inputSchema: searchDataroomsContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const list = await api.listDatarooms({\n query: args.query,\n limit: args.limit ?? 10,\n });\n return { datarooms: list.data, next_cursor: list.next_cursor };\n }, \"search_datarooms\"),\n );\n\n server.registerTool(\n getDataroomContract.name,\n {\n title: getDataroomContract.title,\n description: getDataroomContract.description,\n inputSchema: getDataroomContract.inputSchema,\n },\n async (args) =>\n run(() => api.getDataroom(args.dataroom_id), \"get_dataroom\"),\n );\n\n server.registerTool(\n createDataroomContract.name,\n {\n title: createDataroomContract.title,\n description: createDataroomContract.description,\n inputSchema: createDataroomContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const dr = await api.createDataroom(args);\n return { dataroom: dr };\n }, \"create_dataroom\"),\n );\n\n server.registerTool(\n listDataroomDocumentsContract.name,\n {\n title: listDataroomDocumentsContract.title,\n description: listDataroomDocumentsContract.description,\n inputSchema: listDataroomDocumentsContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const list = await api.listDataroomDocuments(args.dataroom_id, {\n limit: args.limit,\n cursor: args.cursor,\n folder_id: args.folder_id,\n });\n return { documents: list.data, next_cursor: list.next_cursor };\n }, \"list_dataroom_documents\"),\n );\n\n // ─── Visitors ────────────────────────────────────────────────────────\n server.registerTool(\n listVisitorsContract.name,\n {\n title: listVisitorsContract.title,\n description: listVisitorsContract.description,\n inputSchema: listVisitorsContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const list = await api.listVisitors(args);\n return { visitors: list.data, next_cursor: list.next_cursor };\n }, \"list_visitors\"),\n );\n\n server.registerTool(\n listVisitorViewsContract.name,\n {\n title: listVisitorViewsContract.title,\n description: listVisitorViewsContract.description,\n inputSchema: listVisitorViewsContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const list = await api.listVisitorViews(args.visitor_id, {\n limit: args.limit,\n cursor: args.cursor,\n });\n return { views: list.data, next_cursor: list.next_cursor };\n }, \"list_visitor_views\"),\n );\n\n // ─── Analytics ───────────────────────────────────────────────────────\n server.registerTool(\n getDocumentAnalyticsContract.name,\n {\n title: getDocumentAnalyticsContract.title,\n description: getDocumentAnalyticsContract.description,\n inputSchema: getDocumentAnalyticsContract.inputSchema,\n },\n async (args) =>\n run(\n () =>\n api.documentAnalytics(args.document_id, {\n since: args.since,\n until: args.until,\n }),\n \"get_document_analytics\",\n ),\n );\n\n server.registerTool(\n getLinkAnalyticsContract.name,\n {\n title: getLinkAnalyticsContract.title,\n description: getLinkAnalyticsContract.description,\n inputSchema: getLinkAnalyticsContract.inputSchema,\n },\n async (args) =>\n run(\n () =>\n api.linkAnalytics(args.link_id, {\n since: args.since,\n until: args.until,\n }),\n \"get_link_analytics\",\n ),\n );\n\n server.registerTool(\n getDataroomAnalyticsContract.name,\n {\n title: getDataroomAnalyticsContract.title,\n description: getDataroomAnalyticsContract.description,\n inputSchema: getDataroomAnalyticsContract.inputSchema,\n },\n async (args) =>\n run(\n () =>\n api.dataroomAnalytics(args.dataroom_id, {\n since: args.since,\n until: args.until,\n }),\n \"get_dataroom_analytics\",\n ),\n );\n\n server.registerTool(\n getViewAnalyticsContract.name,\n {\n title: getViewAnalyticsContract.title,\n description: getViewAnalyticsContract.description,\n inputSchema: getViewAnalyticsContract.inputSchema,\n },\n async (args) =>\n run(() => api.viewAnalytics(args.view_id), \"get_view_analytics\"),\n );\n\n // ─── Document mutations ──────────────────────────────────────────────\n server.registerTool(\n updateDocumentContract.name,\n {\n title: updateDocumentContract.title,\n description: updateDocumentContract.description,\n inputSchema: updateDocumentContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const body: { name?: string; folder_id?: string | null } = {};\n if (args.name !== undefined) body.name = args.name;\n if (args.folder_id !== undefined) body.folder_id = args.folder_id;\n if (Object.keys(body).length === 0) {\n throw new Error(\"Provide at least one of `name` or `folder_id`.\");\n }\n const doc = await api.updateDocument(args.document_id, body);\n return { document: doc };\n }, \"update_document\"),\n );\n\n server.registerTool(\n deleteDocumentContract.name,\n {\n title: deleteDocumentContract.title,\n description: deleteDocumentContract.description,\n inputSchema: deleteDocumentContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n return await api.deleteDocument(args.document_id);\n }, \"delete_document\"),\n );\n\n // ─── Document versions ───────────────────────────────────────────────\n server.registerTool(\n listDocumentVersionsContract.name,\n {\n title: listDocumentVersionsContract.title,\n description: listDocumentVersionsContract.description,\n inputSchema: listDocumentVersionsContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const list = await api.listDocumentVersions(args.document_id);\n return { versions: list.data };\n }, \"list_document_versions\"),\n );\n\n server.registerTool(\n getDocumentVersionContract.name,\n {\n title: getDocumentVersionContract.title,\n description: getDocumentVersionContract.description,\n inputSchema: getDocumentVersionContract.inputSchema,\n },\n async (args) =>\n run(\n () => api.getDocumentVersion(args.document_id, args.version_id),\n \"get_document_version\",\n ),\n );\n\n server.registerTool(\n addDocumentVersionContract.name,\n {\n title: addDocumentVersionContract.title,\n description: addDocumentVersionContract.description,\n inputSchema: addDocumentVersionContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n if (!!args.source_url === !!args.external_url) {\n throw new Error(\n \"Provide exactly one of source_url (file documents) or external_url (link/notion documents).\",\n );\n }\n const v = await api.addDocumentVersion(args.document_id, {\n source_url: args.source_url,\n external_url: args.external_url,\n });\n return { version: v };\n }, \"add_document_version\"),\n );\n\n server.registerTool(\n promoteDocumentVersionContract.name,\n {\n title: promoteDocumentVersionContract.title,\n description: promoteDocumentVersionContract.description,\n inputSchema: promoteDocumentVersionContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const v = await api.promoteDocumentVersion(\n args.document_id,\n args.version_id,\n );\n return { version: v };\n }, \"promote_document_version\"),\n );\n\n // ─── Folders ─────────────────────────────────────────────────────────\n server.registerTool(\n listFoldersContract.name,\n {\n title: listFoldersContract.title,\n description: listFoldersContract.description,\n inputSchema: listFoldersContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const list = await api.listFolders(args);\n return { folders: list.data, next_cursor: list.next_cursor };\n }, \"list_folders\"),\n );\n\n server.registerTool(\n getFolderContract.name,\n {\n title: getFolderContract.title,\n description: getFolderContract.description,\n inputSchema: getFolderContract.inputSchema,\n },\n async (args) => run(() => api.getFolder(args.folder_id), \"get_folder\"),\n );\n\n server.registerTool(\n createFolderContract.name,\n {\n title: createFolderContract.title,\n description: createFolderContract.description,\n inputSchema: createFolderContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const f = await api.createFolder(args);\n return { folder: f };\n }, \"create_folder\"),\n );\n\n server.registerTool(\n updateFolderContract.name,\n {\n title: updateFolderContract.title,\n description: updateFolderContract.description,\n inputSchema: updateFolderContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const body: Parameters<typeof api.updateFolder>[1] = {};\n if (args.name !== undefined) body.name = args.name;\n if (args.icon !== undefined) body.icon = args.icon;\n if (args.color !== undefined) body.color = args.color;\n if (Object.keys(body).length === 0) {\n throw new Error(\"Provide at least one of `name`, `icon`, `color`.\");\n }\n const f = await api.updateFolder(args.folder_id, body);\n return { folder: f };\n }, \"update_folder\"),\n );\n\n server.registerTool(\n deleteFolderContract.name,\n {\n title: deleteFolderContract.title,\n description: deleteFolderContract.description,\n inputSchema: deleteFolderContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n return await api.deleteFolder(args.folder_id, {\n cascade: args.cascade,\n });\n }, \"delete_folder\"),\n );\n\n server.registerTool(\n moveFolderContract.name,\n {\n title: moveFolderContract.title,\n description: moveFolderContract.description,\n inputSchema: moveFolderContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const f = await api.moveFolder(args.folder_id, {\n parent_id: args.parent_id,\n });\n return { folder: f };\n }, \"move_folder\"),\n );\n\n // ─── Link mutations ──────────────────────────────────────────────────\n server.registerTool(\n getLinkContract.name,\n {\n title: getLinkContract.title,\n description: getLinkContract.description,\n inputSchema: getLinkContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const link = await api.getLink(args.link_id);\n return { link };\n }, \"get_link\"),\n );\n\n server.registerTool(\n updateLinkContract.name,\n {\n title: updateLinkContract.title,\n description: updateLinkContract.description,\n inputSchema: updateLinkContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const { link_id, ...rest } = args;\n if (Object.keys(rest).length === 0) {\n throw new Error(\"Provide at least one field to update.\");\n }\n const link = await api.updateLink(link_id, rest);\n return { link };\n }, \"update_link\"),\n );\n\n server.registerTool(\n deleteLinkContract.name,\n {\n title: deleteLinkContract.title,\n description: deleteLinkContract.description,\n inputSchema: deleteLinkContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n return await api.deleteLink(args.link_id);\n }, \"delete_link\"),\n );\n\n // ─── Dataroom mutations ──────────────────────────────────────────────\n server.registerTool(\n updateDataroomContract.name,\n {\n title: updateDataroomContract.title,\n description: updateDataroomContract.description,\n inputSchema: updateDataroomContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const { dataroom_id, ...rest } = args;\n if (Object.keys(rest).length === 0) {\n throw new Error(\"Provide at least one field to update.\");\n }\n const dr = await api.updateDataroom(dataroom_id, rest);\n return { dataroom: dr };\n }, \"update_dataroom\"),\n );\n\n server.registerTool(\n deleteDataroomContract.name,\n {\n title: deleteDataroomContract.title,\n description: deleteDataroomContract.description,\n inputSchema: deleteDataroomContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n return await api.deleteDataroom(args.dataroom_id);\n }, \"delete_dataroom\"),\n );\n\n server.registerTool(\n attachDataroomDocumentContract.name,\n {\n title: attachDataroomDocumentContract.title,\n description: attachDataroomDocumentContract.description,\n inputSchema: attachDataroomDocumentContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const item = await api.attachDataroomDocument(args.dataroom_id, {\n document_id: args.document_id,\n folder_id: args.folder_id,\n });\n return { item };\n }, \"attach_dataroom_document\"),\n );\n\n server.registerTool(\n detachDataroomDocumentContract.name,\n {\n title: detachDataroomDocumentContract.title,\n description: detachDataroomDocumentContract.description,\n inputSchema: detachDataroomDocumentContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n return await api.detachDataroomDocument(\n args.dataroom_id,\n args.dataroom_document_id,\n );\n }, \"detach_dataroom_document\"),\n );\n\n server.registerTool(\n moveDataroomDocumentContract.name,\n {\n title: moveDataroomDocumentContract.title,\n description: moveDataroomDocumentContract.description,\n inputSchema: moveDataroomDocumentContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const item = await api.moveDataroomDocument(\n args.dataroom_id,\n args.dataroom_document_id,\n { folder_id: args.folder_id },\n );\n return { item };\n }, \"move_dataroom_document\"),\n );\n\n // ─── Dataroom folders ────────────────────────────────────────────────\n server.registerTool(\n listDataroomFoldersContract.name,\n {\n title: listDataroomFoldersContract.title,\n description: listDataroomFoldersContract.description,\n inputSchema: listDataroomFoldersContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const list = await api.listDataroomFolders(args.dataroom_id, {\n parent_id: args.parent_id,\n limit: args.limit,\n cursor: args.cursor,\n });\n return { folders: list.data, next_cursor: list.next_cursor };\n }, \"list_dataroom_folders\"),\n );\n\n server.registerTool(\n getDataroomFolderContract.name,\n {\n title: getDataroomFolderContract.title,\n description: getDataroomFolderContract.description,\n inputSchema: getDataroomFolderContract.inputSchema,\n },\n async (args) =>\n run(\n () => api.getDataroomFolder(args.dataroom_id, args.folder_id),\n \"get_dataroom_folder\",\n ),\n );\n\n server.registerTool(\n createDataroomFolderContract.name,\n {\n title: createDataroomFolderContract.title,\n description: createDataroomFolderContract.description,\n inputSchema: createDataroomFolderContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const { dataroom_id, ...body } = args;\n const f = await api.createDataroomFolder(dataroom_id, body);\n return { folder: f };\n }, \"create_dataroom_folder\"),\n );\n\n server.registerTool(\n updateDataroomFolderContract.name,\n {\n title: updateDataroomFolderContract.title,\n description: updateDataroomFolderContract.description,\n inputSchema: updateDataroomFolderContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const body: Parameters<typeof api.updateDataroomFolder>[2] = {};\n if (args.name !== undefined) body.name = args.name;\n if (args.icon !== undefined) body.icon = args.icon;\n if (args.color !== undefined) body.color = args.color;\n if (Object.keys(body).length === 0) {\n throw new Error(\"Provide at least one of `name`, `icon`, `color`.\");\n }\n const f = await api.updateDataroomFolder(\n args.dataroom_id,\n args.folder_id,\n body,\n );\n return { folder: f };\n }, \"update_dataroom_folder\"),\n );\n\n server.registerTool(\n deleteDataroomFolderContract.name,\n {\n title: deleteDataroomFolderContract.title,\n description: deleteDataroomFolderContract.description,\n inputSchema: deleteDataroomFolderContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n return await api.deleteDataroomFolder(\n args.dataroom_id,\n args.folder_id,\n { cascade: args.cascade },\n );\n }, \"delete_dataroom_folder\"),\n );\n\n server.registerTool(\n moveDataroomFolderContract.name,\n {\n title: moveDataroomFolderContract.title,\n description: moveDataroomFolderContract.description,\n inputSchema: moveDataroomFolderContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const f = await api.moveDataroomFolder(\n args.dataroom_id,\n args.folder_id,\n { parent_id: args.parent_id },\n );\n return { folder: f };\n }, \"move_dataroom_folder\"),\n );\n\n // ─── Visitors ────────────────────────────────────────────────────────\n server.registerTool(\n getVisitorContract.name,\n {\n title: getVisitorContract.title,\n description: getVisitorContract.description,\n inputSchema: getVisitorContract.inputSchema,\n },\n async (args) => run(() => api.getVisitor(args.visitor_id), \"get_visitor\"),\n );\n}\n","const DEFAULT_API_URL = \"https://api.papermark.com\";\n\nexport function getToken(): string | undefined {\n return process.env.PAPERMARK_TOKEN?.trim() || undefined;\n}\n\nexport function getApiUrl(): string {\n return process.env.PAPERMARK_API_URL?.trim() || DEFAULT_API_URL;\n}\n","import { getApiUrl, getToken } from \"./config.js\";\n\nexport interface ApiErrorBody {\n error: {\n code: string;\n message: string;\n doc_url?: string;\n details?: unknown;\n };\n}\n\nexport class ApiError extends Error {\n code: string;\n status: number;\n docUrl?: string;\n details?: unknown;\n\n constructor(status: number, body: ApiErrorBody[\"error\"] | string) {\n const message = typeof body === \"string\" ? body : body.message;\n super(message);\n this.status = status;\n if (typeof body === \"string\") {\n this.code = \"unknown\";\n } else {\n this.code = body.code;\n this.docUrl = body.doc_url;\n this.details = body.details;\n }\n }\n}\n\nexport class AuthRequiredError extends Error {\n constructor() {\n super(\n \"No API token configured. Set PAPERMARK_TOKEN in the MCP server env (get one from papermark.com/settings/tokens).\",\n );\n this.name = \"AuthRequiredError\";\n }\n}\n\nexport class NetworkError extends Error {\n url: string;\n cause: unknown;\n constructor(url: string, cause: unknown) {\n const reason = extractNetworkReason(cause);\n super(`Network request to ${url} failed: ${reason}`);\n this.name = \"NetworkError\";\n this.url = url;\n this.cause = cause;\n }\n}\n\nfunction extractNetworkReason(err: unknown): string {\n if (err && typeof err === \"object\" && \"cause\" in err) {\n const c = (err as { cause: unknown }).cause;\n if (c && typeof c === \"object\") {\n const code = (c as { code?: string }).code;\n const msg = (c as { message?: string }).message;\n if (code || msg) return `${code ?? \"\"}${code && msg ? \" — \" : \"\"}${msg ?? \"\"}`.trim();\n }\n }\n if (err instanceof Error) return err.message;\n return String(err);\n}\n\ninterface RequestOptions {\n method?: string;\n body?: unknown;\n query?: Record<string, string | number | undefined>;\n anonymous?: boolean;\n headers?: Record<string, string>;\n /** Override the token for this call (used by OAuth transport layer). */\n token?: string;\n /** Per-request timeout in ms; defaults to DEFAULT_TIMEOUT_MS. */\n timeout?: number;\n}\n\n// 60s is generous for v1 endpoints (most return in <1s) but covers the slow\n// Tinybird-backed analytics calls that sometimes take 5-10s on cold caches.\nconst DEFAULT_TIMEOUT_MS = 60_000;\n\nfunction buildUrl(path: string, query?: RequestOptions[\"query\"]): string {\n const base = getApiUrl().replace(/\\/$/, \"\");\n let fullPath = path.startsWith(\"/\") ? path : `/${path}`;\n if (base.endsWith(\"/api\") && fullPath.startsWith(\"/api/\")) {\n fullPath = fullPath.slice(4);\n }\n const url = new URL(base + fullPath);\n if (query) {\n for (const [k, v] of Object.entries(query)) {\n if (v !== undefined && v !== null && v !== \"\") {\n url.searchParams.set(k, String(v));\n }\n }\n }\n return url.toString();\n}\n\nexport async function request<T = unknown>(\n path: string,\n opts: RequestOptions = {},\n): Promise<T> {\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n ...(opts.headers ?? {}),\n };\n if (!opts.anonymous) {\n const token = opts.token ?? getToken();\n if (!token) throw new AuthRequiredError();\n headers.Authorization = `Bearer ${token}`;\n }\n let body: BodyInit | undefined;\n if (opts.body !== undefined) {\n if (opts.body instanceof Uint8Array || opts.body instanceof ArrayBuffer) {\n body = opts.body as BodyInit;\n } else {\n body = JSON.stringify(opts.body);\n headers[\"Content-Type\"] = \"application/json\";\n }\n }\n\n const url = buildUrl(path, opts.query);\n // Time out stalled upstream connections so an MCP tool call doesn't hang\n // the agent loop. AbortError surfaces through the same NetworkError path\n // as DNS / TLS failures so callers see one error type for \"the request\n // never produced a response\".\n const controller = new AbortController();\n const timeoutMs = opts.timeout ?? DEFAULT_TIMEOUT_MS;\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n let res: Response;\n try {\n res = await fetch(url, {\n method: opts.method ?? (opts.body ? \"POST\" : \"GET\"),\n headers,\n body,\n signal: controller.signal,\n });\n } catch (err) {\n if (\n controller.signal.aborted ||\n (err instanceof Error && err.name === \"AbortError\")\n ) {\n throw new NetworkError(\n url,\n new Error(`Request exceeded ${timeoutMs}ms timeout`),\n );\n }\n throw new NetworkError(url, err);\n } finally {\n clearTimeout(timer);\n }\n\n if (res.status === 204) return undefined as T;\n\n const text = await res.text();\n const parsed = text ? safeParseJson(text) : null;\n\n if (!res.ok) {\n if (parsed && typeof parsed === \"object\" && \"error\" in parsed) {\n throw new ApiError(res.status, (parsed as ApiErrorBody).error);\n }\n const looksLikeHtml = text.trimStart().toLowerCase().startsWith(\"<\");\n const msg = looksLikeHtml\n ? `HTTP ${res.status} (server returned HTML, not JSON — is the API reachable?)`\n : text || `HTTP ${res.status}`;\n throw new ApiError(res.status, msg);\n }\n\n return (parsed as T) ?? (undefined as T);\n}\n\nfunction safeParseJson(s: string): unknown {\n try {\n return JSON.parse(s);\n } catch {\n return null;\n }\n}\n\nexport interface PublicDocument {\n id: string;\n object: \"document\";\n name: string;\n type: string | null;\n content_type: string | null;\n // Target URL for `link`/`notion` documents; null for file-based documents.\n url: string | null;\n num_pages: number | null;\n folder_id: string | null;\n created: string;\n updated_at: string;\n}\n\nexport interface PublicDocumentVersion {\n id: string;\n object: \"document_version\";\n version_number: number;\n is_primary: boolean;\n type: string | null;\n content_type: string | null;\n num_pages: number | null;\n file_size: number | null;\n created: string;\n updated_at: string;\n}\n\nexport interface DocumentVersionList {\n data: PublicDocumentVersion[];\n}\n\nexport type FolderIcon =\n | \"folder\"\n | \"folder-open\"\n | \"briefcase\"\n | \"archive\"\n | \"box\"\n | \"file\"\n | \"book\"\n | \"bookmark\"\n | \"star\"\n | \"heart\"\n | \"lock\"\n | \"shield\"\n | \"users\"\n | \"settings\"\n | \"tag\"\n | \"layers\"\n | \"globe\"\n | \"home\"\n | \"mail\"\n | \"image\"\n | \"video\"\n | \"music\"\n | \"palette\"\n | \"pen-tool\"\n | \"lightbulb\"\n | \"zap\"\n | \"wrench\"\n | \"sparkles\"\n | \"cloud\"\n | \"flag\"\n | \"award\"\n | \"flame\"\n | \"bell\"\n | \"sun\"\n | \"hash\";\n\nexport type FolderColor =\n | \"gray\"\n | \"red\"\n | \"orange\"\n | \"yellow\"\n | \"green\"\n | \"blue\"\n | \"black\";\n\nexport interface PublicFolder {\n id: string;\n object: \"folder\";\n name: string;\n parent_id: string | null;\n path: string;\n icon: string | null;\n color: string | null;\n document_count: number;\n child_folder_count: number;\n created: string;\n updated_at: string;\n}\n\nexport interface FolderList {\n data: PublicFolder[];\n next_cursor: string | null;\n}\n\nexport interface PublicDataroomFolder {\n id: string;\n object: \"dataroom_folder\";\n name: string;\n parent_id: string | null;\n path: string;\n icon: string | null;\n color: string | null;\n document_count: number;\n child_folder_count: number;\n order_index: number | null;\n created: string;\n updated_at: string;\n}\n\nexport interface DataroomFolderList {\n data: PublicDataroomFolder[];\n next_cursor: string | null;\n}\n\nexport interface DocumentList {\n data: PublicDocument[];\n next_cursor: string | null;\n}\n\nexport interface UploadUrlResponse {\n upload_url: string;\n upload_id: string;\n required_headers: Record<string, string>;\n expires_at: string;\n}\n\nexport type WatermarkPosition =\n | \"top-left\"\n | \"top-center\"\n | \"top-right\"\n | \"middle-left\"\n | \"middle-center\"\n | \"middle-right\"\n | \"bottom-left\"\n | \"bottom-center\"\n | \"bottom-right\";\n\nexport type WatermarkRotation = 0 | 30 | 45 | 90 | 180;\n\nexport interface WatermarkConfig {\n text: string;\n is_tiled: boolean;\n position: WatermarkPosition;\n rotation: WatermarkRotation;\n color: string;\n font_size: number;\n opacity: number;\n}\n\nexport interface PublicLink {\n id: string;\n object: \"link\";\n name: string | null;\n target_type: \"document\" | \"dataroom\";\n document_id: string | null;\n dataroom_id: string | null;\n url: string;\n domain: string | null;\n slug: string | null;\n expires_at: string | null;\n is_password_protected: boolean;\n email_protected: boolean;\n email_authenticated: boolean;\n allow_download: boolean;\n allow_list: string[];\n deny_list: string[];\n enable_watermark: boolean;\n watermark_config: WatermarkConfig | null;\n enable_feedback: boolean;\n enable_screenshot_protection: boolean;\n enable_confidential_view: boolean;\n created: string;\n updated_at: string;\n}\n\nexport interface LinkList {\n data: PublicLink[];\n next_cursor: string | null;\n}\n\nexport interface PublicView {\n id: string;\n object: \"view\";\n link_id: string | null;\n document_id: string | null;\n dataroom_id: string | null;\n viewer_email: string | null;\n view_type: string | null;\n viewed_at: string;\n downloaded_at: string | null;\n download_type: string | null;\n}\n\nexport interface ViewList {\n data: PublicView[];\n next_cursor: string | null;\n}\n\nexport interface UpdateDocumentBody {\n name?: string;\n folder_id?: string | null;\n}\n\nexport interface UpdateLinkBody {\n name?: string;\n expires_at?: string | null;\n password?: string | null;\n email_protected?: boolean;\n email_authenticated?: boolean;\n allow_download?: boolean;\n allow_list?: string[];\n deny_list?: string[];\n enable_watermark?: boolean;\n watermark_config?: WatermarkConfig | null;\n enable_screenshot_protection?: boolean;\n enable_confidential_view?: boolean;\n}\n\n// Uniform acknowledgment returned by every v1 DELETE endpoint.\nexport interface DeletedObject {\n id: string;\n object:\n | \"document\"\n | \"folder\"\n | \"link\"\n | \"dataroom\"\n | \"dataroom_folder\"\n | \"dataroom_document\";\n deleted: true;\n}\n\nexport const api = {\n // Documents\n listDocuments: (\n query?: { limit?: number; cursor?: string; query?: string },\n token?: string,\n ) => request<DocumentList>(\"/v1/documents\", { query, token }),\n\n getDocument: (id: string, token?: string) =>\n request<PublicDocument>(`/v1/documents/${id}`, { token }),\n\n searchDocuments: (q: string, limit?: number, token?: string) =>\n request<DocumentList>(\"/v1/documents/search\", { query: { q, limit }, token }),\n\n updateDocument: (id: string, body: UpdateDocumentBody, token?: string) =>\n request<PublicDocument>(`/v1/documents/${id}`, {\n method: \"PATCH\",\n body,\n token,\n }),\n\n deleteDocument: (id: string, token?: string) =>\n request<DeletedObject>(`/v1/documents/${id}`, { method: \"DELETE\", token }),\n\n uploadUrl: (\n body: { file_name: string; content_type: string; content_length?: number },\n token?: string,\n ) =>\n request<UploadUrlResponse>(\"/v1/documents/upload-url\", {\n method: \"POST\",\n body,\n token,\n }),\n\n createDocument: (\n body: {\n name: string;\n // Set to create a non-file document from `external_url`: `link` (any\n // external page) or `notion` (a public Notion page). Omit for file-based\n // documents created via `upload_id` or `source_url`.\n type?: \"link\" | \"notion\";\n upload_id?: string;\n source_url?: string;\n external_url?: string;\n folder_id?: string;\n create_link?: boolean;\n },\n token?: string,\n ) =>\n request<PublicDocument>(\"/v1/documents\", { method: \"POST\", body, token }),\n\n // Document versions\n listDocumentVersions: (id: string, token?: string) =>\n request<DocumentVersionList>(`/v1/documents/${id}/versions`, { token }),\n addDocumentVersion: (\n id: string,\n // `external_url` repoints a link/notion document at a new URL (preserved\n // type); upload_id/source_url replace a file document's bytes.\n body: { upload_id?: string; source_url?: string; external_url?: string },\n token?: string,\n ) =>\n request<PublicDocumentVersion>(`/v1/documents/${id}/versions`, {\n method: \"POST\",\n body,\n token,\n }),\n getDocumentVersion: (id: string, vid: string, token?: string) =>\n request<PublicDocumentVersion>(`/v1/documents/${id}/versions/${vid}`, {\n token,\n }),\n promoteDocumentVersion: (id: string, vid: string, token?: string) =>\n request<PublicDocumentVersion>(`/v1/documents/${id}/versions/${vid}`, {\n method: \"PATCH\",\n body: { is_primary: true },\n token,\n }),\n\n // Folders\n listFolders: (\n query?: { limit?: number; cursor?: string; parent_id?: string },\n token?: string,\n ) => request<FolderList>(\"/v1/folders\", { query, token }),\n createFolder: (\n body: {\n name: string;\n parent_id?: string | null;\n icon?: FolderIcon;\n color?: FolderColor;\n },\n token?: string,\n ) => request<PublicFolder>(\"/v1/folders\", { method: \"POST\", body, token }),\n getFolder: (id: string, token?: string) =>\n request<PublicFolder>(`/v1/folders/${id}`, { token }),\n updateFolder: (\n id: string,\n body: { name?: string; icon?: FolderIcon | null; color?: FolderColor | null },\n token?: string,\n ) =>\n request<PublicFolder>(`/v1/folders/${id}`, { method: \"PATCH\", body, token }),\n deleteFolder: (id: string, opts?: { cascade?: boolean }, token?: string) =>\n request<DeletedObject>(`/v1/folders/${id}`, {\n method: \"DELETE\",\n query: opts?.cascade ? { cascade: \"true\" } : undefined,\n token,\n }),\n moveFolder: (\n id: string,\n body: { parent_id: string | null },\n token?: string,\n ) =>\n request<PublicFolder>(`/v1/folders/${id}/move`, {\n method: \"POST\",\n body,\n token,\n }),\n\n // Links\n listLinks: (\n query?: {\n limit?: number;\n cursor?: string;\n document_id?: string;\n dataroom_id?: string;\n },\n token?: string,\n ) => request<LinkList>(\"/v1/links\", { query, token }),\n\n getLink: (id: string, token?: string) =>\n request<PublicLink>(`/v1/links/${id}`, { token }),\n\n createLink: (\n body: {\n document_id?: string;\n dataroom_id?: string;\n name?: string;\n expires_at?: string;\n password?: string;\n email_protected?: boolean;\n allow_download?: boolean;\n enable_confidential_view?: boolean;\n enable_watermark?: boolean;\n watermark_config?: WatermarkConfig;\n },\n token?: string,\n ) => request<PublicLink>(\"/v1/links\", { method: \"POST\", body, token }),\n\n updateLink: (id: string, body: UpdateLinkBody, token?: string) =>\n request<PublicLink>(`/v1/links/${id}`, { method: \"PATCH\", body, token }),\n\n deleteLink: (id: string, token?: string) =>\n request<DeletedObject>(`/v1/links/${id}`, { method: \"DELETE\", token }),\n\n listViews: (\n linkId: string,\n query?: { limit?: number; cursor?: string },\n token?: string,\n ) => request<ViewList>(`/v1/links/${linkId}/views`, { query, token }),\n\n // Datarooms\n listDatarooms: (\n query?: { limit?: number; cursor?: string; query?: string },\n token?: string,\n ) => request<DataroomList>(\"/v1/datarooms\", { query, token }),\n getDataroom: (id: string, token?: string) =>\n request<PublicDataroom>(`/v1/datarooms/${id}`, { token }),\n createDataroom: (\n body: { name: string; internal_name?: string; description?: string },\n token?: string,\n ) => request<PublicDataroom>(\"/v1/datarooms\", { method: \"POST\", body, token }),\n updateDataroom: (\n id: string,\n body: {\n name?: string;\n internal_name?: string | null;\n description?: string | null;\n allow_bulk_download?: boolean;\n },\n token?: string,\n ) =>\n request<PublicDataroom>(`/v1/datarooms/${id}`, { method: \"PATCH\", body, token }),\n deleteDataroom: (id: string, token?: string) =>\n request<DeletedObject>(`/v1/datarooms/${id}`, { method: \"DELETE\", token }),\n listDataroomDocuments: (\n id: string,\n query?: { limit?: number; cursor?: string; folder_id?: string },\n token?: string,\n ) => request<DataroomItemList>(`/v1/datarooms/${id}/documents`, { query, token }),\n attachDataroomDocument: (\n id: string,\n body: { document_id: string; folder_id?: string },\n token?: string,\n ) =>\n request<PublicDataroomItem>(`/v1/datarooms/${id}/documents`, {\n method: \"POST\",\n body,\n token,\n }),\n detachDataroomDocument: (id: string, ddId: string, token?: string) =>\n request<DeletedObject>(`/v1/datarooms/${id}/documents/${ddId}`, {\n method: \"DELETE\",\n token,\n }),\n moveDataroomDocument: (\n id: string,\n ddId: string,\n body: { folder_id: string | null },\n token?: string,\n ) =>\n request<PublicDataroomItem>(`/v1/datarooms/${id}/documents/${ddId}/move`, {\n method: \"POST\",\n body,\n token,\n }),\n\n // Dataroom folders\n listDataroomFolders: (\n id: string,\n query?: { limit?: number; cursor?: string; parent_id?: string },\n token?: string,\n ) =>\n request<DataroomFolderList>(`/v1/datarooms/${id}/folders`, {\n query,\n token,\n }),\n createDataroomFolder: (\n id: string,\n body: {\n name: string;\n parent_id?: string | null;\n icon?: FolderIcon;\n color?: FolderColor;\n },\n token?: string,\n ) =>\n request<PublicDataroomFolder>(`/v1/datarooms/${id}/folders`, {\n method: \"POST\",\n body,\n token,\n }),\n getDataroomFolder: (id: string, fid: string, token?: string) =>\n request<PublicDataroomFolder>(`/v1/datarooms/${id}/folders/${fid}`, {\n token,\n }),\n updateDataroomFolder: (\n id: string,\n fid: string,\n body: { name?: string; icon?: FolderIcon | null; color?: FolderColor | null },\n token?: string,\n ) =>\n request<PublicDataroomFolder>(`/v1/datarooms/${id}/folders/${fid}`, {\n method: \"PATCH\",\n body,\n token,\n }),\n deleteDataroomFolder: (\n id: string,\n fid: string,\n opts?: { cascade?: boolean },\n token?: string,\n ) =>\n request<DeletedObject>(`/v1/datarooms/${id}/folders/${fid}`, {\n method: \"DELETE\",\n query: opts?.cascade ? { cascade: \"true\" } : undefined,\n token,\n }),\n moveDataroomFolder: (\n id: string,\n fid: string,\n body: { parent_id: string | null },\n token?: string,\n ) =>\n request<PublicDataroomFolder>(`/v1/datarooms/${id}/folders/${fid}/move`, {\n method: \"POST\",\n body,\n token,\n }),\n\n // Visitors\n listVisitors: (\n query?: {\n limit?: number;\n cursor?: string;\n email?: string;\n dataroom_id?: string;\n },\n token?: string,\n ) => request<VisitorList>(\"/v1/visitors\", { query, token }),\n getVisitor: (id: string, token?: string) =>\n request<PublicVisitor>(`/v1/visitors/${id}`, { token }),\n listVisitorViews: (\n id: string,\n query?: { limit?: number; cursor?: string },\n token?: string,\n ) => request<VisitorViewList>(`/v1/visitors/${id}/views`, { query, token }),\n\n // Analytics\n documentAnalytics: (\n id: string,\n query?: { since?: number; until?: number },\n token?: string,\n ) => request<DocumentAnalytics>(`/v1/analytics/documents/${id}`, { query, token }),\n linkAnalytics: (\n id: string,\n query?: { since?: number; until?: number },\n token?: string,\n ) => request<LinkAnalytics>(`/v1/analytics/links/${id}`, { query, token }),\n dataroomAnalytics: (\n id: string,\n query?: { since?: number; until?: number },\n token?: string,\n ) => request<DataroomAnalytics>(`/v1/analytics/datarooms/${id}`, { query, token }),\n viewAnalytics: (id: string, token?: string) =>\n request<ViewAnalytics>(`/v1/analytics/views/${id}`, { token }),\n};\n\nexport interface PublicDataroom {\n id: string;\n object: \"dataroom\";\n pid: string;\n name: string;\n internal_name: string | null;\n description: string | null;\n document_count: number;\n folder_count: number;\n conversations_enabled: boolean;\n agents_enabled: boolean;\n allow_bulk_download: boolean;\n is_frozen: boolean;\n created: string;\n updated_at: string;\n}\n\nexport interface DataroomList {\n data: PublicDataroom[];\n next_cursor: string | null;\n}\n\nexport interface PublicDataroomItem {\n id: string;\n object: \"dataroom_document\";\n document_id: string;\n document_name: string;\n content_type: string | null;\n num_pages: number | null;\n folder_id: string | null;\n folder_path: string | null;\n order_index: number | null;\n created: string;\n}\n\nexport interface DataroomItemList {\n data: PublicDataroomItem[];\n next_cursor: string | null;\n}\n\nexport interface PublicVisitor {\n id: string;\n object: \"visitor\";\n email: string;\n verified: boolean;\n dataroom_id: string | null;\n invited_at: string | null;\n total_views: number;\n last_viewed_at: string | null;\n created: string;\n updated_at: string;\n}\n\nexport interface VisitorList {\n data: PublicVisitor[];\n next_cursor: string | null;\n}\n\nexport interface PublicVisitorView {\n id: string;\n object: \"visitor_view\";\n link_id: string;\n document_id: string | null;\n dataroom_id: string | null;\n view_type: string;\n viewed_at: string;\n downloaded_at: string | null;\n is_archived: boolean;\n}\n\nexport interface VisitorViewList {\n data: PublicVisitorView[];\n next_cursor: string | null;\n}\n\nexport interface DocumentAnalytics {\n document_id: string;\n total_views: number;\n unique_viewers: number;\n total_duration_seconds: number;\n avg_page_duration_seconds: { page_number: number; avg_duration_seconds: number }[];\n since: string;\n until: string;\n}\n\nexport interface LinkAnalytics {\n link_id: string;\n total_views: number;\n total_duration_seconds: number;\n unique_viewers: number;\n since: string;\n until: string;\n}\n\nexport interface DataroomAnalytics {\n dataroom_id: string;\n total_views: number;\n unique_viewers: number;\n total_duration_seconds: number;\n since: string;\n until: string;\n}\n\nexport interface ViewAnalytics {\n view_id: string;\n document_id: string | null;\n viewer_email: string | null;\n viewed_at: string;\n page_durations: { page_number: number; duration_seconds: number }[];\n total_duration_seconds: number;\n location: { country: string | null; city: string | null } | null;\n client: { browser: string | null; os: string | null; device: string | null } | null;\n}\n"],"mappings":"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","names":["doc"]}
|
package/dist/tools-contract.d.ts
CHANGED
|
@@ -47,6 +47,7 @@ declare const documentObjectOutputSchema: z.ZodObject<{
|
|
|
47
47
|
name: z.ZodString;
|
|
48
48
|
type: z.ZodNullable<z.ZodString>;
|
|
49
49
|
content_type: z.ZodNullable<z.ZodString>;
|
|
50
|
+
url: z.ZodNullable<z.ZodString>;
|
|
50
51
|
num_pages: z.ZodNullable<z.ZodNumber>;
|
|
51
52
|
folder_id: z.ZodNullable<z.ZodString>;
|
|
52
53
|
created: z.ZodString;
|
|
@@ -245,6 +246,7 @@ declare const documentOutputSchema: z.ZodObject<{
|
|
|
245
246
|
name: z.ZodString;
|
|
246
247
|
type: z.ZodNullable<z.ZodString>;
|
|
247
248
|
content_type: z.ZodNullable<z.ZodString>;
|
|
249
|
+
url: z.ZodNullable<z.ZodString>;
|
|
248
250
|
num_pages: z.ZodNullable<z.ZodNumber>;
|
|
249
251
|
folder_id: z.ZodNullable<z.ZodString>;
|
|
250
252
|
created: z.ZodString;
|
|
@@ -371,6 +373,7 @@ declare const documentsListOutputSchema: z.ZodObject<{
|
|
|
371
373
|
name: z.ZodString;
|
|
372
374
|
type: z.ZodNullable<z.ZodString>;
|
|
373
375
|
content_type: z.ZodNullable<z.ZodString>;
|
|
376
|
+
url: z.ZodNullable<z.ZodString>;
|
|
374
377
|
num_pages: z.ZodNullable<z.ZodNumber>;
|
|
375
378
|
folder_id: z.ZodNullable<z.ZodString>;
|
|
376
379
|
created: z.ZodString;
|
|
@@ -543,10 +546,10 @@ declare const deletedObjectOutputSchema: z.ZodObject<{
|
|
|
543
546
|
id: z.ZodString;
|
|
544
547
|
object: z.ZodEnum<{
|
|
545
548
|
document: "document";
|
|
546
|
-
folder: "folder";
|
|
547
|
-
dataroom_folder: "dataroom_folder";
|
|
548
549
|
link: "link";
|
|
549
550
|
dataroom: "dataroom";
|
|
551
|
+
folder: "folder";
|
|
552
|
+
dataroom_folder: "dataroom_folder";
|
|
550
553
|
dataroom_document: "dataroom_document";
|
|
551
554
|
}>;
|
|
552
555
|
deleted: z.ZodLiteral<true>;
|
|
@@ -779,10 +782,11 @@ declare const getDocumentVersionContract: {
|
|
|
779
782
|
declare const addDocumentVersionContract: {
|
|
780
783
|
readonly name: "add_document_version";
|
|
781
784
|
readonly title: "Add a new document version";
|
|
782
|
-
readonly description: "
|
|
785
|
+
readonly description: "Add a new version of an existing document. The new version becomes primary by default; live links automatically serve it.\n\nFor a file document, pass `source_url` — a public HTTPS URL the server fetches as the new file. For a `link`/`notion` document, pass `external_url` to repoint it at a new URL (its type is preserved; the URL is stored as-is, not downloaded). Provide exactly one.\n\nWORKFLOW:\n(1) Resolve the target document via `search_documents` or `list_documents`.\n(2) The user must give you the URL — don't fabricate one.\n(3) After creation, mention the version_number so the user can promote/rollback later.\n\nNOTE: Adding a version from a local file path is not supported by this MCP tool — for that, use the `upload_document` tool to create a new document, or have the user upload via the Papermark UI.\n\nRequires scope `documents.write`.";
|
|
783
786
|
readonly inputSchema: {
|
|
784
787
|
readonly document_id: z.ZodString;
|
|
785
|
-
readonly source_url: z.ZodString
|
|
788
|
+
readonly source_url: z.ZodOptional<z.ZodString>;
|
|
789
|
+
readonly external_url: z.ZodOptional<z.ZodString>;
|
|
786
790
|
};
|
|
787
791
|
};
|
|
788
792
|
declare const promoteDocumentVersionContract: {
|
|
@@ -820,12 +824,12 @@ declare const createFolderContract: {
|
|
|
820
824
|
readonly name: z.ZodString;
|
|
821
825
|
readonly parent_id: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
822
826
|
readonly icon: z.ZodOptional<z.ZodEnum<{
|
|
827
|
+
file: "file";
|
|
823
828
|
folder: "folder";
|
|
824
829
|
"folder-open": "folder-open";
|
|
825
830
|
briefcase: "briefcase";
|
|
826
831
|
archive: "archive";
|
|
827
832
|
box: "box";
|
|
828
|
-
file: "file";
|
|
829
833
|
book: "book";
|
|
830
834
|
bookmark: "bookmark";
|
|
831
835
|
star: "star";
|
|
@@ -875,12 +879,12 @@ declare const updateFolderContract: {
|
|
|
875
879
|
readonly folder_id: z.ZodString;
|
|
876
880
|
readonly name: z.ZodOptional<z.ZodString>;
|
|
877
881
|
readonly icon: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
|
|
882
|
+
file: "file";
|
|
878
883
|
folder: "folder";
|
|
879
884
|
"folder-open": "folder-open";
|
|
880
885
|
briefcase: "briefcase";
|
|
881
886
|
archive: "archive";
|
|
882
887
|
box: "box";
|
|
883
|
-
file: "file";
|
|
884
888
|
book: "book";
|
|
885
889
|
bookmark: "bookmark";
|
|
886
890
|
star: "star";
|
|
@@ -1072,12 +1076,12 @@ declare const createDataroomFolderContract: {
|
|
|
1072
1076
|
readonly name: z.ZodString;
|
|
1073
1077
|
readonly parent_id: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
1074
1078
|
readonly icon: z.ZodOptional<z.ZodEnum<{
|
|
1079
|
+
file: "file";
|
|
1075
1080
|
folder: "folder";
|
|
1076
1081
|
"folder-open": "folder-open";
|
|
1077
1082
|
briefcase: "briefcase";
|
|
1078
1083
|
archive: "archive";
|
|
1079
1084
|
box: "box";
|
|
1080
|
-
file: "file";
|
|
1081
1085
|
book: "book";
|
|
1082
1086
|
bookmark: "bookmark";
|
|
1083
1087
|
star: "star";
|
|
@@ -1128,12 +1132,12 @@ declare const updateDataroomFolderContract: {
|
|
|
1128
1132
|
readonly folder_id: z.ZodString;
|
|
1129
1133
|
readonly name: z.ZodOptional<z.ZodString>;
|
|
1130
1134
|
readonly icon: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
|
|
1135
|
+
file: "file";
|
|
1131
1136
|
folder: "folder";
|
|
1132
1137
|
"folder-open": "folder-open";
|
|
1133
1138
|
briefcase: "briefcase";
|
|
1134
1139
|
archive: "archive";
|
|
1135
1140
|
box: "box";
|
|
1136
|
-
file: "file";
|
|
1137
1141
|
book: "book";
|
|
1138
1142
|
bookmark: "bookmark";
|
|
1139
1143
|
star: "star";
|
|
@@ -1211,6 +1215,7 @@ declare const SHARED_TOOL_OUTPUT_SCHEMAS: {
|
|
|
1211
1215
|
name: z.ZodString;
|
|
1212
1216
|
type: z.ZodNullable<z.ZodString>;
|
|
1213
1217
|
content_type: z.ZodNullable<z.ZodString>;
|
|
1218
|
+
url: z.ZodNullable<z.ZodString>;
|
|
1214
1219
|
num_pages: z.ZodNullable<z.ZodNumber>;
|
|
1215
1220
|
folder_id: z.ZodNullable<z.ZodString>;
|
|
1216
1221
|
created: z.ZodString;
|
|
@@ -1224,6 +1229,7 @@ declare const SHARED_TOOL_OUTPUT_SCHEMAS: {
|
|
|
1224
1229
|
name: z.ZodString;
|
|
1225
1230
|
type: z.ZodNullable<z.ZodString>;
|
|
1226
1231
|
content_type: z.ZodNullable<z.ZodString>;
|
|
1232
|
+
url: z.ZodNullable<z.ZodString>;
|
|
1227
1233
|
num_pages: z.ZodNullable<z.ZodNumber>;
|
|
1228
1234
|
folder_id: z.ZodNullable<z.ZodString>;
|
|
1229
1235
|
created: z.ZodString;
|
|
@@ -1236,6 +1242,7 @@ declare const SHARED_TOOL_OUTPUT_SCHEMAS: {
|
|
|
1236
1242
|
name: z.ZodString;
|
|
1237
1243
|
type: z.ZodNullable<z.ZodString>;
|
|
1238
1244
|
content_type: z.ZodNullable<z.ZodString>;
|
|
1245
|
+
url: z.ZodNullable<z.ZodString>;
|
|
1239
1246
|
num_pages: z.ZodNullable<z.ZodNumber>;
|
|
1240
1247
|
folder_id: z.ZodNullable<z.ZodString>;
|
|
1241
1248
|
created: z.ZodString;
|
|
@@ -1526,6 +1533,7 @@ declare const SHARED_TOOL_OUTPUT_SCHEMAS: {
|
|
|
1526
1533
|
name: z.ZodString;
|
|
1527
1534
|
type: z.ZodNullable<z.ZodString>;
|
|
1528
1535
|
content_type: z.ZodNullable<z.ZodString>;
|
|
1536
|
+
url: z.ZodNullable<z.ZodString>;
|
|
1529
1537
|
num_pages: z.ZodNullable<z.ZodNumber>;
|
|
1530
1538
|
folder_id: z.ZodNullable<z.ZodString>;
|
|
1531
1539
|
created: z.ZodString;
|
|
@@ -1536,10 +1544,10 @@ declare const SHARED_TOOL_OUTPUT_SCHEMAS: {
|
|
|
1536
1544
|
id: z.ZodString;
|
|
1537
1545
|
object: z.ZodEnum<{
|
|
1538
1546
|
document: "document";
|
|
1539
|
-
folder: "folder";
|
|
1540
|
-
dataroom_folder: "dataroom_folder";
|
|
1541
1547
|
link: "link";
|
|
1542
1548
|
dataroom: "dataroom";
|
|
1549
|
+
folder: "folder";
|
|
1550
|
+
dataroom_folder: "dataroom_folder";
|
|
1543
1551
|
dataroom_document: "dataroom_document";
|
|
1544
1552
|
}>;
|
|
1545
1553
|
deleted: z.ZodLiteral<true>;
|
|
@@ -1677,10 +1685,10 @@ declare const SHARED_TOOL_OUTPUT_SCHEMAS: {
|
|
|
1677
1685
|
id: z.ZodString;
|
|
1678
1686
|
object: z.ZodEnum<{
|
|
1679
1687
|
document: "document";
|
|
1680
|
-
folder: "folder";
|
|
1681
|
-
dataroom_folder: "dataroom_folder";
|
|
1682
1688
|
link: "link";
|
|
1683
1689
|
dataroom: "dataroom";
|
|
1690
|
+
folder: "folder";
|
|
1691
|
+
dataroom_folder: "dataroom_folder";
|
|
1684
1692
|
dataroom_document: "dataroom_document";
|
|
1685
1693
|
}>;
|
|
1686
1694
|
deleted: z.ZodLiteral<true>;
|
|
@@ -1804,10 +1812,10 @@ declare const SHARED_TOOL_OUTPUT_SCHEMAS: {
|
|
|
1804
1812
|
id: z.ZodString;
|
|
1805
1813
|
object: z.ZodEnum<{
|
|
1806
1814
|
document: "document";
|
|
1807
|
-
folder: "folder";
|
|
1808
|
-
dataroom_folder: "dataroom_folder";
|
|
1809
1815
|
link: "link";
|
|
1810
1816
|
dataroom: "dataroom";
|
|
1817
|
+
folder: "folder";
|
|
1818
|
+
dataroom_folder: "dataroom_folder";
|
|
1811
1819
|
dataroom_document: "dataroom_document";
|
|
1812
1820
|
}>;
|
|
1813
1821
|
deleted: z.ZodLiteral<true>;
|
|
@@ -1834,10 +1842,10 @@ declare const SHARED_TOOL_OUTPUT_SCHEMAS: {
|
|
|
1834
1842
|
id: z.ZodString;
|
|
1835
1843
|
object: z.ZodEnum<{
|
|
1836
1844
|
document: "document";
|
|
1837
|
-
folder: "folder";
|
|
1838
|
-
dataroom_folder: "dataroom_folder";
|
|
1839
1845
|
link: "link";
|
|
1840
1846
|
dataroom: "dataroom";
|
|
1847
|
+
folder: "folder";
|
|
1848
|
+
dataroom_folder: "dataroom_folder";
|
|
1841
1849
|
dataroom_document: "dataroom_document";
|
|
1842
1850
|
}>;
|
|
1843
1851
|
deleted: z.ZodLiteral<true>;
|
|
@@ -1860,10 +1868,10 @@ declare const SHARED_TOOL_OUTPUT_SCHEMAS: {
|
|
|
1860
1868
|
id: z.ZodString;
|
|
1861
1869
|
object: z.ZodEnum<{
|
|
1862
1870
|
document: "document";
|
|
1863
|
-
folder: "folder";
|
|
1864
|
-
dataroom_folder: "dataroom_folder";
|
|
1865
1871
|
link: "link";
|
|
1866
1872
|
dataroom: "dataroom";
|
|
1873
|
+
folder: "folder";
|
|
1874
|
+
dataroom_folder: "dataroom_folder";
|
|
1867
1875
|
dataroom_document: "dataroom_document";
|
|
1868
1876
|
}>;
|
|
1869
1877
|
deleted: z.ZodLiteral<true>;
|
|
@@ -1961,10 +1969,10 @@ declare const SHARED_TOOL_OUTPUT_SCHEMAS: {
|
|
|
1961
1969
|
id: z.ZodString;
|
|
1962
1970
|
object: z.ZodEnum<{
|
|
1963
1971
|
document: "document";
|
|
1964
|
-
folder: "folder";
|
|
1965
|
-
dataroom_folder: "dataroom_folder";
|
|
1966
1972
|
link: "link";
|
|
1967
1973
|
dataroom: "dataroom";
|
|
1974
|
+
folder: "folder";
|
|
1975
|
+
dataroom_folder: "dataroom_folder";
|
|
1968
1976
|
dataroom_document: "dataroom_document";
|
|
1969
1977
|
}>;
|
|
1970
1978
|
deleted: z.ZodLiteral<true>;
|
package/dist/tools-contract.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@papermark/mcp-server",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"description": "Model Context Protocol server for Papermark — give AI assistants access to your data rooms, documents, share links, and analytics.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"homepage": "https://www.papermark.com",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/tools-contract.ts"],"sourcesContent":["import { z } from \"zod\";\n\n/**\n * Single source of truth for the LLM-facing contract of each Papermark MCP\n * tool — name, title, description, and zod input schema. Both the stdio\n * transport (this repo) and the remote HTTP adapter (in the papermark app)\n * import from here so descriptions and schemas can't drift.\n *\n * Tool *bodies* (how each transport actually fulfills the request) stay in\n * the transport, because the environments differ — stdio can read local\n * files and hit the public v1 API over fetch; the in-app HTTP adapter\n * reaches the v1 routes via loopback with the caller's bearer token.\n *\n * `upload_document` is intentionally omitted: the stdio variant accepts a\n * local `file_path`, which the HTTP variant can't honor. Each side defines\n * its own upload_document contract.\n */\n\nexport interface ToolContract<TShape extends z.ZodRawShape> {\n name: string;\n title: string;\n description: string;\n inputSchema: TShape;\n}\n\nexport const anyObjectOutputSchema = z.object({}).passthrough();\n\n// Shared shape for the watermark configuration on share links.\n// Mirrors `WatermarkConfig` in the public v1 OpenAPI schema.\nconst watermarkPositionEnum = z.enum([\n \"top-left\",\n \"top-center\",\n \"top-right\",\n \"middle-left\",\n \"middle-center\",\n \"middle-right\",\n \"bottom-left\",\n \"bottom-center\",\n \"bottom-right\",\n]);\nconst watermarkRotationEnum = z.union([\n z.literal(0),\n z.literal(30),\n z.literal(45),\n z.literal(90),\n z.literal(180),\n]);\nexport const watermarkConfigInputSchema = z\n .object({\n text: z\n .string()\n .min(1)\n .describe(\n \"Watermark text. Tokens interpolated per view: {{email}}, {{date}}, {{time}}, {{link}}, {{ipAddress}}.\",\n ),\n is_tiled: z\n .boolean()\n .describe(\n \"When true, tile the watermark across the page instead of rendering at `position`.\",\n ),\n position: watermarkPositionEnum.describe(\n \"Anchor position. Ignored when `is_tiled` is true.\",\n ),\n rotation: watermarkRotationEnum.describe(\n \"Rotation in degrees. One of 0, 30, 45, 90, 180.\",\n ),\n color: z\n .string()\n .regex(/^#([0-9A-Fa-f]{3}){1,2}$/, \"Hex color like #RGB or #RRGGBB\")\n .describe(\"Text color as `#RGB` or `#RRGGBB`.\"),\n font_size: z\n .number()\n .int()\n .min(1)\n .max(96)\n .describe(\"Font size in points (1-96).\"),\n opacity: z\n .number()\n .min(0)\n .max(1)\n .describe(\"Opacity from 0 (invisible) to 1 (fully opaque).\"),\n })\n .describe(\"Watermark configuration applied when `enable_watermark` is true.\");\nconst watermarkConfigOutputSchema = z\n .object({\n text: z.string(),\n is_tiled: z.boolean(),\n position: watermarkPositionEnum,\n rotation: watermarkRotationEnum,\n color: z.string(),\n font_size: z.number().int(),\n opacity: z.number(),\n })\n .nullable()\n .describe(\n \"Watermark configuration. Null when `enable_watermark` is true but no config has been set (viewer falls back to defaults).\",\n );\n\nconst dateTimeOutputSchema = (description: string) =>\n z.string().datetime().describe(description);\nconst nullableDateTimeOutputSchema = (description: string) =>\n z.string().datetime().nullable().describe(description);\nconst nullableStringOutputSchema = (description: string) =>\n z.string().nullable().describe(description);\nconst integerOutputSchema = (description: string) =>\n z.number().int().describe(description);\nconst nullableIntegerOutputSchema = (description: string) =>\n z.number().int().nullable().describe(description);\nconst cursorOutputSchema = z\n .string()\n .nullable()\n .describe(\n \"Opaque cursor for the next page, or null when there is no next page.\",\n );\n\nexport const documentObjectOutputSchema = z\n .object({\n id: z.string().describe(\"Unique Papermark document id.\"),\n object: z\n .literal(\"document\")\n .describe(\"String representing the object's type. Always `document`.\"),\n name: z.string().describe(\"Document file name.\"),\n type: nullableStringOutputSchema(\n \"Document type, such as `pdf`, or null when unknown.\",\n ),\n content_type: nullableStringOutputSchema(\n \"Document MIME type, such as `application/pdf`, or null when unknown.\",\n ),\n num_pages: nullableIntegerOutputSchema(\n \"Number of pages, or null when unknown.\",\n ),\n folder_id: nullableStringOutputSchema(\n \"ID of the team-library folder containing this document, or null for the library root.\",\n ),\n created: dateTimeOutputSchema(\"When the document was created.\"),\n updated_at: dateTimeOutputSchema(\"When the document was last updated.\"),\n })\n .passthrough()\n .describe(\"Papermark document object.\");\n\nexport const linkObjectOutputSchema = z\n .object({\n id: z.string().describe(\"Unique Papermark share link id.\"),\n object: z\n .literal(\"link\")\n .describe(\"String representing the object's type. Always `link`.\"),\n name: nullableStringOutputSchema(\n \"Human-readable internal label for the link, or null when unset.\",\n ),\n target_type: z\n .enum([\"document\", \"dataroom\"])\n .describe(\n \"The kind of resource this link points at. The matching `document_id` / `dataroom_id` field is populated; the other is null.\",\n ),\n document_id: nullableStringOutputSchema(\n \"Target document id when this is a document link, otherwise null.\",\n ),\n dataroom_id: nullableStringOutputSchema(\n \"Target dataroom id when this is a dataroom link, otherwise null.\",\n ),\n url: z.string().describe(\"The public view URL for this link.\"),\n domain: nullableStringOutputSchema(\n \"Custom domain the link is hosted on. The same value accepted as `domain` on create/update. Null when the link uses the default papermark.com URL.\",\n ),\n slug: nullableStringOutputSchema(\n \"Path segment for the custom-domain URL, or null when unset.\",\n ),\n expires_at: nullableDateTimeOutputSchema(\n \"Expiration timestamp, or null when the link does not expire.\",\n ),\n is_password_protected: z\n .boolean()\n .describe(\n \"True if a password is set. The password itself is never returned.\",\n ),\n email_protected: z\n .boolean()\n .describe(\"Whether viewers must provide an email address.\"),\n email_authenticated: z\n .boolean()\n .describe(\"Whether email authentication is required for viewers.\"),\n allow_download: z\n .boolean()\n .describe(\"Whether viewers can download the linked content.\"),\n allow_list: z\n .array(z.string())\n .describe(\n \"Email or domain allow list (e.g., ['@acme.com', 'bob@example.com']).\",\n ),\n deny_list: z\n .array(z.string())\n .describe(\"Blocked viewer emails or domains.\"),\n enable_watermark: z.boolean().describe(\"Whether watermarking is enabled.\"),\n watermark_config: watermarkConfigOutputSchema,\n enable_feedback: z\n .boolean()\n .describe(\"Whether viewer feedback is enabled.\"),\n enable_screenshot_protection: z\n .boolean()\n .describe(\"Whether screenshot protection is enabled.\"),\n enable_confidential_view: z\n .boolean()\n .describe(\n \"Whether confidential-view mode is enabled. When on, the viewer renders only a narrow band of each page at a time (rest is blurred) to prevent full-page screenshots.\",\n ),\n created: dateTimeOutputSchema(\"When the link was created.\"),\n updated_at: dateTimeOutputSchema(\"When the link was last updated.\"),\n })\n .passthrough()\n .describe(\"Papermark share link object.\");\n\nexport const dataroomObjectOutputSchema = z\n .object({\n id: z.string().describe(\"Unique Papermark dataroom id.\"),\n object: z\n .literal(\"dataroom\")\n .describe(\"String representing the object's type. Always `dataroom`.\"),\n pid: z\n .string()\n .describe(\n \"Stripe-style public ID, suitable for URLs and user references\",\n ),\n name: z.string().describe(\"Human-visible dataroom name.\"),\n internal_name: nullableStringOutputSchema(\n \"Private alias visible only to the team\",\n ),\n description: nullableStringOutputSchema(\n \"Dataroom description, or null when unset.\",\n ),\n document_count: integerOutputSchema(\"Number of documents in the dataroom.\"),\n folder_count: integerOutputSchema(\"Number of folders in the dataroom.\"),\n conversations_enabled: z\n .boolean()\n .describe(\"Whether conversations are enabled.\"),\n agents_enabled: z.boolean().describe(\"Whether AI agents are enabled.\"),\n allow_bulk_download: z\n .boolean()\n .describe(\"Whether viewers can bulk download dataroom contents.\"),\n is_frozen: z.boolean().describe(\"Whether the dataroom is frozen.\"),\n created: dateTimeOutputSchema(\"When the dataroom was created.\"),\n updated_at: dateTimeOutputSchema(\"When the dataroom was last updated.\"),\n })\n .passthrough()\n .describe(\"Papermark dataroom object.\");\n\nexport const folderObjectOutputSchema = z\n .object({\n id: z.string().describe(\"Unique Papermark folder id.\"),\n object: z\n .enum([\"folder\", \"dataroom_folder\"])\n .describe(\n \"String representing the object's type. Either `folder` for a team-library folder or `dataroom_folder` for a dataroom folder.\",\n ),\n name: z.string().describe(\"Folder name.\"),\n parent_id: nullableStringOutputSchema(\n \"Parent folder id, or null when the folder is at the root.\",\n ),\n path: z\n .string()\n .describe(\n \"Server-derived path of slugified folder names. Read-only — never accepted from clients.\",\n ),\n icon: nullableStringOutputSchema(\"Folder icon token, when configured.\"),\n color: nullableStringOutputSchema(\"Folder color token, when configured.\"),\n document_count: integerOutputSchema(\"Number of direct child documents.\"),\n child_folder_count: integerOutputSchema(\"Number of direct child folders.\"),\n order_index: nullableIntegerOutputSchema(\n \"Ordering index for dataroom folders, when available.\",\n ).optional(),\n created: dateTimeOutputSchema(\"When the folder was created.\"),\n updated_at: dateTimeOutputSchema(\"When the folder was last updated.\"),\n })\n .passthrough()\n .describe(\"Papermark folder object.\");\n\nexport const documentVersionObjectOutputSchema = z\n .object({\n id: z.string().describe(\"Unique Papermark document version id.\"),\n object: z\n .literal(\"document_version\")\n .describe(\n \"String representing the object's type. Always `document_version`.\",\n ),\n version_number: integerOutputSchema(\"Sequential version number.\"),\n is_primary: z\n .boolean()\n .describe(\"Whether this is the primary active version.\"),\n type: nullableStringOutputSchema(\"Document type or extension, when known.\"),\n content_type: nullableStringOutputSchema(\"Detected MIME type, when known.\"),\n num_pages: nullableIntegerOutputSchema(\"Number of pages, when known.\"),\n file_size: nullableIntegerOutputSchema(\"File size in bytes, when known.\"),\n created: dateTimeOutputSchema(\"When the version was created.\"),\n updated_at: dateTimeOutputSchema(\"When the version was last updated.\"),\n })\n .passthrough()\n .describe(\"Papermark document version object.\");\n\nexport const dataroomItemObjectOutputSchema = z\n .object({\n id: z\n .string()\n .describe(\n \"DataroomDocument id (the link between a document and the dataroom)\",\n ),\n object: z\n .literal(\"dataroom_document\")\n .describe(\n \"String representing the object's type. Always `dataroom_document`.\",\n ),\n document_id: z.string().describe(\"Underlying document id.\"),\n document_name: z.string().describe(\"Underlying document name.\"),\n content_type: nullableStringOutputSchema(\"Detected MIME type, when known.\"),\n num_pages: nullableIntegerOutputSchema(\"Number of pages, when known.\"),\n folder_id: nullableStringOutputSchema(\n \"Dataroom folder id containing the item, or null for the root.\",\n ),\n folder_path: nullableStringOutputSchema(\n \"Dataroom folder path, when present.\",\n ),\n order_index: nullableIntegerOutputSchema(\n \"Ordering index within the folder.\",\n ),\n created: dateTimeOutputSchema(\"When the document was attached.\"),\n })\n .passthrough()\n .describe(\"Papermark dataroom document attachment object.\");\n\nexport const viewObjectOutputSchema = z\n .object({\n id: z.string().describe(\"Unique Papermark view event id.\"),\n object: z\n .literal(\"view\")\n .describe(\"String representing the object's type. Always `view`.\"),\n link_id: nullableStringOutputSchema(\"Share link id for the view event.\"),\n document_id: nullableStringOutputSchema(\n \"Document id viewed, when present.\",\n ),\n dataroom_id: nullableStringOutputSchema(\n \"Dataroom id viewed, when present.\",\n ),\n viewer_email: nullableStringOutputSchema(\"Viewer email, when captured.\"),\n view_type: nullableStringOutputSchema(\"View event type.\"),\n viewed_at: dateTimeOutputSchema(\"When the view occurred.\"),\n downloaded_at: nullableDateTimeOutputSchema(\n \"When the viewer downloaded content, or null when not downloaded.\",\n ),\n download_type: nullableStringOutputSchema(\"Download type, when available.\"),\n })\n .passthrough()\n .describe(\"Papermark view event object.\");\n\nexport const visitorObjectOutputSchema = z\n .object({\n id: z.string().describe(\"Unique Papermark visitor id.\"),\n object: z\n .literal(\"visitor\")\n .describe(\"String representing the object's type. Always `visitor`.\"),\n email: z.string().describe(\"Visitor email address.\"),\n verified: z.boolean().describe(\"Whether the visitor is verified.\"),\n dataroom_id: nullableStringOutputSchema(\n \"If the visitor is tied to a specific dataroom (invitation or group member), this is its id\",\n ),\n invited_at: nullableDateTimeOutputSchema(\n \"When the visitor was invited, or null when not invited.\",\n ),\n total_views: integerOutputSchema(\"Total number of views by this visitor.\"),\n last_viewed_at: nullableDateTimeOutputSchema(\n \"Most recent view timestamp, or null when there are no views.\",\n ),\n created: dateTimeOutputSchema(\"When the visitor was created.\"),\n updated_at: dateTimeOutputSchema(\"When the visitor was last updated.\"),\n })\n .passthrough()\n .describe(\"Papermark visitor object.\");\n\nexport const visitorViewObjectOutputSchema = z\n .object({\n id: z.string().describe(\"Unique Papermark visitor view event id.\"),\n object: z\n .literal(\"visitor_view\")\n .describe(\n \"String representing the object's type. Always `visitor_view`.\",\n ),\n link_id: z.string().describe(\"Share link id for the view.\"),\n document_id: nullableStringOutputSchema(\n \"Document id viewed, when present.\",\n ),\n dataroom_id: nullableStringOutputSchema(\n \"Dataroom id viewed, when present.\",\n ),\n view_type: z.string().describe(\"View event type.\"),\n viewed_at: dateTimeOutputSchema(\"When the view occurred.\"),\n downloaded_at: nullableDateTimeOutputSchema(\n \"When the visitor downloaded content, or null when not downloaded.\",\n ),\n is_archived: z.boolean().describe(\"Whether this view is archived.\"),\n })\n .passthrough()\n .describe(\"Papermark visitor view event object.\");\n\nexport const documentAnalyticsOutputSchema = z\n .object({\n document_id: z.string().describe(\"Document id these analytics describe.\"),\n total_views: integerOutputSchema(\"Total views in the time window.\"),\n unique_viewers: integerOutputSchema(\"Unique viewers in the time window.\"),\n total_duration_seconds: z\n .number()\n .describe(\"Total read duration in seconds.\"),\n avg_page_duration_seconds: z\n .array(\n z.object({\n page_number: integerOutputSchema(\"One-indexed page number.\"),\n avg_duration_seconds: z\n .number()\n .describe(\"Average duration on this page in seconds.\"),\n }),\n )\n .describe(\"Average duration per page.\"),\n since: dateTimeOutputSchema(\"Start of the analytics window.\"),\n until: dateTimeOutputSchema(\"End of the analytics window.\"),\n })\n .passthrough()\n .describe(\"Document analytics summary.\");\n\nexport const linkAnalyticsOutputSchema = z\n .object({\n link_id: z.string().describe(\"Share link id these analytics describe.\"),\n total_views: integerOutputSchema(\"Total views in the time window.\"),\n total_duration_seconds: z\n .number()\n .describe(\"Total read duration in seconds.\"),\n unique_viewers: integerOutputSchema(\"Unique viewers in the time window.\"),\n since: dateTimeOutputSchema(\"Start of the analytics window.\"),\n until: dateTimeOutputSchema(\"End of the analytics window.\"),\n })\n .passthrough()\n .describe(\"Link analytics summary.\");\n\nexport const dataroomAnalyticsOutputSchema = z\n .object({\n dataroom_id: z.string().describe(\"Dataroom id these analytics describe.\"),\n total_views: integerOutputSchema(\"Total views in the time window.\"),\n unique_viewers: integerOutputSchema(\"Unique viewers in the time window.\"),\n total_duration_seconds: z\n .number()\n .describe(\"Total read duration in seconds.\"),\n since: dateTimeOutputSchema(\"Start of the analytics window.\"),\n until: dateTimeOutputSchema(\"End of the analytics window.\"),\n })\n .passthrough()\n .describe(\"Dataroom analytics summary.\");\n\nexport const viewAnalyticsOutputSchema = z\n .object({\n view_id: z.string().describe(\"View id these analytics describe.\"),\n document_id: nullableStringOutputSchema(\n \"Document id viewed, when present.\",\n ),\n viewer_email: nullableStringOutputSchema(\"Viewer email, when captured.\"),\n viewed_at: dateTimeOutputSchema(\"When the view occurred.\"),\n page_durations: z\n .array(\n z.object({\n page_number: integerOutputSchema(\"One-indexed page number.\"),\n duration_seconds: z\n .number()\n .describe(\"Duration on this page in seconds.\"),\n }),\n )\n .describe(\"Per-page duration details.\"),\n total_duration_seconds: z\n .number()\n .describe(\"Total read duration in seconds.\"),\n location: z\n .object({\n country: nullableStringOutputSchema(\"Viewer country, when known.\"),\n city: nullableStringOutputSchema(\"Viewer city, when known.\"),\n })\n .nullable()\n .describe(\"Approximate viewer location, or null when unknown.\"),\n client: z\n .object({\n browser: nullableStringOutputSchema(\"Viewer browser, when known.\"),\n os: nullableStringOutputSchema(\"Viewer operating system, when known.\"),\n device: nullableStringOutputSchema(\"Viewer device type, when known.\"),\n })\n .nullable()\n .describe(\"Viewer client details, or null when unknown.\"),\n })\n .passthrough()\n .describe(\"View analytics details.\");\n\nexport const documentOutputSchema = z.object({\n document: documentObjectOutputSchema.describe(\n \"Document returned by the tool.\",\n ),\n});\nexport const linkOutputSchema = z.object({\n link: linkObjectOutputSchema.describe(\"Share link returned by the tool.\"),\n});\nexport const dataroomOutputSchema = z.object({\n dataroom: dataroomObjectOutputSchema.describe(\n \"Dataroom returned by the tool.\",\n ),\n});\nexport const folderOutputSchema = z.object({\n folder: folderObjectOutputSchema.describe(\"Folder returned by the tool.\"),\n});\nexport const versionOutputSchema = z.object({\n version: documentVersionObjectOutputSchema.describe(\n \"Document version returned by the tool.\",\n ),\n});\nexport const dataroomItemOutputSchema = z.object({\n item: dataroomItemObjectOutputSchema.describe(\n \"Dataroom document attachment returned by the tool.\",\n ),\n});\n\nexport const documentsListOutputSchema = z.object({\n documents: z\n .array(documentObjectOutputSchema)\n .describe(\"Documents in the current page.\"),\n next_cursor: cursorOutputSchema,\n});\n\nexport const dataroomDocumentsListOutputSchema = z.object({\n documents: z\n .array(dataroomItemObjectOutputSchema)\n .describe(\"Dataroom document attachments in the current page.\"),\n next_cursor: cursorOutputSchema,\n});\n\nexport const linksListOutputSchema = z.object({\n links: z.array(linkObjectOutputSchema).describe(\"Links in the current page.\"),\n next_cursor: cursorOutputSchema,\n});\n\nexport const viewsListOutputSchema = z.object({\n views: z.array(viewObjectOutputSchema).describe(\"Views in the current page.\"),\n next_cursor: cursorOutputSchema,\n});\n\nexport const dataroomsListOutputSchema = z.object({\n datarooms: z\n .array(dataroomObjectOutputSchema)\n .describe(\"Datarooms in the current page.\"),\n next_cursor: cursorOutputSchema,\n});\n\nexport const visitorsListOutputSchema = z.object({\n visitors: z\n .array(visitorObjectOutputSchema)\n .describe(\"Visitors in the current page.\"),\n next_cursor: cursorOutputSchema,\n});\n\nexport const visitorViewsListOutputSchema = z.object({\n views: z\n .array(visitorViewObjectOutputSchema)\n .describe(\"Visitor views in the current page.\"),\n next_cursor: cursorOutputSchema,\n});\n\nexport const foldersListOutputSchema = z.object({\n folders: z\n .array(folderObjectOutputSchema)\n .describe(\"Folders in the current page.\"),\n next_cursor: cursorOutputSchema,\n});\n\nexport const versionsListOutputSchema = z.object({\n versions: z\n .array(documentVersionObjectOutputSchema)\n .describe(\"Document versions.\"),\n});\n\nexport const deletedObjectOutputSchema = z.object({\n id: z.string().describe(\"ID of the deleted object.\"),\n object: z\n .enum([\n \"document\",\n \"folder\",\n \"link\",\n \"dataroom\",\n \"dataroom_folder\",\n \"dataroom_document\",\n ])\n .describe(\"The type of object that was deleted.\"),\n deleted: z\n .literal(true)\n .describe(\"Always `true`. Confirms the object was deleted.\"),\n});\n\nexport const listDocumentsContract = {\n name: \"list_documents\",\n title: \"List documents\",\n description:\n \"List documents in the authenticated Papermark team. Returns up to `limit` results (default 25, max 100) and a `next_cursor` for pagination. Use this before any tool that takes a `document_id` — never fabricate ids. Requires scope `documents.read`.\",\n inputSchema: {\n limit: z\n .number()\n .int()\n .min(1)\n .max(100)\n .optional()\n .describe(\"Page size (1-100, default 25)\"),\n cursor: z\n .string()\n .optional()\n .describe(\"Opaque cursor from the previous page's `next_cursor`\"),\n query: z\n .string()\n .optional()\n .describe(\n \"Optional substring filter on document name — for richer search use `search_documents`\",\n ),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const getDocumentContract = {\n name: \"get_document\",\n title: \"Get document\",\n description:\n \"Fetch a single document by id. `document_id` must come from `list_documents` or `search_documents` — never invent one. If the user referred to a document by name, call `search_documents` first. Requires scope `documents.read`.\",\n inputSchema: {\n document_id: z.string().min(1).describe(\"Document id (e.g. `doc_abc123`)\"),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const searchDocumentsContract = {\n name: \"search_documents\",\n title: \"Search documents\",\n description:\n \"Substring-search document names in the authenticated team. Use this when the user refers to a document by name or topic rather than id. Requires scope `documents.read`.\",\n inputSchema: {\n query: z\n .string()\n .min(1)\n .describe(\"Search string (matched against document name)\"),\n limit: z\n .number()\n .int()\n .min(1)\n .max(50)\n .optional()\n .describe(\"Max results (default 10)\"),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const createLinkContract = {\n name: \"create_link\",\n title: \"Create share link\",\n description: `Create a share link for a document (or dataroom). The returned \\`url\\` is what users share.\n\nWORKFLOW:\n(1) Resolve the target: the user may say \"the Q3 deck\" or \"the Acme dataroom\" — call \\`search_documents\\` (for a document) or \\`search_datarooms\\` (for a dataroom) first to get a real id. Set exactly one of \\`document_id\\` or \\`dataroom_id\\` on the created link.\n(2) Clarify ANY of these that the user didn't state explicitly — do NOT invent values:\n • expiry (\\`expires_at\\`, ISO 8601) — confirm with the user, default is no expiry\n • password — if the user wants password protection, either ASK them for a password OR generate a random one AND tell the user the exact value you set\n • email gating (\\`email_protected\\`) — ask if unclear\n • downloads (\\`allow_download\\`) — default off for external sharing\n(3) Create the link, then surface both the URL and the security settings so the user can verify.\n\nNever share a link to a document the user didn't explicitly name. Requires scope \\`links.write\\`.`,\n inputSchema: {\n document_id: z\n .string()\n .optional()\n .describe(\"Document id — required unless `dataroom_id` is set\"),\n dataroom_id: z\n .string()\n .optional()\n .describe(\"Dataroom id — alternative to document_id\"),\n name: z.string().optional().describe(\"Human-readable label for the link\"),\n expires_at: z\n .string()\n .datetime()\n .optional()\n .describe(\"ISO 8601 timestamp after which the link stops working\"),\n password: z\n .string()\n .optional()\n .describe(\"Require viewers to enter this password\"),\n email_protected: z\n .boolean()\n .optional()\n .describe(\"Require viewers enter an email address before viewing\"),\n allow_download: z\n .boolean()\n .optional()\n .describe(\"Let viewers download the underlying file\"),\n enable_confidential_view: z\n .boolean()\n .optional()\n .describe(\n \"Enable confidential view: viewer renders only a narrow band of each page at a time (rest is blurred) to prevent capturing the whole document in a single screenshot.\",\n ),\n enable_watermark: z\n .boolean()\n .optional()\n .describe(\n \"Enable dynamic watermarks on every rendered page. Pair with `watermark_config` to control text, position, color, etc.\",\n ),\n watermark_config: watermarkConfigInputSchema\n .optional()\n .describe(\n \"Watermark settings. Only applied when `enable_watermark` is true. Optional even when watermark is enabled — omit to use viewer defaults.\",\n ),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const listLinksContract = {\n name: \"list_links\",\n title: \"List share links\",\n description:\n \"List share links in the authenticated team. Optionally filter by `document_id` or `dataroom_id`. Requires scope `links.read`.\",\n inputSchema: {\n document_id: z\n .string()\n .optional()\n .describe(\"Filter links for a specific document\"),\n dataroom_id: z\n .string()\n .optional()\n .describe(\"Filter links for a specific dataroom\"),\n limit: z.number().int().min(1).max(100).optional().describe(\"Page size\"),\n cursor: z.string().optional().describe(\"Pagination cursor\"),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\n// Raw view events for a link — renamed from get_link_analytics so the\n// aggregate analytics tool can claim that name.\nexport const listLinkViewsContract = {\n name: \"list_link_views\",\n title: \"List a link's view events\",\n description:\n \"Return the raw view events for a share link, newest first. Each view includes viewer email (if captured), view timestamp, and download status. For aggregate metrics (total views, total read time), use `get_link_analytics` instead. Requires scope `analytics.read`.\",\n inputSchema: {\n link_id: z.string().min(1).describe(\"Link id (e.g. `lnk_abc123`)\"),\n limit: z\n .number()\n .int()\n .min(1)\n .max(100)\n .optional()\n .describe(\"Page size (default 25)\"),\n cursor: z.string().optional().describe(\"Pagination cursor\"),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\n// ─── Datarooms ───────────────────────────────────────────────────────────\n\nexport const listDataroomsContract = {\n name: \"list_datarooms\",\n title: \"List datarooms\",\n description:\n \"List datarooms in the authenticated team. Returns up to `limit` results with a cursor. Requires scope `datarooms.read`.\",\n inputSchema: {\n limit: z.number().int().min(1).max(100).optional(),\n cursor: z.string().optional(),\n query: z\n .string()\n .optional()\n .describe(\"Optional substring filter on dataroom name\"),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const searchDataroomsContract = {\n name: \"search_datarooms\",\n title: \"Search datarooms\",\n description:\n \"Substring-search dataroom names in the authenticated team. Use when the user refers to a dataroom by name (e.g. 'the Acme room') rather than id — before calling `create_link`, `get_dataroom_analytics`, or any other tool that takes a `dataroom_id`. Requires scope `datarooms.read`.\",\n inputSchema: {\n query: z\n .string()\n .min(1)\n .describe(\"Search string (matched against dataroom name)\"),\n limit: z\n .number()\n .int()\n .min(1)\n .max(50)\n .optional()\n .describe(\"Max results (default 10)\"),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const getDataroomContract = {\n name: \"get_dataroom\",\n title: \"Get a dataroom\",\n description:\n \"Fetch a single dataroom by its id (accepts either the internal cuid or the `dr_...` public id). Requires scope `datarooms.read`.\",\n inputSchema: {\n dataroom_id: z\n .string()\n .min(1)\n .describe(\"Dataroom id or `dr_...` public id\"),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const createDataroomContract = {\n name: \"create_dataroom\",\n title: \"Create a dataroom\",\n description: `Create a new (empty) dataroom. Documents can be added using the \\`attach_dataroom_document\\` tool after creating the dataroom.\n\nWORKFLOW:\n(1) Confirm with the user: exact dataroom name, optional internal_name, optional description. Do NOT invent these.\n(2) Check \\`list_datarooms\\` first if the user said \"my Acme room\" — they may already have one and not want a duplicate.\n(3) Create the dataroom; return the new dataroom id so the caller can add documents with \\`attach_dataroom_document\\`.\n\nRequires scope \\`datarooms.write\\`.`,\n inputSchema: {\n name: z.string().min(1).describe(\"Human-visible dataroom name\"),\n internal_name: z\n .string()\n .optional()\n .describe(\"Private alias visible only to the team\"),\n description: z.string().optional(),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const listDataroomDocumentsContract = {\n name: \"list_dataroom_documents\",\n title: \"List documents in a dataroom\",\n description:\n \"Return the documents contained in a dataroom, ordered by folder and custom order. Requires scope `datarooms.read`.\",\n inputSchema: {\n dataroom_id: z.string().min(1),\n folder_id: z\n .string()\n .optional()\n .describe(\"Filter to documents inside a specific folder\"),\n limit: z.number().int().min(1).max(100).optional(),\n cursor: z.string().optional(),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\n// ─── Visitors ────────────────────────────────────────────────────────────\n\nexport const listVisitorsContract = {\n name: \"list_visitors\",\n title: \"List visitors\",\n description:\n \"Persistent visitors (Viewer rows) for the team. Use `email` to find a specific person; use `dataroom_id` to scope to visitors of a particular dataroom. For anonymous views that never tied to a Viewer row, use `list_link_views` against the relevant link. Requires scope `visitors.read`.\",\n inputSchema: {\n email: z\n .string()\n .optional()\n .describe(\"Exact email match, case-insensitive\"),\n dataroom_id: z.string().optional(),\n limit: z.number().int().min(1).max(100).optional(),\n cursor: z.string().optional(),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const listVisitorViewsContract = {\n name: \"list_visitor_views\",\n title: \"List a visitor's views\",\n description:\n \"All view events tied to a single visitor, newest first. Useful for answering questions like 'what has jane@acme.com looked at?'. Use `list_visitors` with an email filter to find the visitor id. Requires scope `visitors.read`.\",\n inputSchema: {\n visitor_id: z.string().min(1),\n limit: z.number().int().min(1).max(100).optional(),\n cursor: z.string().optional(),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\n// ─── Analytics (Tinybird-backed, tighter rate limit) ────────────────────\n\nexport const getDocumentAnalyticsContract = {\n name: \"get_document_analytics\",\n title: \"Get document analytics\",\n description:\n \"Aggregate analytics for a document over a time window: total views, unique viewers, total read time (seconds), and per-page average duration. Defaults to the last 30 days. Requires scope `analytics.read`. NOTE: Subject to a tighter rate limit — cache results when possible.\",\n inputSchema: {\n document_id: z.string().min(1),\n since: z\n .number()\n .int()\n .optional()\n .describe(\"Unix milliseconds — start of window (default: 30 days ago)\"),\n until: z\n .number()\n .int()\n .optional()\n .describe(\"Unix milliseconds — end of window (default: now)\"),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const getLinkAnalyticsContract = {\n name: \"get_link_analytics\",\n title: \"Get link analytics\",\n description:\n \"Aggregate analytics for a single share link: total views, unique viewers, total read time over the selected window. For the raw event list (one row per view), use `list_link_views`. Requires scope `analytics.read`.\",\n inputSchema: {\n link_id: z.string().min(1),\n since: z.number().int().optional(),\n until: z.number().int().optional(),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const getDataroomAnalyticsContract = {\n name: \"get_dataroom_analytics\",\n title: \"Get dataroom analytics\",\n description:\n \"Aggregate analytics across all documents in a dataroom: total views, unique viewers, total read time. Defaults to the last 30 days. Requires scope `analytics.read`.\",\n inputSchema: {\n dataroom_id: z.string().min(1),\n since: z.number().int().optional(),\n until: z.number().int().optional(),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const getViewAnalyticsContract = {\n name: \"get_view_analytics\",\n title: \"Get per-view breakdown\",\n description:\n \"For a single view event: page-by-page time spent, total duration, and the viewer's country/city/browser/os/device. Use `list_link_views` or `list_visitor_views` to discover view ids. Requires scope `analytics.read`.\",\n inputSchema: {\n view_id: z.string().min(1),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\n// ─── Folder enums (shared between team and dataroom folder contracts) ───\nconst FolderIconEnum = z.enum([\n \"folder\",\n \"folder-open\",\n \"briefcase\",\n \"archive\",\n \"box\",\n \"file\",\n \"book\",\n \"bookmark\",\n \"star\",\n \"heart\",\n \"lock\",\n \"shield\",\n \"users\",\n \"settings\",\n \"tag\",\n \"layers\",\n \"globe\",\n \"home\",\n \"mail\",\n \"image\",\n \"video\",\n \"music\",\n \"palette\",\n \"pen-tool\",\n \"lightbulb\",\n \"zap\",\n \"wrench\",\n \"sparkles\",\n \"cloud\",\n \"flag\",\n \"award\",\n \"flame\",\n \"bell\",\n \"sun\",\n \"hash\",\n]);\n\nconst FolderColorEnum = z.enum([\n \"gray\",\n \"red\",\n \"orange\",\n \"yellow\",\n \"green\",\n \"blue\",\n \"black\",\n]);\n\n// ─── Document mutations ─────────────────────────────────────────────────\n\nexport const updateDocumentContract = {\n name: \"update_document\",\n title: \"Update a document\",\n description: `Rename a document or move it to a different team-library folder. Replacing the file content is a separate operation — use \\`add_document_version\\`.\n\nWORKFLOW:\n(1) Resolve the document via \\`search_documents\\` or \\`list_documents\\` — never invent ids.\n(2) Confirm with the user what they want to change. Pass \\`folder_id: null\\` to move the document back to the library root. Pass a real folder id (resolved via \\`list_folders\\`) to relocate it.\n\nRequires scope \\`documents.write\\`.`,\n inputSchema: {\n document_id: z.string().min(1),\n name: z.string().min(1).max(512).optional(),\n folder_id: z\n .string()\n .nullable()\n .optional()\n .describe(\n \"Target folder id, or null to move to the library root. Omit to leave the folder unchanged.\",\n ),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const deleteDocumentContract = {\n name: \"delete_document\",\n title: \"Delete a document\",\n description: `Permanently delete a document. This is irreversible: every share link, version, and view history attached to the document goes with it.\n\nWORKFLOW:\n(1) Resolve the document via \\`search_documents\\` — never delete based on a guessed id.\n(2) Confirm with the user (echo the document name) before calling. Treat this like \\`rm -rf\\`: don't infer intent from passing references.\n\nRequires scope \\`documents.write\\`.`,\n inputSchema: {\n document_id: z.string().min(1),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\n// ─── Document versions ──────────────────────────────────────────────────\n\nexport const listDocumentVersionsContract = {\n name: \"list_document_versions\",\n title: \"List document versions\",\n description:\n \"List every version of a document, primary first. Use this to find a version id before promoting an older one with `promote_document_version`. Requires scope `documents.read`.\",\n inputSchema: {\n document_id: z.string().min(1),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const getDocumentVersionContract = {\n name: \"get_document_version\",\n title: \"Get a document version\",\n description:\n \"Fetch a single version of a document by its id. Requires scope `documents.read`.\",\n inputSchema: {\n document_id: z.string().min(1),\n version_id: z.string().min(1),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const addDocumentVersionContract = {\n name: \"add_document_version\",\n title: \"Add a new document version\",\n description: `Upload a new version of an existing document, fetched from a public HTTPS URL. The new version becomes primary by default; live links automatically serve the new file.\n\nWORKFLOW:\n(1) Resolve the target document via \\`search_documents\\` or \\`list_documents\\`.\n(2) The user must give you a public HTTPS URL the API can fetch. Don't fabricate URLs.\n(3) After creation, mention the version_number so the user can promote/rollback later.\n\nNOTE: Adding a version from a local file path is not supported by this MCP tool — for that, use the \\`upload_document\\` tool to create a new document, or have the user upload via the Papermark UI.\n\nRequires scope \\`documents.write\\`.`,\n inputSchema: {\n document_id: z.string().min(1),\n source_url: z\n .string()\n .url()\n .refine((s) => s.startsWith(\"https://\"), {\n message: \"source_url must use https://\",\n })\n .describe(\"Public HTTPS URL the server should fetch as the new version\"),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const promoteDocumentVersionContract = {\n name: \"promote_document_version\",\n title: \"Promote a version to primary\",\n description: `Roll back (or roll forward) by making a non-primary version the active one. The previous primary is demoted in the same transaction; share links immediately serve the new primary.\n\nWORKFLOW:\n(1) Call \\`list_document_versions\\` to find the right version id.\n(2) Confirm with the user before promoting — this changes what every existing link serves.\n\nRequires scope \\`documents.write\\`.`,\n inputSchema: {\n document_id: z.string().min(1),\n version_id: z.string().min(1),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\n// ─── Folders (team library) ─────────────────────────────────────────────\n\nexport const listFoldersContract = {\n name: \"list_folders\",\n title: \"List folders\",\n description: `List folders in the team library. Pass \\`parent_id: \"root\"\\` to list top-level folders, a folder id to list direct children, or omit \\`parent_id\\` to list every folder.\n\nUSE THIS when the user wants to know which folders exist, or you need a \\`folder_id\\` to pass to \\`update_document\\` / \\`upload_document\\` / \\`create_folder\\`. Requires scope \\`documents.read\\`.`,\n inputSchema: {\n parent_id: z\n .string()\n .optional()\n .describe(\n \"Restrict to direct children of this folder. Use 'root' for top-level folders. Omit for all folders.\",\n ),\n limit: z.number().int().min(1).max(100).optional(),\n cursor: z.string().optional(),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const getFolderContract = {\n name: \"get_folder\",\n title: \"Get a folder\",\n description:\n \"Fetch a single team-library folder by id. Requires scope `documents.read`.\",\n inputSchema: {\n folder_id: z.string().min(1),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const createFolderContract = {\n name: \"create_folder\",\n title: \"Create a folder\",\n description: `Create a folder in the team library. Pass an existing folder id as \\`parent_id\\` to nest, or omit it for the root.\n\nWORKFLOW:\n(1) Confirm name and parent with the user. Don't invent folder names.\n(2) If they referred to \"the Pitches folder\" but didn't give an id, call \\`list_folders\\` first.\n\nRequires scope \\`documents.write\\`.`,\n inputSchema: {\n name: z.string().min(1).max(256),\n parent_id: z\n .string()\n .nullable()\n .optional()\n .describe(\n \"Parent folder id; omit or pass null for the team-library root\",\n ),\n icon: FolderIconEnum.optional(),\n color: FolderColorEnum.optional(),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const updateFolderContract = {\n name: \"update_folder\",\n title: \"Update a folder\",\n description:\n \"Rename a folder, change its icon or color. Pass null to clear icon/color. Use `move_folder` to change its parent. Requires scope `documents.write`.\",\n inputSchema: {\n folder_id: z.string().min(1),\n name: z.string().min(1).max(256).optional(),\n icon: FolderIconEnum.nullable().optional(),\n color: FolderColorEnum.nullable().optional(),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const deleteFolderContract = {\n name: \"delete_folder\",\n title: \"Delete a folder\",\n description: `Delete a folder. By default this only succeeds if the folder is empty. Pass \\`cascade: true\\` to also delete every nested folder and document — this is destructive and irreversible.\n\nAlways confirm with the user before passing cascade. Requires scope \\`documents.write\\`.`,\n inputSchema: {\n folder_id: z.string().min(1),\n cascade: z\n .boolean()\n .optional()\n .describe(\n \"When true, deletes the folder and every nested folder + document. Defaults to false.\",\n ),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const moveFolderContract = {\n name: \"move_folder\",\n title: \"Move a folder\",\n description:\n \"Move a folder under a different parent. Pass `parent_id: null` to move it to the library root. Requires scope `documents.write`.\",\n inputSchema: {\n folder_id: z.string().min(1),\n parent_id: z\n .string()\n .nullable()\n .describe(\"Target parent folder id, or null for the library root\"),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\n// ─── Link mutations ─────────────────────────────────────────────────────\n\nexport const getLinkContract = {\n name: \"get_link\",\n title: \"Get a share link\",\n description:\n \"Fetch a single share link by id. Use this to confirm current settings before calling `update_link` so you don't accidentally clobber other fields. Requires scope `links.read`.\",\n inputSchema: {\n link_id: z.string().min(1),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const updateLinkContract = {\n name: \"update_link\",\n title: \"Update a share link\",\n description: `Change the security settings of an existing share link. The URL stays the same — viewers don't need to be re-notified.\n\nWORKFLOW:\n(1) Get the current settings via \\`get_link\\` first if you're not certain. PATCH semantics: omitted fields are unchanged, but a passed value REPLACES the current one.\n(2) Pass \\`expires_at: null\\` or \\`password: null\\` to clear those fields. \\`allow_list: []\\` empties the list.\n(3) Confirm any change to password / expiry / email gating with the user.\n\nRequires scope \\`links.write\\`.`,\n inputSchema: {\n link_id: z.string().min(1),\n name: z.string().optional(),\n expires_at: z\n .string()\n .datetime()\n .nullable()\n .optional()\n .describe(\"ISO 8601 timestamp, or null to clear the expiry\"),\n password: z\n .string()\n .min(1)\n .nullable()\n .optional()\n .describe(\"New password, or null to remove password protection\"),\n email_protected: z.boolean().optional(),\n email_authenticated: z.boolean().optional(),\n allow_download: z.boolean().optional(),\n allow_list: z\n .array(z.string())\n .optional()\n .describe(\"Email or domain allow list (e.g. ['@acme.com', 'bob@x.com'])\"),\n deny_list: z.array(z.string()).optional(),\n enable_watermark: z.boolean().optional(),\n watermark_config: watermarkConfigInputSchema\n .nullable()\n .optional()\n .describe(\n \"Watermark settings. Pass an object to replace the existing config, or `null` to clear it. Omit to leave unchanged.\",\n ),\n enable_screenshot_protection: z.boolean().optional(),\n enable_confidential_view: z.boolean().optional(),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const deleteLinkContract = {\n name: \"delete_link\",\n title: \"Revoke a share link\",\n description: `Revoke a share link (soft delete). Anyone who tries to open the URL will see a \"link unavailable\" page. The view history is preserved for analytics.\n\nConfirm with the user before revoking — they may have already shared the URL. Requires scope \\`links.write\\`.`,\n inputSchema: {\n link_id: z.string().min(1),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\n// ─── Dataroom mutations ─────────────────────────────────────────────────\n\nexport const updateDataroomContract = {\n name: \"update_dataroom\",\n title: \"Update a dataroom\",\n description: `Change a dataroom's name, internal alias, description, or whether viewers can bulk-download. PATCH semantics — omitted fields stay as they are.\n\nWORKFLOW:\n(1) Resolve the dataroom via \\`search_datarooms\\` or \\`list_datarooms\\`.\n(2) Confirm any toggle of \\`allow_bulk_download\\` with the user — it affects every link tied to this dataroom.\n\nRequires scope \\`datarooms.write\\`.`,\n inputSchema: {\n dataroom_id: z.string().min(1),\n name: z.string().min(1).optional(),\n internal_name: z.string().nullable().optional(),\n description: z.string().nullable().optional(),\n allow_bulk_download: z.boolean().optional(),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const deleteDataroomContract = {\n name: \"delete_dataroom\",\n title: \"Delete a dataroom\",\n description: `Permanently delete a dataroom. Every link and folder attached to it goes with it. Documents themselves stay in the team library — only their attachments to this dataroom are removed.\n\nALWAYS confirm with the user (echo the dataroom name and how many documents it contains, via \\`get_dataroom\\`) before calling. This is irreversible. Requires scope \\`datarooms.write\\`.`,\n inputSchema: {\n dataroom_id: z.string().min(1),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const attachDataroomDocumentContract = {\n name: \"attach_dataroom_document\",\n title: \"Attach a document to a dataroom\",\n description: `Add an existing team-library document to a dataroom. The document stays in the library; this only creates the attachment.\n\nWORKFLOW:\n(1) Resolve both ids — the dataroom via \\`search_datarooms\\`, the document via \\`search_documents\\`.\n(2) Optionally pass a dataroom \\`folder_id\\` (created via \\`create_dataroom_folder\\`) to nest the attachment under a folder.\n\nRequires scope \\`datarooms.write\\`.`,\n inputSchema: {\n dataroom_id: z.string().min(1),\n document_id: z.string().min(1),\n folder_id: z\n .string()\n .optional()\n .describe(\n \"Optional dataroom-folder id to place the attachment under. Folder must belong to this dataroom.\",\n ),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const detachDataroomDocumentContract = {\n name: \"detach_dataroom_document\",\n title: \"Detach a document from a dataroom\",\n description: `Remove a single document's attachment to a dataroom, identified by its dataroom-document id — the \\`id\\` returned by \\`attach_dataroom_document\\` or \\`list_dataroom_documents\\`, NOT the underlying \\`document_id\\`. The document stays in the team library and remains attached to any other datarooms; only this one attachment is removed.\n\nPrefer this over deleting and recreating a folder when you only need to remove one file. Requires scope \\`datarooms.write\\`.`,\n inputSchema: {\n dataroom_id: z.string().min(1),\n dataroom_document_id: z.string().min(1),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const moveDataroomDocumentContract = {\n name: \"move_dataroom_document\",\n title: \"Move a document within a dataroom\",\n description: `Move a dataroom document into a different folder of the same dataroom. Identify it by its dataroom-document id — the \\`id\\` from \\`attach_dataroom_document\\` or \\`list_dataroom_documents\\`, NOT the underlying \\`document_id\\`. Pass \\`folder_id: null\\` to move it to the dataroom root. The target folder must belong to this dataroom. Requires scope \\`datarooms.write\\`.`,\n inputSchema: {\n dataroom_id: z.string().min(1),\n dataroom_document_id: z.string().min(1),\n folder_id: z\n .string()\n .nullable()\n .describe(\n \"Target dataroom-folder id to move the document into, or null for the dataroom root.\",\n ),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\n// ─── Dataroom folders ───────────────────────────────────────────────────\n\nexport const listDataroomFoldersContract = {\n name: \"list_dataroom_folders\",\n title: \"List folders in a dataroom\",\n description: `List folders inside a dataroom. Pass \\`parent_id: \"root\"\\` for top-level, a folder id for direct children, or omit for every folder in the dataroom.\n\nUSE THIS when you need a dataroom \\`folder_id\\` for \\`attach_dataroom_document\\` or \\`create_dataroom_folder\\`. Requires scope \\`datarooms.read\\`.`,\n inputSchema: {\n dataroom_id: z.string().min(1),\n parent_id: z.string().optional(),\n limit: z.number().int().min(1).max(100).optional(),\n cursor: z.string().optional(),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const getDataroomFolderContract = {\n name: \"get_dataroom_folder\",\n title: \"Get a dataroom folder\",\n description:\n \"Fetch a single dataroom folder. Requires scope `datarooms.read`.\",\n inputSchema: {\n dataroom_id: z.string().min(1),\n folder_id: z.string().min(1),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const createDataroomFolderContract = {\n name: \"create_dataroom_folder\",\n title: \"Create a folder in a dataroom\",\n description:\n \"Create a folder inside a dataroom. Pass an existing dataroom-folder id as `parent_id` to nest, omit for the dataroom root. Folders here are scoped to a single dataroom and are separate from team-library folders. Requires scope `datarooms.write`.\",\n inputSchema: {\n dataroom_id: z.string().min(1),\n name: z.string().min(1).max(256),\n parent_id: z.string().nullable().optional(),\n icon: FolderIconEnum.optional(),\n color: FolderColorEnum.optional(),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const updateDataroomFolderContract = {\n name: \"update_dataroom_folder\",\n title: \"Update a dataroom folder\",\n description:\n \"Rename a dataroom folder, change its icon/color. Pass null to clear icon/color. Use `move_dataroom_folder` to change its parent. Requires scope `datarooms.write`.\",\n inputSchema: {\n dataroom_id: z.string().min(1),\n folder_id: z.string().min(1),\n name: z.string().min(1).max(256).optional(),\n icon: FolderIconEnum.nullable().optional(),\n color: FolderColorEnum.nullable().optional(),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const deleteDataroomFolderContract = {\n name: \"delete_dataroom_folder\",\n title: \"Delete a dataroom folder\",\n description: `Delete a dataroom folder. By default this only succeeds if the folder is empty. Pass \\`cascade: true\\` to also delete every nested folder + dataroom-document attachment beneath it. The underlying documents in the team library are NOT deleted — only their attachments to this dataroom.\n\nConfirm with the user before passing cascade. Requires scope \\`datarooms.write\\`.`,\n inputSchema: {\n dataroom_id: z.string().min(1),\n folder_id: z.string().min(1),\n cascade: z.boolean().optional(),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const moveDataroomFolderContract = {\n name: \"move_dataroom_folder\",\n title: \"Move a dataroom folder\",\n description:\n \"Move a folder under a different parent within the same dataroom. Pass `parent_id: null` to move to the dataroom root. Requires scope `datarooms.write`.\",\n inputSchema: {\n dataroom_id: z.string().min(1),\n folder_id: z.string().min(1),\n parent_id: z.string().nullable(),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\n// ─── Visitors ───────────────────────────────────────────────────────────\n\nexport const getVisitorContract = {\n name: \"get_visitor\",\n title: \"Get a visitor\",\n description:\n \"Fetch a single visitor (Viewer row) by id, including total view count and last-seen timestamp. Use `list_visitors` with an email filter to find the id. Requires scope `visitors.read`.\",\n inputSchema: {\n visitor_id: z.string().min(1),\n },\n} as const satisfies ToolContract<z.ZodRawShape>;\n\nexport const SHARED_TOOL_OUTPUT_SCHEMAS = {\n [listDocumentsContract.name]: documentsListOutputSchema,\n [getDocumentContract.name]: documentObjectOutputSchema,\n [searchDocumentsContract.name]: documentsListOutputSchema,\n [createLinkContract.name]: linkOutputSchema,\n [listLinksContract.name]: linksListOutputSchema,\n [listLinkViewsContract.name]: viewsListOutputSchema,\n [listDataroomsContract.name]: dataroomsListOutputSchema,\n [searchDataroomsContract.name]: dataroomsListOutputSchema,\n [getDataroomContract.name]: dataroomObjectOutputSchema,\n [createDataroomContract.name]: dataroomOutputSchema,\n [listDataroomDocumentsContract.name]: dataroomDocumentsListOutputSchema,\n [listVisitorsContract.name]: visitorsListOutputSchema,\n [listVisitorViewsContract.name]: visitorViewsListOutputSchema,\n [getDocumentAnalyticsContract.name]: documentAnalyticsOutputSchema,\n [getLinkAnalyticsContract.name]: linkAnalyticsOutputSchema,\n [getDataroomAnalyticsContract.name]: dataroomAnalyticsOutputSchema,\n [getViewAnalyticsContract.name]: viewAnalyticsOutputSchema,\n [updateDocumentContract.name]: documentOutputSchema,\n [deleteDocumentContract.name]: deletedObjectOutputSchema,\n [listDocumentVersionsContract.name]: versionsListOutputSchema,\n [getDocumentVersionContract.name]: documentVersionObjectOutputSchema,\n [addDocumentVersionContract.name]: versionOutputSchema,\n [promoteDocumentVersionContract.name]: versionOutputSchema,\n [listFoldersContract.name]: foldersListOutputSchema,\n [getFolderContract.name]: folderObjectOutputSchema,\n [createFolderContract.name]: folderOutputSchema,\n [updateFolderContract.name]: folderOutputSchema,\n [deleteFolderContract.name]: deletedObjectOutputSchema,\n [moveFolderContract.name]: folderOutputSchema,\n [getLinkContract.name]: linkOutputSchema,\n [updateLinkContract.name]: linkOutputSchema,\n [deleteLinkContract.name]: deletedObjectOutputSchema,\n [updateDataroomContract.name]: dataroomOutputSchema,\n [deleteDataroomContract.name]: deletedObjectOutputSchema,\n [attachDataroomDocumentContract.name]: dataroomItemOutputSchema,\n [detachDataroomDocumentContract.name]: deletedObjectOutputSchema,\n [moveDataroomDocumentContract.name]: dataroomItemOutputSchema,\n [listDataroomFoldersContract.name]: foldersListOutputSchema,\n [getDataroomFolderContract.name]: folderObjectOutputSchema,\n [createDataroomFolderContract.name]: folderOutputSchema,\n [updateDataroomFolderContract.name]: folderOutputSchema,\n [deleteDataroomFolderContract.name]: deletedObjectOutputSchema,\n [moveDataroomFolderContract.name]: folderOutputSchema,\n [getVisitorContract.name]: visitorObjectOutputSchema,\n} as const satisfies Record<string, unknown>;\n"],"mappings":"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","names":[]}
|