@danyow/lark-mcp 0.5.5 → 0.5.7

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.
@@ -1,5 +1,5 @@
1
1
  import { z } from 'zod';
2
- export type sheetsV2ToolName = 'sheets.v2.spreadsheetValues.get' | 'sheets.v2.spreadsheetValues.batchGet' | 'sheets.v2.spreadsheetValues.update' | 'sheets.v2.spreadsheetValues.batchUpdate' | 'sheets.v2.spreadsheetValues.append' | 'sheets.v2.spreadsheetDimensionRange.insert' | 'sheets.v2.spreadsheetDimensionRange.delete';
2
+ export type sheetsV2ToolName = 'sheets.v2.spreadsheetValues.get' | 'sheets.v2.spreadsheetValues.batchGet' | 'sheets.v2.spreadsheetValues.update' | 'sheets.v2.spreadsheetValues.batchUpdate' | 'sheets.v2.spreadsheetValues.append' | 'sheets.v2.spreadsheetDimensionRange.insert' | 'sheets.v2.spreadsheetDimensionRange.delete' | 'sheets.v2.spreadsheet.mergeCells' | 'sheets.v2.spreadsheet.unmergeCells';
3
3
  /**
4
4
  * Read a single range of cells
5
5
  * GET /open-apis/sheets/v2/spreadsheets/:spreadsheet_token/values/:range
@@ -327,6 +327,69 @@ export declare const sheetsV2SpreadsheetDimensionRangeDelete: {
327
327
  useUAT: z.ZodOptional<z.ZodBoolean>;
328
328
  };
329
329
  };
330
+ /**
331
+ * Merge cells
332
+ * POST /open-apis/sheets/v2/spreadsheets/:spreadsheet_token/merge_cells
333
+ */
334
+ export declare const sheetsV2SpreadsheetMergeCells: {
335
+ project: string;
336
+ name: string;
337
+ sdkName: string;
338
+ path: string;
339
+ httpMethod: string;
340
+ description: string;
341
+ accessTokens: string[];
342
+ schema: {
343
+ data: z.ZodObject<{
344
+ range: z.ZodString;
345
+ mergeType: z.ZodEnum<["MERGE_ALL", "MERGE_ROWS", "MERGE_COLUMNS"]>;
346
+ }, "strip", z.ZodTypeAny, {
347
+ range: string;
348
+ mergeType: "MERGE_ALL" | "MERGE_ROWS" | "MERGE_COLUMNS";
349
+ }, {
350
+ range: string;
351
+ mergeType: "MERGE_ALL" | "MERGE_ROWS" | "MERGE_COLUMNS";
352
+ }>;
353
+ path: z.ZodOptional<z.ZodObject<{
354
+ spreadsheet_token: z.ZodOptional<z.ZodString>;
355
+ }, "strip", z.ZodTypeAny, {
356
+ spreadsheet_token?: string | undefined;
357
+ }, {
358
+ spreadsheet_token?: string | undefined;
359
+ }>>;
360
+ useUAT: z.ZodOptional<z.ZodBoolean>;
361
+ };
362
+ };
363
+ /**
364
+ * Unmerge cells
365
+ * POST /open-apis/sheets/v2/spreadsheets/:spreadsheet_token/unmerge_cells
366
+ */
367
+ export declare const sheetsV2SpreadsheetUnmergeCells: {
368
+ project: string;
369
+ name: string;
370
+ sdkName: string;
371
+ path: string;
372
+ httpMethod: string;
373
+ description: string;
374
+ accessTokens: string[];
375
+ schema: {
376
+ data: z.ZodObject<{
377
+ range: z.ZodString;
378
+ }, "strip", z.ZodTypeAny, {
379
+ range: string;
380
+ }, {
381
+ range: string;
382
+ }>;
383
+ path: z.ZodOptional<z.ZodObject<{
384
+ spreadsheet_token: z.ZodOptional<z.ZodString>;
385
+ }, "strip", z.ZodTypeAny, {
386
+ spreadsheet_token?: string | undefined;
387
+ }, {
388
+ spreadsheet_token?: string | undefined;
389
+ }>>;
390
+ useUAT: z.ZodOptional<z.ZodBoolean>;
391
+ };
392
+ };
330
393
  export declare const sheetsV2ToolName: sheetsV2ToolName[];
331
394
  export declare const sheetsV2Tools: ({
332
395
  project: string;
@@ -520,4 +583,29 @@ export declare const sheetsV2Tools: ({
520
583
  }>;
521
584
  useUAT: z.ZodOptional<z.ZodBoolean>;
522
585
  };
586
+ } | {
587
+ project: string;
588
+ name: string;
589
+ sdkName: string;
590
+ path: string;
591
+ httpMethod: string;
592
+ description: string;
593
+ accessTokens: string[];
594
+ schema: {
595
+ data: z.ZodObject<{
596
+ range: z.ZodString;
597
+ }, "strip", z.ZodTypeAny, {
598
+ range: string;
599
+ }, {
600
+ range: string;
601
+ }>;
602
+ path: z.ZodOptional<z.ZodObject<{
603
+ spreadsheet_token: z.ZodOptional<z.ZodString>;
604
+ }, "strip", z.ZodTypeAny, {
605
+ spreadsheet_token?: string | undefined;
606
+ }, {
607
+ spreadsheet_token?: string | undefined;
608
+ }>>;
609
+ useUAT: z.ZodOptional<z.ZodBoolean>;
610
+ };
523
611
  })[];
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.sheetsV2Tools = exports.sheetsV2ToolName = exports.sheetsV2SpreadsheetDimensionRangeDelete = exports.sheetsV2SpreadsheetDimensionRangeInsert = exports.sheetsV2SpreadsheetValuesAppend = exports.sheetsV2SpreadsheetValuesBatchUpdate = exports.sheetsV2SpreadsheetValuesUpdate = exports.sheetsV2SpreadsheetValuesBatchGet = exports.sheetsV2SpreadsheetValuesGet = void 0;
3
+ exports.sheetsV2Tools = exports.sheetsV2ToolName = exports.sheetsV2SpreadsheetUnmergeCells = exports.sheetsV2SpreadsheetMergeCells = exports.sheetsV2SpreadsheetDimensionRangeDelete = exports.sheetsV2SpreadsheetDimensionRangeInsert = exports.sheetsV2SpreadsheetValuesAppend = exports.sheetsV2SpreadsheetValuesBatchUpdate = exports.sheetsV2SpreadsheetValuesUpdate = exports.sheetsV2SpreadsheetValuesBatchGet = exports.sheetsV2SpreadsheetValuesGet = void 0;
4
4
  const zod_1 = require("zod");
5
5
  /**
6
6
  * Read a single range of cells
@@ -211,6 +211,61 @@ exports.sheetsV2SpreadsheetDimensionRangeDelete = {
211
211
  useUAT: zod_1.z.boolean().describe('Use user access token, otherwise use tenant access token').optional(),
212
212
  },
213
213
  };
214
+ /**
215
+ * Merge cells
216
+ * POST /open-apis/sheets/v2/spreadsheets/:spreadsheet_token/merge_cells
217
+ */
218
+ exports.sheetsV2SpreadsheetMergeCells = {
219
+ project: 'sheets',
220
+ name: 'sheets.v2.spreadsheet.mergeCells',
221
+ sdkName: 'sheets.v2.spreadsheet.mergeCells',
222
+ path: '/open-apis/sheets/v2/spreadsheets/:spreadsheet_token/merge_cells',
223
+ httpMethod: 'POST',
224
+ description: '[Feishu/Lark]-Docs-Sheets-Cell-Merge cells-Merge cells in the specified range within the spreadsheet. Single operation limited to 5000 rows and 100 columns',
225
+ accessTokens: ['tenant', 'user'],
226
+ schema: {
227
+ data: zod_1.z.object({
228
+ range: zod_1.z
229
+ .string()
230
+ .describe('The range of cells to merge. Format: `<sheetId>!<start>:<end>`. Example: `sheetId!A1:B2`, `sheetId!F1:H1`'),
231
+ mergeType: zod_1.z
232
+ .enum(['MERGE_ALL', 'MERGE_ROWS', 'MERGE_COLUMNS'])
233
+ .describe('Merge type. - MERGE_ALL: Merge all selected cells into one- MERGE_ROWS: Merge selected area by rows- MERGE_COLUMNS: Merge selected area by columns'),
234
+ }),
235
+ path: zod_1.z
236
+ .object({
237
+ spreadsheet_token: zod_1.z.string().describe('Spreadsheet token').optional(),
238
+ })
239
+ .optional(),
240
+ useUAT: zod_1.z.boolean().describe('Use user access token, otherwise use tenant access token').optional(),
241
+ },
242
+ };
243
+ /**
244
+ * Unmerge cells
245
+ * POST /open-apis/sheets/v2/spreadsheets/:spreadsheet_token/unmerge_cells
246
+ */
247
+ exports.sheetsV2SpreadsheetUnmergeCells = {
248
+ project: 'sheets',
249
+ name: 'sheets.v2.spreadsheet.unmergeCells',
250
+ sdkName: 'sheets.v2.spreadsheet.unmergeCells',
251
+ path: '/open-apis/sheets/v2/spreadsheets/:spreadsheet_token/unmerge_cells',
252
+ httpMethod: 'POST',
253
+ description: '[Feishu/Lark]-Docs-Sheets-Cell-Unmerge cells-Split merged cells in the specified range within the spreadsheet',
254
+ accessTokens: ['tenant', 'user'],
255
+ schema: {
256
+ data: zod_1.z.object({
257
+ range: zod_1.z
258
+ .string()
259
+ .describe('The range of cells to unmerge. Format: `<sheetId>!<start>:<end>`. Example: `sheetId!A1:B2`, `sheetId!F1:H1`'),
260
+ }),
261
+ path: zod_1.z
262
+ .object({
263
+ spreadsheet_token: zod_1.z.string().describe('Spreadsheet token').optional(),
264
+ })
265
+ .optional(),
266
+ useUAT: zod_1.z.boolean().describe('Use user access token, otherwise use tenant access token').optional(),
267
+ },
268
+ };
214
269
  exports.sheetsV2ToolName = [
215
270
  'sheets.v2.spreadsheetValues.get',
216
271
  'sheets.v2.spreadsheetValues.batchGet',
@@ -219,6 +274,8 @@ exports.sheetsV2ToolName = [
219
274
  'sheets.v2.spreadsheetValues.append',
220
275
  'sheets.v2.spreadsheetDimensionRange.insert',
221
276
  'sheets.v2.spreadsheetDimensionRange.delete',
277
+ 'sheets.v2.spreadsheet.mergeCells',
278
+ 'sheets.v2.spreadsheet.unmergeCells',
222
279
  ];
223
280
  exports.sheetsV2Tools = [
224
281
  exports.sheetsV2SpreadsheetValuesGet,
@@ -228,4 +285,6 @@ exports.sheetsV2Tools = [
228
285
  exports.sheetsV2SpreadsheetValuesAppend,
229
286
  exports.sheetsV2SpreadsheetDimensionRangeInsert,
230
287
  exports.sheetsV2SpreadsheetDimensionRangeDelete,
288
+ exports.sheetsV2SpreadsheetMergeCells,
289
+ exports.sheetsV2SpreadsheetUnmergeCells,
231
290
  ];
@@ -1,5 +1,5 @@
1
1
  import { z } from 'zod';
2
- export type sheetsV2ToolName = 'sheets.v2.spreadsheetValues.get' | 'sheets.v2.spreadsheetValues.batchGet' | 'sheets.v2.spreadsheetValues.update' | 'sheets.v2.spreadsheetValues.batchUpdate' | 'sheets.v2.spreadsheetValues.append' | 'sheets.v2.spreadsheetDimensionRange.insert' | 'sheets.v2.spreadsheetDimensionRange.delete';
2
+ export type sheetsV2ToolName = 'sheets.v2.spreadsheetValues.get' | 'sheets.v2.spreadsheetValues.batchGet' | 'sheets.v2.spreadsheetValues.update' | 'sheets.v2.spreadsheetValues.batchUpdate' | 'sheets.v2.spreadsheetValues.append' | 'sheets.v2.spreadsheetDimensionRange.insert' | 'sheets.v2.spreadsheetDimensionRange.delete' | 'sheets.v2.spreadsheet.mergeCells' | 'sheets.v2.spreadsheet.unmergeCells';
3
3
  /**
4
4
  * 读取单个范围
5
5
  * GET /open-apis/sheets/v2/spreadsheets/:spreadsheet_token/values/:range
@@ -327,6 +327,69 @@ export declare const sheetsV2SpreadsheetDimensionRangeDelete: {
327
327
  useUAT: z.ZodOptional<z.ZodBoolean>;
328
328
  };
329
329
  };
330
+ /**
331
+ * 合并单元格
332
+ * POST /open-apis/sheets/v2/spreadsheets/:spreadsheet_token/merge_cells
333
+ */
334
+ export declare const sheetsV2SpreadsheetMergeCells: {
335
+ project: string;
336
+ name: string;
337
+ sdkName: string;
338
+ path: string;
339
+ httpMethod: string;
340
+ description: string;
341
+ accessTokens: string[];
342
+ schema: {
343
+ data: z.ZodObject<{
344
+ range: z.ZodString;
345
+ mergeType: z.ZodEnum<["MERGE_ALL", "MERGE_ROWS", "MERGE_COLUMNS"]>;
346
+ }, "strip", z.ZodTypeAny, {
347
+ range: string;
348
+ mergeType: "MERGE_ALL" | "MERGE_ROWS" | "MERGE_COLUMNS";
349
+ }, {
350
+ range: string;
351
+ mergeType: "MERGE_ALL" | "MERGE_ROWS" | "MERGE_COLUMNS";
352
+ }>;
353
+ path: z.ZodOptional<z.ZodObject<{
354
+ spreadsheet_token: z.ZodOptional<z.ZodString>;
355
+ }, "strip", z.ZodTypeAny, {
356
+ spreadsheet_token?: string | undefined;
357
+ }, {
358
+ spreadsheet_token?: string | undefined;
359
+ }>>;
360
+ useUAT: z.ZodOptional<z.ZodBoolean>;
361
+ };
362
+ };
363
+ /**
364
+ * 拆分单元格
365
+ * POST /open-apis/sheets/v2/spreadsheets/:spreadsheet_token/unmerge_cells
366
+ */
367
+ export declare const sheetsV2SpreadsheetUnmergeCells: {
368
+ project: string;
369
+ name: string;
370
+ sdkName: string;
371
+ path: string;
372
+ httpMethod: string;
373
+ description: string;
374
+ accessTokens: string[];
375
+ schema: {
376
+ data: z.ZodObject<{
377
+ range: z.ZodString;
378
+ }, "strip", z.ZodTypeAny, {
379
+ range: string;
380
+ }, {
381
+ range: string;
382
+ }>;
383
+ path: z.ZodOptional<z.ZodObject<{
384
+ spreadsheet_token: z.ZodOptional<z.ZodString>;
385
+ }, "strip", z.ZodTypeAny, {
386
+ spreadsheet_token?: string | undefined;
387
+ }, {
388
+ spreadsheet_token?: string | undefined;
389
+ }>>;
390
+ useUAT: z.ZodOptional<z.ZodBoolean>;
391
+ };
392
+ };
330
393
  export declare const sheetsV2ToolName: sheetsV2ToolName[];
331
394
  export declare const sheetsV2Tools: ({
332
395
  project: string;
@@ -520,4 +583,29 @@ export declare const sheetsV2Tools: ({
520
583
  }>;
521
584
  useUAT: z.ZodOptional<z.ZodBoolean>;
522
585
  };
586
+ } | {
587
+ project: string;
588
+ name: string;
589
+ sdkName: string;
590
+ path: string;
591
+ httpMethod: string;
592
+ description: string;
593
+ accessTokens: string[];
594
+ schema: {
595
+ data: z.ZodObject<{
596
+ range: z.ZodString;
597
+ }, "strip", z.ZodTypeAny, {
598
+ range: string;
599
+ }, {
600
+ range: string;
601
+ }>;
602
+ path: z.ZodOptional<z.ZodObject<{
603
+ spreadsheet_token: z.ZodOptional<z.ZodString>;
604
+ }, "strip", z.ZodTypeAny, {
605
+ spreadsheet_token?: string | undefined;
606
+ }, {
607
+ spreadsheet_token?: string | undefined;
608
+ }>>;
609
+ useUAT: z.ZodOptional<z.ZodBoolean>;
610
+ };
523
611
  })[];
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.sheetsV2Tools = exports.sheetsV2ToolName = exports.sheetsV2SpreadsheetDimensionRangeDelete = exports.sheetsV2SpreadsheetDimensionRangeInsert = exports.sheetsV2SpreadsheetValuesAppend = exports.sheetsV2SpreadsheetValuesBatchUpdate = exports.sheetsV2SpreadsheetValuesUpdate = exports.sheetsV2SpreadsheetValuesBatchGet = exports.sheetsV2SpreadsheetValuesGet = void 0;
3
+ exports.sheetsV2Tools = exports.sheetsV2ToolName = exports.sheetsV2SpreadsheetUnmergeCells = exports.sheetsV2SpreadsheetMergeCells = exports.sheetsV2SpreadsheetDimensionRangeDelete = exports.sheetsV2SpreadsheetDimensionRangeInsert = exports.sheetsV2SpreadsheetValuesAppend = exports.sheetsV2SpreadsheetValuesBatchUpdate = exports.sheetsV2SpreadsheetValuesUpdate = exports.sheetsV2SpreadsheetValuesBatchGet = exports.sheetsV2SpreadsheetValuesGet = void 0;
4
4
  const zod_1 = require("zod");
5
5
  /**
6
6
  * 读取单个范围
@@ -211,6 +211,67 @@ exports.sheetsV2SpreadsheetDimensionRangeDelete = {
211
211
  useUAT: zod_1.z.boolean().describe('使用用户访问令牌,否则使用租户访问令牌').optional(),
212
212
  },
213
213
  };
214
+ /**
215
+ * 合并单元格
216
+ * POST /open-apis/sheets/v2/spreadsheets/:spreadsheet_token/merge_cells
217
+ */
218
+ exports.sheetsV2SpreadsheetMergeCells = {
219
+ project: 'sheets',
220
+ name: 'sheets.v2.spreadsheet.mergeCells',
221
+ sdkName: 'sheets.v2.spreadsheet.mergeCells',
222
+ path: '/open-apis/sheets/v2/spreadsheets/:spreadsheet_token/merge_cells',
223
+ httpMethod: 'POST',
224
+ description: '[飞书]-云文档-电子表格-单元格-合并单元格-合并电子表格工作表中指定范围内的单元格。单次操作不超过5000行、100列',
225
+ accessTokens: ['tenant', 'user'],
226
+ schema: {
227
+ data: zod_1.z.object({
228
+ range: zod_1.z
229
+ .string()
230
+ .describe('要合并的单元格范围。格式为 `<sheetId>!<开始位置>:<结束位置>`。例如 `A1:B2`、`F1:H1`'),
231
+ mergeType: zod_1.z
232
+ .enum(['MERGE_ALL', 'MERGE_ROWS', 'MERGE_COLUMNS'])
233
+ .describe('合并类型。- MERGE_ALL:将所选区域直接合并- MERGE_ROWS:将所选区域按行合并- MERGE_COLUMNS:将所选区域按列合并'),
234
+ }),
235
+ path: zod_1.z
236
+ .object({
237
+ spreadsheet_token: zod_1.z
238
+ .string()
239
+ .describe('电子表格的 token。可通过以下两种方式获取。了解更多,参考[电子表格概述]。- 电子表格的 URL:https://sample.feishu.cn/sheets/==Iow7sNNEphp3WbtnbCscPqabcef==- 调用[获取文件夹中的文件清单]')
240
+ .optional(),
241
+ })
242
+ .optional(),
243
+ useUAT: zod_1.z.boolean().describe('使用用户访问令牌,否则使用租户访问令牌').optional(),
244
+ },
245
+ };
246
+ /**
247
+ * 拆分单元格
248
+ * POST /open-apis/sheets/v2/spreadsheets/:spreadsheet_token/unmerge_cells
249
+ */
250
+ exports.sheetsV2SpreadsheetUnmergeCells = {
251
+ project: 'sheets',
252
+ name: 'sheets.v2.spreadsheet.unmergeCells',
253
+ sdkName: 'sheets.v2.spreadsheet.unmergeCells',
254
+ path: '/open-apis/sheets/v2/spreadsheets/:spreadsheet_token/unmerge_cells',
255
+ httpMethod: 'POST',
256
+ description: '[飞书]-云文档-电子表格-单元格-拆分单元格-拆分电子表格工作表中指定范围内的合并单元格',
257
+ accessTokens: ['tenant', 'user'],
258
+ schema: {
259
+ data: zod_1.z.object({
260
+ range: zod_1.z
261
+ .string()
262
+ .describe('要拆分的单元格范围。格式为 `<sheetId>!<开始位置>:<结束位置>`。例如 `sheetId!A1:B2`、`sheetId!F1:H1`'),
263
+ }),
264
+ path: zod_1.z
265
+ .object({
266
+ spreadsheet_token: zod_1.z
267
+ .string()
268
+ .describe('电子表格的 token。可通过以下两种方式获取。了解更多,参考[电子表格概述]。- 电子表格的 URL:https://sample.feishu.cn/sheets/==Iow7sNNEphp3WbtnbCscPqabcef==- 调用[获取文件夹中的文件清单]')
269
+ .optional(),
270
+ })
271
+ .optional(),
272
+ useUAT: zod_1.z.boolean().describe('使用用户访问令牌,否则使用租户访问令牌').optional(),
273
+ },
274
+ };
214
275
  exports.sheetsV2ToolName = [
215
276
  'sheets.v2.spreadsheetValues.get',
216
277
  'sheets.v2.spreadsheetValues.batchGet',
@@ -219,6 +280,8 @@ exports.sheetsV2ToolName = [
219
280
  'sheets.v2.spreadsheetValues.append',
220
281
  'sheets.v2.spreadsheetDimensionRange.insert',
221
282
  'sheets.v2.spreadsheetDimensionRange.delete',
283
+ 'sheets.v2.spreadsheet.mergeCells',
284
+ 'sheets.v2.spreadsheet.unmergeCells',
222
285
  ];
223
286
  exports.sheetsV2Tools = [
224
287
  exports.sheetsV2SpreadsheetValuesGet,
@@ -228,4 +291,6 @@ exports.sheetsV2Tools = [
228
291
  exports.sheetsV2SpreadsheetValuesAppend,
229
292
  exports.sheetsV2SpreadsheetDimensionRangeInsert,
230
293
  exports.sheetsV2SpreadsheetDimensionRangeDelete,
294
+ exports.sheetsV2SpreadsheetMergeCells,
295
+ exports.sheetsV2SpreadsheetUnmergeCells,
231
296
  ];
@@ -41,15 +41,50 @@ const logger_1 = require("../../utils/logger");
41
41
  * e.g., /open-apis/sheets/v2/spreadsheets/:spreadsheet_token/values/:range
42
42
  * with pathParams { spreadsheet_token: "xxx", range: "yyy" }
43
43
  * becomes /open-apis/sheets/v2/spreadsheets/xxx/values/yyy
44
+ *
45
+ * 注意:range 参数中的 ! 和 : 不做 URL 编码,飞书 API 可直接解析
44
46
  */
45
47
  const fillApiPath = (apiPath, pathParams = {}) => {
46
48
  return apiPath.replace(/:([^/]+)/g, (_, key) => {
47
49
  if (pathParams[key] !== undefined) {
50
+ if (key === 'range') {
51
+ // range 参数保留 ! 和 : 字符,避免飞书 API 解析出错
52
+ return encodeURIComponent(pathParams[key])
53
+ .replace(/%21/g, '!')
54
+ .replace(/%3A/gi, ':');
55
+ }
48
56
  return encodeURIComponent(pathParams[key]);
49
57
  }
50
58
  throw new Error(`Missing path parameter: ${key}`);
51
59
  });
52
60
  };
61
+ /**
62
+ * 飞书 Sheets API 不支持 JSON boolean(错误码 90204)
63
+ * 将 values 单元格数组中的 boolean 值转换为 "TRUE"/"FALSE" 字符串
64
+ * 注意:不能用 0/1,否则 Luban 等工具读取时会丢失布尔语义
65
+ */
66
+ const convertBooleansInValues = (obj) => {
67
+ if (obj === null || obj === undefined)
68
+ return obj;
69
+ if (Array.isArray(obj))
70
+ return obj.map(convertBooleansInValues);
71
+ if (typeof obj === 'object') {
72
+ const result = {};
73
+ for (const [k, v] of Object.entries(obj)) {
74
+ if (k === 'values' && Array.isArray(v)) {
75
+ // 只在 values 单元格数组中转换 boolean
76
+ result[k] = v.map(row => Array.isArray(row)
77
+ ? row.map(cell => (typeof cell === 'boolean' ? (cell ? 'TRUE' : 'FALSE') : cell))
78
+ : row);
79
+ }
80
+ else {
81
+ result[k] = convertBooleansInValues(v);
82
+ }
83
+ }
84
+ return result;
85
+ }
86
+ return obj;
87
+ };
53
88
  const sdkFuncCall = async (client, params, options) => {
54
89
  const { tool, userAccessToken } = options || {};
55
90
  const { sdkName, path, httpMethod } = tool || {};
@@ -82,19 +117,41 @@ const sdkFuncCall = async (client, params, options) => {
82
117
  return await client.request({ method: httpMethod, url: filledPath, ...restParams }, ...args);
83
118
  };
84
119
  }
85
- if (params === null || params === void 0 ? void 0 : params.useUAT) {
120
+ // Sheets values 写入操作,将 boolean 值转换为 0/1(飞书 API 不接受 JSON boolean)
121
+ const isSheetWriteOp = typeof sdkName === 'string' && sdkName.includes('spreadsheetValues');
122
+ const processedParams = isSheetWriteOp && (params === null || params === void 0 ? void 0 : params.data)
123
+ ? { ...params, data: convertBooleansInValues(params.data) }
124
+ : params;
125
+ logger_1.logger.warn(`[larkOapiHandler] sdkName=${sdkName} useUAT=${processedParams === null || processedParams === void 0 ? void 0 : processedParams.useUAT} hasToken=${!!userAccessToken} data=${JSON.stringify(processedParams === null || processedParams === void 0 ? void 0 : processedParams.data)}`);
126
+ if (processedParams === null || processedParams === void 0 ? void 0 : processedParams.useUAT) {
86
127
  if (!userAccessToken) {
87
128
  logger_1.logger.error(`[larkOapiHandler] UserAccessToken is invalid or expired`);
88
129
  throw new Error('UserAccessToken is invalid or expired');
89
130
  }
90
- return await func(params, lark.withUserAccessToken(userAccessToken));
131
+ const response = await func(processedParams, lark.withUserAccessToken(userAccessToken));
132
+ logger_1.logger.warn(`[larkOapiHandler] response=${JSON.stringify(response)}`);
133
+ return response;
91
134
  }
92
- return await func(params);
135
+ const response = await func(processedParams);
136
+ logger_1.logger.info(`[larkOapiHandler] response=${JSON.stringify(response)}`);
137
+ return response;
93
138
  };
94
139
  const larkOapiHandler = async (client, params, options) => {
95
140
  var _a, _b;
96
141
  try {
97
142
  const response = await sdkFuncCall(client, params, options);
143
+ // 当 Feishu API 返回非0错误码时,返回完整响应以便调试
144
+ if ((response === null || response === void 0 ? void 0 : response.code) !== undefined && response.code !== 0) {
145
+ return {
146
+ isError: true,
147
+ content: [
148
+ {
149
+ type: 'text',
150
+ text: JSON.stringify(response),
151
+ },
152
+ ],
153
+ };
154
+ }
98
155
  return {
99
156
  content: [
100
157
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@danyow/lark-mcp",
3
- "version": "0.5.5",
3
+ "version": "0.5.7",
4
4
  "description": "Feishu/Lark OpenAPI MCP",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",