@triffon/google-docs-mcp 1.11.3-triffon
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/LICENSE +7 -0
- package/README.md +567 -0
- package/dist/auth.js +327 -0
- package/dist/cachedToolsList.js +38 -0
- package/dist/clients.js +180 -0
- package/dist/config.js +9 -0
- package/dist/downloadProxy.js +82 -0
- package/dist/driveQueryUtils.js +7 -0
- package/dist/firestoreTokenStorage.js +32 -0
- package/dist/googleDocsApiHelpers.js +1257 -0
- package/dist/googleSheetsApiHelpers.js +849 -0
- package/dist/index.js +240 -0
- package/dist/landingPage.js +103 -0
- package/dist/logger.js +58 -0
- package/dist/markdown-transformer/docsToMarkdown.js +259 -0
- package/dist/markdown-transformer/index.js +128 -0
- package/dist/markdown-transformer/markdownToDocs.js +834 -0
- package/dist/remoteWrapper.js +72 -0
- package/dist/tools/calendar/createEvent.js +89 -0
- package/dist/tools/calendar/deleteEvent.js +49 -0
- package/dist/tools/calendar/helpers.js +19 -0
- package/dist/tools/calendar/index.js +12 -0
- package/dist/tools/calendar/listEvents.js +84 -0
- package/dist/tools/calendar/quickAddEvent.js +55 -0
- package/dist/tools/calendar/updateEvent.js +84 -0
- package/dist/tools/docs/addTab.js +84 -0
- package/dist/tools/docs/appendTableRows.js +89 -0
- package/dist/tools/docs/appendToGoogleDoc.js +85 -0
- package/dist/tools/docs/cloneTable.js +159 -0
- package/dist/tools/docs/comments/addComment.js +83 -0
- package/dist/tools/docs/comments/deleteComment.js +30 -0
- package/dist/tools/docs/comments/getComment.js +45 -0
- package/dist/tools/docs/comments/index.js +14 -0
- package/dist/tools/docs/comments/listComments.js +43 -0
- package/dist/tools/docs/comments/replyToComment.js +35 -0
- package/dist/tools/docs/comments/resolveComment.js +55 -0
- package/dist/tools/docs/deleteRange.js +61 -0
- package/dist/tools/docs/deleteTableRows.js +62 -0
- package/dist/tools/docs/findAndReplace.js +54 -0
- package/dist/tools/docs/findElement.js +43 -0
- package/dist/tools/docs/findSectionsByHeading.js +46 -0
- package/dist/tools/docs/formatting/applyParagraphStyle.js +83 -0
- package/dist/tools/docs/formatting/applyTextStyle.js +49 -0
- package/dist/tools/docs/formatting/batchApplyTextStyle.js +86 -0
- package/dist/tools/docs/formatting/index.js +16 -0
- package/dist/tools/docs/formatting/updateTableBorders.js +81 -0
- package/dist/tools/docs/formatting/updateTableCellStyle.js +85 -0
- package/dist/tools/docs/formatting/updateTableColumnWidth.js +51 -0
- package/dist/tools/docs/formatting/updateTableRowStyle.js +74 -0
- package/dist/tools/docs/getTableStructure.js +48 -0
- package/dist/tools/docs/index.js +66 -0
- package/dist/tools/docs/insertDateChip.js +82 -0
- package/dist/tools/docs/insertImage.js +112 -0
- package/dist/tools/docs/insertPageBreak.js +47 -0
- package/dist/tools/docs/insertPerson.js +53 -0
- package/dist/tools/docs/insertRichLink.js +58 -0
- package/dist/tools/docs/insertSectionBreak.js +60 -0
- package/dist/tools/docs/insertTable.js +42 -0
- package/dist/tools/docs/insertTableWithData.js +125 -0
- package/dist/tools/docs/insertText.js +49 -0
- package/dist/tools/docs/listDocumentTables.js +47 -0
- package/dist/tools/docs/listDocumentTabs.js +59 -0
- package/dist/tools/docs/listSmartChips.js +41 -0
- package/dist/tools/docs/modifyText.js +147 -0
- package/dist/tools/docs/readGoogleDoc.js +164 -0
- package/dist/tools/docs/renameTab.js +47 -0
- package/dist/tools/docs/replaceTableRowData.js +55 -0
- package/dist/tools/docs/smartChipHelpers.js +71 -0
- package/dist/tools/docs/structureHelpers.js +250 -0
- package/dist/tools/docs/tabFieldMasks.js +48 -0
- package/dist/tools/docs/tableRowDataHelpers.js +53 -0
- package/dist/tools/docs/updateSectionStyle.js +148 -0
- package/dist/tools/drive/copyFile.js +63 -0
- package/dist/tools/drive/createDocument.js +105 -0
- package/dist/tools/drive/createFolder.js +48 -0
- package/dist/tools/drive/createFromTemplate.js +82 -0
- package/dist/tools/drive/deleteFile.js +72 -0
- package/dist/tools/drive/downloadFile.js +266 -0
- package/dist/tools/drive/getDocumentInfo.js +48 -0
- package/dist/tools/drive/getFolderInfo.js +48 -0
- package/dist/tools/drive/index.js +34 -0
- package/dist/tools/drive/listDriveFiles.js +129 -0
- package/dist/tools/drive/listFolderContents.js +83 -0
- package/dist/tools/drive/listGoogleDocs.js +70 -0
- package/dist/tools/drive/moveFile.js +54 -0
- package/dist/tools/drive/renameFile.js +39 -0
- package/dist/tools/drive/savePathGuard.js +86 -0
- package/dist/tools/drive/searchDriveFiles.js +148 -0
- package/dist/tools/drive/searchGoogleDocs.js +77 -0
- package/dist/tools/drive/setFilePermission.js +68 -0
- package/dist/tools/gmail/createDraft.js +58 -0
- package/dist/tools/gmail/deleteDraft.js +37 -0
- package/dist/tools/gmail/getDraft.js +52 -0
- package/dist/tools/gmail/getMessage.js +92 -0
- package/dist/tools/gmail/helpers.js +113 -0
- package/dist/tools/gmail/index.js +28 -0
- package/dist/tools/gmail/listDrafts.js +74 -0
- package/dist/tools/gmail/listLabels.js +31 -0
- package/dist/tools/gmail/listMessages.js +87 -0
- package/dist/tools/gmail/modifyMessageLabels.js +54 -0
- package/dist/tools/gmail/sendDraft.js +42 -0
- package/dist/tools/gmail/sendEmail.js +56 -0
- package/dist/tools/gmail/trashMessage.js +37 -0
- package/dist/tools/gmail/triageInbox.js +147 -0
- package/dist/tools/gmail/updateDraft.js +60 -0
- package/dist/tools/index.js +64 -0
- package/dist/tools/script/appsScriptShared.js +96 -0
- package/dist/tools/script/createAppsScriptProject.js +74 -0
- package/dist/tools/script/getAppsScriptContent.js +56 -0
- package/dist/tools/script/index.js +14 -0
- package/dist/tools/script/updateAppsScriptContent.js +56 -0
- package/dist/tools/sheets/addConditionalFormatting.js +143 -0
- package/dist/tools/sheets/addSpreadsheetSheet.js +34 -0
- package/dist/tools/sheets/appendSpreadsheetRows.js +44 -0
- package/dist/tools/sheets/appendTableRows.js +51 -0
- package/dist/tools/sheets/autoResizeColumns.js +67 -0
- package/dist/tools/sheets/autoResizeRows.js +63 -0
- package/dist/tools/sheets/batchWrite.js +61 -0
- package/dist/tools/sheets/clearSpreadsheetRange.js +31 -0
- package/dist/tools/sheets/comments/commentAnchor.js +95 -0
- package/dist/tools/sheets/comments/createSheetsCellNote.js +33 -0
- package/dist/tools/sheets/comments/createSheetsComment.js +168 -0
- package/dist/tools/sheets/comments/deleteSheetsComment.js +32 -0
- package/dist/tools/sheets/comments/getSheetsComment.js +51 -0
- package/dist/tools/sheets/comments/index.js +16 -0
- package/dist/tools/sheets/comments/listSheetsComments.js +177 -0
- package/dist/tools/sheets/comments/replyToSheetsComment.js +37 -0
- package/dist/tools/sheets/comments/resolveSheetsComment.js +53 -0
- package/dist/tools/sheets/copyFormatting.js +59 -0
- package/dist/tools/sheets/copySheetTo.js +36 -0
- package/dist/tools/sheets/createSpreadsheet.js +72 -0
- package/dist/tools/sheets/createTable.js +120 -0
- package/dist/tools/sheets/deleteChart.js +41 -0
- package/dist/tools/sheets/deleteConditionalFormatting.js +46 -0
- package/dist/tools/sheets/deleteSheet.js +43 -0
- package/dist/tools/sheets/deleteTable.js +56 -0
- package/dist/tools/sheets/duplicateSheet.js +53 -0
- package/dist/tools/sheets/formatCells.js +122 -0
- package/dist/tools/sheets/freezeRowsAndColumns.js +58 -0
- package/dist/tools/sheets/getConditionalFormatting.js +98 -0
- package/dist/tools/sheets/getSpreadsheetInfo.js +44 -0
- package/dist/tools/sheets/getTable.js +48 -0
- package/dist/tools/sheets/groupRows.js +62 -0
- package/dist/tools/sheets/index.js +84 -0
- package/dist/tools/sheets/insertChart.js +225 -0
- package/dist/tools/sheets/listGoogleSheets.js +66 -0
- package/dist/tools/sheets/listTables.js +55 -0
- package/dist/tools/sheets/protectRange.js +59 -0
- package/dist/tools/sheets/readCellFormat.js +143 -0
- package/dist/tools/sheets/readSpreadsheet.js +36 -0
- package/dist/tools/sheets/renameSheet.js +48 -0
- package/dist/tools/sheets/setCellBorders.js +94 -0
- package/dist/tools/sheets/setColumnWidths.js +43 -0
- package/dist/tools/sheets/setDropdownValidation.js +51 -0
- package/dist/tools/sheets/setRowHeights.js +63 -0
- package/dist/tools/sheets/ungroupAllRows.js +66 -0
- package/dist/tools/sheets/updateTableRange.js +51 -0
- package/dist/tools/sheets/writeSpreadsheet.js +45 -0
- package/dist/tools/utils/appendMarkdownToGoogleDoc.js +95 -0
- package/dist/tools/utils/index.js +8 -0
- package/dist/tools/utils/replaceDocumentWithMarkdown.js +161 -0
- package/dist/tools/utils/replaceRangeWithMarkdown.js +72 -0
- package/dist/types.js +208 -0
- package/dist/upstreamAuth.js +62 -0
- package/package.json +51 -0
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
// src/markdown-transformer/index.ts
|
|
2
|
+
//
|
|
3
|
+
// Public API for bidirectional markdown <-> Google Docs conversion.
|
|
4
|
+
//
|
|
5
|
+
// Main methods:
|
|
6
|
+
// extractMarkdown() - Fetch a Google Doc and return its content as markdown
|
|
7
|
+
// insertMarkdown() - Convert markdown and insert it into a Google Doc
|
|
8
|
+
//
|
|
9
|
+
// Helper:
|
|
10
|
+
// docsJsonToMarkdown() - Convert already-fetched Docs JSON to markdown
|
|
11
|
+
//
|
|
12
|
+
import { docsJsonToMarkdown } from './docsToMarkdown.js';
|
|
13
|
+
import { convertMarkdownToRequests } from './markdownToDocs.js';
|
|
14
|
+
import { executeBatchUpdateWithSplitting, findTabById } from '../googleDocsApiHelpers.js';
|
|
15
|
+
export { docsJsonToMarkdown } from './docsToMarkdown.js';
|
|
16
|
+
/** Formats InsertMarkdownResult into a concise human-readable debug summary. */
|
|
17
|
+
export function formatInsertResult(result) {
|
|
18
|
+
const lines = [];
|
|
19
|
+
lines.push(`Markdown insert completed in ${result.totalElapsedMs}ms`);
|
|
20
|
+
lines.push(` Parse: ${result.parseElapsedMs}ms`);
|
|
21
|
+
lines.push(` Requests: ${result.totalRequests} total (${Object.entries(result.requestsByType)
|
|
22
|
+
.map(([k, v]) => `${v} ${k}`)
|
|
23
|
+
.join(', ')})`);
|
|
24
|
+
lines.push(` API calls: ${result.batchUpdate.totalApiCalls} batchUpdate calls in ${result.batchUpdate.totalElapsedMs}ms`);
|
|
25
|
+
const { phases } = result.batchUpdate;
|
|
26
|
+
if (phases.delete.requests > 0) {
|
|
27
|
+
lines.push(` Delete phase: ${phases.delete.requests} requests, ${phases.delete.apiCalls} calls, ${phases.delete.elapsedMs}ms`);
|
|
28
|
+
}
|
|
29
|
+
if (phases.insert.requests > 0) {
|
|
30
|
+
lines.push(` Insert phase: ${phases.insert.requests} requests, ${phases.insert.apiCalls} calls, ${phases.insert.elapsedMs}ms`);
|
|
31
|
+
}
|
|
32
|
+
if (phases.format.requests > 0) {
|
|
33
|
+
lines.push(` Format phase: ${phases.format.requests} requests, ${phases.format.apiCalls} calls, ${phases.format.elapsedMs}ms`);
|
|
34
|
+
}
|
|
35
|
+
return lines.join('\n');
|
|
36
|
+
}
|
|
37
|
+
// --- extractMarkdown ---
|
|
38
|
+
/**
|
|
39
|
+
* Fetches a Google Document and returns its content as a markdown string.
|
|
40
|
+
*
|
|
41
|
+
* @param docs - An authenticated Google Docs API client
|
|
42
|
+
* @param documentId - The document ID (from the URL)
|
|
43
|
+
* @param options - Optional: tabId to target a specific tab
|
|
44
|
+
* @returns The document content as markdown
|
|
45
|
+
*/
|
|
46
|
+
export async function extractMarkdown(docs, documentId, options) {
|
|
47
|
+
const tabId = options?.tabId;
|
|
48
|
+
const res = await docs.documents.get({
|
|
49
|
+
documentId,
|
|
50
|
+
includeTabsContent: !!tabId,
|
|
51
|
+
fields: tabId
|
|
52
|
+
? 'title,documentId,tabs(tabProperties,childTabs,documentTab(body,documentStyle,namedStyles,lists,inlineObjects,positionedObjects))'
|
|
53
|
+
: 'title,documentId,body,documentStyle,namedStyles,lists,inlineObjects,positionedObjects',
|
|
54
|
+
});
|
|
55
|
+
if (tabId) {
|
|
56
|
+
const targetTab = findTabById(res.data, tabId);
|
|
57
|
+
if (!targetTab) {
|
|
58
|
+
throw new Error(`Tab with ID "${tabId}" not found in document.`);
|
|
59
|
+
}
|
|
60
|
+
if (!targetTab.documentTab) {
|
|
61
|
+
throw new Error(`Tab "${tabId}" does not have content (may not be a document tab).`);
|
|
62
|
+
}
|
|
63
|
+
return docsJsonToMarkdown({
|
|
64
|
+
body: targetTab.documentTab.body,
|
|
65
|
+
lists: targetTab.documentTab.lists,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
return docsJsonToMarkdown({
|
|
69
|
+
body: res.data.body,
|
|
70
|
+
lists: res.data.lists,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
// --- insertMarkdown ---
|
|
74
|
+
/**
|
|
75
|
+
* Converts markdown to Google Docs formatting and inserts it into a document.
|
|
76
|
+
*
|
|
77
|
+
* Handles the full pipeline: markdown parsing, request generation, and batch
|
|
78
|
+
* execution against the Docs API. Callers never see raw API requests.
|
|
79
|
+
*
|
|
80
|
+
* @param docs - An authenticated Google Docs API client
|
|
81
|
+
* @param documentId - The document ID
|
|
82
|
+
* @param markdown - The markdown content to insert
|
|
83
|
+
* @param options - Optional: startIndex (default 1), tabId
|
|
84
|
+
* @returns Debug metadata about the operation (request counts, timing, API calls)
|
|
85
|
+
*/
|
|
86
|
+
export async function insertMarkdown(docs, documentId, markdown, options) {
|
|
87
|
+
const overallStart = performance.now();
|
|
88
|
+
const startIndex = options?.startIndex ?? 1;
|
|
89
|
+
const tabId = options?.tabId;
|
|
90
|
+
const parseStart = performance.now();
|
|
91
|
+
const conversionOptions = options?.firstHeadingAsTitle
|
|
92
|
+
? { firstHeadingAsTitle: true }
|
|
93
|
+
: undefined;
|
|
94
|
+
const requests = convertMarkdownToRequests(markdown, startIndex, tabId, conversionOptions);
|
|
95
|
+
const parseElapsedMs = Math.round(performance.now() - parseStart);
|
|
96
|
+
// Count requests by type
|
|
97
|
+
const requestsByType = {};
|
|
98
|
+
for (const r of requests) {
|
|
99
|
+
const type = Object.keys(r)[0];
|
|
100
|
+
requestsByType[type] = (requestsByType[type] || 0) + 1;
|
|
101
|
+
}
|
|
102
|
+
if (requests.length === 0) {
|
|
103
|
+
return {
|
|
104
|
+
totalRequests: 0,
|
|
105
|
+
requestsByType,
|
|
106
|
+
parseElapsedMs,
|
|
107
|
+
batchUpdate: {
|
|
108
|
+
totalRequests: 0,
|
|
109
|
+
phases: {
|
|
110
|
+
delete: { requests: 0, apiCalls: 0, elapsedMs: 0 },
|
|
111
|
+
insert: { requests: 0, apiCalls: 0, elapsedMs: 0 },
|
|
112
|
+
format: { requests: 0, apiCalls: 0, elapsedMs: 0 },
|
|
113
|
+
},
|
|
114
|
+
totalApiCalls: 0,
|
|
115
|
+
totalElapsedMs: 0,
|
|
116
|
+
},
|
|
117
|
+
totalElapsedMs: Math.round(performance.now() - overallStart),
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
const batchUpdate = await executeBatchUpdateWithSplitting(docs, documentId, requests);
|
|
121
|
+
return {
|
|
122
|
+
totalRequests: requests.length,
|
|
123
|
+
requestsByType,
|
|
124
|
+
parseElapsedMs,
|
|
125
|
+
batchUpdate,
|
|
126
|
+
totalElapsedMs: Math.round(performance.now() - overallStart),
|
|
127
|
+
};
|
|
128
|
+
}
|