@papermark/mcp-server 0.7.0 → 0.9.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/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: `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"]}
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 addDataroomGroupMembersContract,\n addDocumentVersionContract,\n attachDataroomDocumentContract,\n createDataroomContract,\n createDataroomFolderContract,\n createDataroomGroupContract,\n createFolderContract,\n createLinkContract,\n deleteDataroomContract,\n deleteDataroomFolderContract,\n deleteDataroomGroupContract,\n deleteDocumentContract,\n deleteFolderContract,\n deleteLinkContract,\n detachDataroomDocumentContract,\n getDataroomAnalyticsContract,\n getDataroomContract,\n getDataroomFolderContract,\n getDataroomGroupContract,\n getDataroomGroupPermissionsContract,\n getDocumentAnalyticsContract,\n getDocumentContract,\n getDocumentVersionContract,\n getFolderContract,\n getLinkAnalyticsContract,\n getLinkContract,\n getLinkPermissionsContract,\n getViewAnalyticsContract,\n getVisitorContract,\n listDataroomDocumentsContract,\n listDataroomFoldersContract,\n listDataroomGroupMembersContract,\n listDataroomGroupsContract,\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 removeDataroomGroupMemberContract,\n searchDataroomsContract,\n searchDocumentsContract,\n setDataroomGroupPermissionsContract,\n setLinkPermissionsContract,\n SHARED_TOOL_OUTPUT_SCHEMAS,\n documentOutputSchema,\n updateDataroomContract,\n updateDataroomFolderContract,\n updateDataroomGroupContract,\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 list_dataroom_groups: readTool(),\n get_dataroom_group: readTool(),\n create_dataroom_group: writeTool(),\n update_dataroom_group: destructiveTool(),\n delete_dataroom_group: destructiveTool(),\n list_dataroom_group_members: readTool(),\n add_dataroom_group_members: writeTool(),\n remove_dataroom_group_member: destructiveTool(),\n get_dataroom_group_permissions: readTool(),\n set_dataroom_group_permissions: destructiveTool(),\n get_link_permissions: readTool(),\n set_link_permissions: 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 // ─── Dataroom groups ─────────────────────────────────────────────────\n server.registerTool(\n listDataroomGroupsContract.name,\n {\n title: listDataroomGroupsContract.title,\n description: listDataroomGroupsContract.description,\n inputSchema: listDataroomGroupsContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const list = await api.listDataroomGroups(args.dataroom_id, {\n limit: args.limit,\n cursor: args.cursor,\n });\n return { groups: list.data, next_cursor: list.next_cursor };\n }, \"list_dataroom_groups\"),\n );\n\n server.registerTool(\n getDataroomGroupContract.name,\n {\n title: getDataroomGroupContract.title,\n description: getDataroomGroupContract.description,\n inputSchema: getDataroomGroupContract.inputSchema,\n },\n async (args) =>\n run(\n () => api.getDataroomGroup(args.dataroom_id, args.group_id),\n \"get_dataroom_group\",\n ),\n );\n\n server.registerTool(\n createDataroomGroupContract.name,\n {\n title: createDataroomGroupContract.title,\n description: createDataroomGroupContract.description,\n inputSchema: createDataroomGroupContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const { dataroom_id, ...body } = args;\n const group = await api.createDataroomGroup(dataroom_id, body);\n return { group };\n }, \"create_dataroom_group\"),\n );\n\n server.registerTool(\n updateDataroomGroupContract.name,\n {\n title: updateDataroomGroupContract.title,\n description: updateDataroomGroupContract.description,\n inputSchema: updateDataroomGroupContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const { dataroom_id, group_id, ...body } = args;\n if (Object.keys(body).length === 0) {\n throw new Error(\n \"Provide at least one of `name`, `allow_all`, `domains`.\",\n );\n }\n const group = await api.updateDataroomGroup(\n dataroom_id,\n group_id,\n body,\n );\n return { group };\n }, \"update_dataroom_group\"),\n );\n\n server.registerTool(\n deleteDataroomGroupContract.name,\n {\n title: deleteDataroomGroupContract.title,\n description: deleteDataroomGroupContract.description,\n inputSchema: deleteDataroomGroupContract.inputSchema,\n },\n async (args) =>\n run(\n () => api.deleteDataroomGroup(args.dataroom_id, args.group_id),\n \"delete_dataroom_group\",\n ),\n );\n\n server.registerTool(\n listDataroomGroupMembersContract.name,\n {\n title: listDataroomGroupMembersContract.title,\n description: listDataroomGroupMembersContract.description,\n inputSchema: listDataroomGroupMembersContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const list = await api.listDataroomGroupMembers(\n args.dataroom_id,\n args.group_id,\n { limit: args.limit, cursor: args.cursor },\n );\n return { members: list.data, next_cursor: list.next_cursor };\n }, \"list_dataroom_group_members\"),\n );\n\n server.registerTool(\n addDataroomGroupMembersContract.name,\n {\n title: addDataroomGroupMembersContract.title,\n description: addDataroomGroupMembersContract.description,\n inputSchema: addDataroomGroupMembersContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const list = await api.addDataroomGroupMembers(\n args.dataroom_id,\n args.group_id,\n { emails: args.emails },\n );\n return { members: list.data, next_cursor: list.next_cursor };\n }, \"add_dataroom_group_members\"),\n );\n\n server.registerTool(\n removeDataroomGroupMemberContract.name,\n {\n title: removeDataroomGroupMemberContract.title,\n description: removeDataroomGroupMemberContract.description,\n inputSchema: removeDataroomGroupMemberContract.inputSchema,\n },\n async (args) =>\n run(\n () =>\n api.removeDataroomGroupMember(\n args.dataroom_id,\n args.group_id,\n args.member_id,\n ),\n \"remove_dataroom_group_member\",\n ),\n );\n\n server.registerTool(\n getDataroomGroupPermissionsContract.name,\n {\n title: getDataroomGroupPermissionsContract.title,\n description: getDataroomGroupPermissionsContract.description,\n inputSchema: getDataroomGroupPermissionsContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const list = await api.listDataroomGroupPermissions(\n args.dataroom_id,\n args.group_id,\n { limit: args.limit, cursor: args.cursor },\n );\n return { permissions: list.data, next_cursor: list.next_cursor };\n }, \"get_dataroom_group_permissions\"),\n );\n\n server.registerTool(\n setDataroomGroupPermissionsContract.name,\n {\n title: setDataroomGroupPermissionsContract.title,\n description: setDataroomGroupPermissionsContract.description,\n inputSchema: setDataroomGroupPermissionsContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const res = await api.setDataroomGroupPermissions(\n args.dataroom_id,\n args.group_id,\n { permissions: args.permissions },\n );\n return { permissions: res.data };\n }, \"set_dataroom_group_permissions\"),\n );\n\n server.registerTool(\n getLinkPermissionsContract.name,\n {\n title: getLinkPermissionsContract.title,\n description: getLinkPermissionsContract.description,\n inputSchema: getLinkPermissionsContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const res = await api.getLinkPermissions(args.link_id);\n return { permissions: res.data };\n }, \"get_link_permissions\"),\n );\n\n server.registerTool(\n setLinkPermissionsContract.name,\n {\n title: setLinkPermissionsContract.title,\n description: setLinkPermissionsContract.description,\n inputSchema: setLinkPermissionsContract.inputSchema,\n },\n async (args) =>\n run(async () => {\n const res = await api.setLinkPermissions(args.link_id, {\n permissions: args.permissions,\n });\n return { permissions: res.data };\n }, \"set_link_permissions\"),\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 type LinkAudienceType = \"general\" | \"group\" | \"team\";\n\nexport interface PublicLink {\n id: string;\n object: \"link\";\n name: string | null;\n target_type: \"document\" | \"dataroom\";\n audience_type: LinkAudienceType;\n group_id: string | null;\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 enable_agreement: boolean;\n agreement_id: string | null;\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 // `group` (dataroom links only) scopes the link to a dataroom group and\n // forces email protection; `general` clears the group scope.\n audience_type?: \"general\" | \"group\";\n group_id?: string | null;\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 enable_agreement?: boolean;\n agreement_id?: string | null;\n // Pass `domain` + `slug` together to host the link on a verified custom\n // domain; pass `domain: \"papermark.com\"` to move it back to the default.\n domain?: string;\n slug?: string;\n}\n\nexport interface PublicDataroomGroup {\n id: string;\n object: \"dataroom_group\";\n name: string;\n allow_all: boolean;\n domains: string[];\n member_count: number;\n link_count: number;\n dataroom_id: string;\n created: string;\n updated_at: string;\n}\n\nexport interface DataroomGroupList {\n data: PublicDataroomGroup[];\n next_cursor: string | null;\n}\n\nexport interface PublicDataroomGroupMember {\n // Membership id — use it to remove the member.\n id: string;\n object: \"dataroom_group_member\";\n email: string;\n viewer_id: string;\n created: string;\n}\n\nexport interface DataroomGroupMemberList {\n data: PublicDataroomGroupMember[];\n next_cursor: string | null;\n}\n\nexport type PermissionItemType = \"dataroom_document\" | \"dataroom_folder\";\n\nexport interface PermissionEntry {\n item_id: string;\n item_type: PermissionItemType;\n can_view: boolean;\n can_download: boolean;\n}\n\nexport interface DataroomGroupPermission {\n object: \"dataroom_group_permission\";\n item_id: string;\n item_type: PermissionItemType;\n can_view: boolean;\n can_download: boolean;\n updated_at: string;\n}\n\nexport interface DataroomGroupPermissionList {\n data: DataroomGroupPermission[];\n next_cursor: string | null;\n}\n\nexport interface LinkPermission {\n object: \"link_permission\";\n item_id: string;\n item_type: PermissionItemType;\n can_view: boolean;\n can_download: boolean;\n can_download_original: boolean;\n updated_at: string;\n}\n\nexport interface LinkPermissionList {\n data: LinkPermission[];\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 | \"dataroom_group\"\n | \"dataroom_group_member\";\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 group_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 // `group` (dataroom links only) requires group_id and forces email\n // protection.\n audience_type?: \"general\" | \"group\";\n group_id?: string;\n name?: string;\n expires_at?: string;\n password?: string;\n email_protected?: boolean;\n email_authenticated?: boolean;\n allow_download?: boolean;\n allow_list?: string[];\n deny_list?: string[];\n enable_confidential_view?: boolean;\n enable_watermark?: boolean;\n watermark_config?: WatermarkConfig;\n enable_screenshot_protection?: boolean;\n enable_agreement?: boolean;\n agreement_id?: string;\n // Pass `domain` + `slug` together to host the link on a verified custom\n // domain (requires a plan that supports custom domains).\n domain?: string;\n slug?: string;\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 getLinkPermissions: (id: string, token?: string) =>\n request<LinkPermissionList>(`/v1/links/${id}/permissions`, { token }),\n // Full-replace semantics: the payload is the complete desired state;\n // items not listed lose their override.\n setLinkPermissions: (\n id: string,\n body: { permissions: PermissionEntry[] },\n token?: string,\n ) =>\n request<LinkPermissionList>(`/v1/links/${id}/permissions`, {\n method: \"PUT\",\n body,\n token,\n }),\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 // Dataroom groups\n listDataroomGroups: (\n id: string,\n query?: { limit?: number; cursor?: string },\n token?: string,\n ) => request<DataroomGroupList>(`/v1/datarooms/${id}/groups`, { query, token }),\n createDataroomGroup: (\n id: string,\n body: { name: string; allow_all?: boolean; domains?: string[] },\n token?: string,\n ) =>\n request<PublicDataroomGroup>(`/v1/datarooms/${id}/groups`, {\n method: \"POST\",\n body,\n token,\n }),\n getDataroomGroup: (id: string, gid: string, token?: string) =>\n request<PublicDataroomGroup>(`/v1/datarooms/${id}/groups/${gid}`, { token }),\n updateDataroomGroup: (\n id: string,\n gid: string,\n body: { name?: string; allow_all?: boolean; domains?: string[] },\n token?: string,\n ) =>\n request<PublicDataroomGroup>(`/v1/datarooms/${id}/groups/${gid}`, {\n method: \"PATCH\",\n body,\n token,\n }),\n // Also deletes every share link pointing at the group (matching the\n // dashboard).\n deleteDataroomGroup: (id: string, gid: string, token?: string) =>\n request<DeletedObject>(`/v1/datarooms/${id}/groups/${gid}`, {\n method: \"DELETE\",\n token,\n }),\n listDataroomGroupMembers: (\n id: string,\n gid: string,\n query?: { limit?: number; cursor?: string },\n token?: string,\n ) =>\n request<DataroomGroupMemberList>(\n `/v1/datarooms/${id}/groups/${gid}/members`,\n { query, token },\n ),\n addDataroomGroupMembers: (\n id: string,\n gid: string,\n body: { emails: string[] },\n token?: string,\n ) =>\n request<DataroomGroupMemberList>(\n `/v1/datarooms/${id}/groups/${gid}/members`,\n { method: \"POST\", body, token },\n ),\n removeDataroomGroupMember: (\n id: string,\n gid: string,\n mid: string,\n token?: string,\n ) =>\n request<DeletedObject>(\n `/v1/datarooms/${id}/groups/${gid}/members/${mid}`,\n { method: \"DELETE\", token },\n ),\n listDataroomGroupPermissions: (\n id: string,\n gid: string,\n query?: { limit?: number; cursor?: string },\n token?: string,\n ) =>\n request<DataroomGroupPermissionList>(\n `/v1/datarooms/${id}/groups/${gid}/permissions`,\n { query, token },\n ),\n // Upsert-delta semantics: entries sent are upserted, entries omitted keep\n // their current state; ancestor folders of visible items are auto-shown.\n setDataroomGroupPermissions: (\n id: string,\n gid: string,\n body: { permissions: PermissionEntry[] },\n token?: string,\n ) =>\n request<{ data: DataroomGroupPermission[] }>(\n `/v1/datarooms/${id}/groups/${gid}/permissions`,\n { method: \"PUT\", body, 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"]}