@kintone/mcp-server 1.1.0 → 1.2.1

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.
@@ -0,0 +1,40 @@
1
+ import { z } from "zod";
2
+ import { createTool } from "../../factory.js";
3
+ const inputSchema = {
4
+ name: z
5
+ .string()
6
+ .max(64)
7
+ .describe("The name of the app to create (max 64 characters)"),
8
+ space: z
9
+ .number()
10
+ .optional()
11
+ .describe("The space ID where the app will be created"),
12
+ };
13
+ const outputSchema = {
14
+ app: z.string().describe("The ID of the created app"),
15
+ revision: z.string().describe("The revision number of the created app"),
16
+ };
17
+ const toolName = "kintone-add-app";
18
+ const toolConfig = {
19
+ title: "Add App",
20
+ description: "Create a new app in the pre-live environment on kintone. The pre-live environment is a temporary storage area where app information is saved before deployment. To reflect changes to the production environment, execute the kintone-deploy-app tool after this tool.",
21
+ inputSchema,
22
+ outputSchema,
23
+ };
24
+ const callback = async ({ name, space }, { client }) => {
25
+ const app = await client.app.addApp({ name, space });
26
+ const result = {
27
+ app: app.app,
28
+ revision: app.revision,
29
+ };
30
+ return {
31
+ structuredContent: result,
32
+ content: [
33
+ {
34
+ type: "text",
35
+ text: JSON.stringify(result, null, 2),
36
+ },
37
+ ],
38
+ };
39
+ };
40
+ export const addApp = createTool(toolName, toolConfig, callback);
@@ -0,0 +1,50 @@
1
+ import { z } from "zod";
2
+ import { createTool } from "../../factory.js";
3
+ import { propertiesForParameterSchema } from "../../../schema/app/index.js";
4
+ const inputSchema = {
5
+ app: z
6
+ .string()
7
+ .describe("The ID of the app to add fields to (numeric value as string)"),
8
+ properties: propertiesForParameterSchema.describe("Object containing field configurations to add"),
9
+ revision: z
10
+ .string()
11
+ .optional()
12
+ .describe("Expected app configuration revision number. If the specified revision number does not match the current app's revision, an error will occur and the update will not be performed. If not specified or set to '-1', the revision number will not be checked."),
13
+ };
14
+ const outputSchema = {
15
+ revision: z.string().describe("Updated app configuration revision number"),
16
+ };
17
+ const toolName = "kintone-add-form-fields";
18
+ const toolConfig = {
19
+ title: "Add Form Fields",
20
+ description: "Add new fields to a kintone app (preview environment only). " +
21
+ "Requires App Management permissions. " +
22
+ "Field codes must be unique, max 128 chars, cannot start with numbers, and only '_' symbol allowed. " +
23
+ "For selection fields (DROP_DOWN/RADIO_BUTTON/CHECK_BOX/MULTI_SELECT), option keys must exactly match their label values. " +
24
+ "Options require 'label' and 'index' properties. " +
25
+ "For lookup fields, use appropriate field type (NUMBER for RECORD_NUMBER, SINGLE_LINE_TEXT for text fields). " +
26
+ "Use kintone-get-form-fields first to check existing fields. " +
27
+ "Changes require kintone-deploy-app to apply to live app.",
28
+ inputSchema,
29
+ outputSchema,
30
+ };
31
+ const callback = async ({ app, properties, revision }, { client }) => {
32
+ const response = await client.app.addFormFields({
33
+ app,
34
+ properties,
35
+ revision,
36
+ });
37
+ const result = {
38
+ revision: response.revision,
39
+ };
40
+ return {
41
+ structuredContent: result,
42
+ content: [
43
+ {
44
+ type: "text",
45
+ text: JSON.stringify(result, null, 2),
46
+ },
47
+ ],
48
+ };
49
+ };
50
+ export const addFormFields = createTool(toolName, toolConfig, callback);
@@ -0,0 +1,51 @@
1
+ import { z } from "zod";
2
+ import { createTool } from "../../factory.js";
3
+ const inputSchema = {
4
+ app: z
5
+ .string()
6
+ .describe("The ID of the app to delete form fields from (numeric value as string)"),
7
+ fields: z
8
+ .array(z.string())
9
+ .min(1, "At least one field code is required")
10
+ .max(100, "Maximum 100 fields can be deleted at once")
11
+ .describe("Array of field codes to delete"),
12
+ revision: z
13
+ .string()
14
+ .optional()
15
+ .describe("Expected app configuration revision number. If the specified revision number does not match the current app's revision, an error will occur and the update will not be performed. If not specified or set to '-1', the revision number will not be checked."),
16
+ };
17
+ const outputSchema = {
18
+ revision: z.string().describe("The new revision number after deletion"),
19
+ };
20
+ const toolName = "kintone-delete-form-fields";
21
+ const toolConfig = {
22
+ title: "Delete Form Fields",
23
+ description: "Delete form fields from a kintone app (preview environment only). " +
24
+ "Maximum 100 fields can be deleted at once. " +
25
+ "Cannot delete status, assignee, or category fields. " +
26
+ "Useful for recreating lookup fields when updates fail. " +
27
+ "Use kintone-get-form-fields first to verify field codes. " +
28
+ "Changes require kintone-deploy-app to apply to live app.",
29
+ inputSchema,
30
+ outputSchema,
31
+ };
32
+ const callback = async ({ app, fields, revision }, { client }) => {
33
+ const response = (await client.app.deleteFormFields({
34
+ app,
35
+ fields,
36
+ revision,
37
+ }));
38
+ const result = {
39
+ revision: response.revision,
40
+ };
41
+ return {
42
+ structuredContent: result,
43
+ content: [
44
+ {
45
+ type: "text",
46
+ text: JSON.stringify(result, null, 2),
47
+ },
48
+ ],
49
+ };
50
+ };
51
+ export const deleteFormFields = createTool(toolName, toolConfig, callback);
@@ -0,0 +1,48 @@
1
+ import { z } from "zod";
2
+ import { createTool } from "../../factory.js";
3
+ const inputSchema = {
4
+ apps: z
5
+ .array(z.object({
6
+ app: z
7
+ .string()
8
+ .describe("The ID of the app to deploy (numeric value as string)"),
9
+ revision: z
10
+ .string()
11
+ .optional()
12
+ .describe("The expected revision number"),
13
+ }))
14
+ .min(1)
15
+ .max(300)
16
+ .describe("List of apps to deploy (minimum 1, maximum 300 apps)"),
17
+ revert: z
18
+ .boolean()
19
+ .optional()
20
+ .describe("If true, revert changes instead of deploying (default: false)"),
21
+ };
22
+ const outputSchema = {
23
+ message: z.string().describe("Deployment status message"),
24
+ };
25
+ const toolName = "kintone-deploy-app";
26
+ const toolConfig = {
27
+ title: "Deploy App Settings",
28
+ description: "Deploy app settings from pre-live to production environment on kintone. " +
29
+ "This is an asynchronous API - use kintone-get-app-deploy-status tool to check deployment progress.",
30
+ inputSchema,
31
+ outputSchema,
32
+ };
33
+ const callback = async ({ apps, revert }, { client }) => {
34
+ await client.app.deployApp({ apps, revert });
35
+ const result = {
36
+ message: `Deployment initiated for ${apps.length} app(s). Use kintone-get-app-deploy-status tool to check progress.`,
37
+ };
38
+ return {
39
+ structuredContent: result,
40
+ content: [
41
+ {
42
+ type: "text",
43
+ text: JSON.stringify(result, null, 2),
44
+ },
45
+ ],
46
+ };
47
+ };
48
+ export const deployApp = createTool(toolName, toolConfig, callback);
@@ -1,5 +1,6 @@
1
1
  import { z } from "zod";
2
2
  import { createTool } from "../../factory.js";
3
+ import { propertiesForParameterSchema } from "../../../schema/app/index.js";
3
4
  const inputSchema = {
4
5
  app: z
5
6
  .string()
@@ -13,112 +14,20 @@ const inputSchema = {
13
14
  .optional()
14
15
  .describe("Whether to get form fields from pre-live environment"),
15
16
  };
16
- const fieldPropertySchema = z.object({
17
- type: z.string().describe("The field type"),
18
- code: z.string().describe("The field code"),
19
- label: z.string().describe("The field name"),
20
- enabled: z
21
- .boolean()
22
- .optional()
23
- .describe("Whether the field is enabled (for STATUS and CATEGORY fields)"),
24
- noLabel: z.boolean().optional().describe("Whether to hide the field name"),
25
- required: z.boolean().optional().describe("Whether the field is required"),
26
- unique: z.boolean().optional().describe("Whether the field must be unique"),
27
- maxValue: z.string().optional().describe("Maximum value"),
28
- minValue: z.string().optional().describe("Minimum value"),
29
- maxLength: z.string().optional().describe("Maximum length"),
30
- minLength: z.string().optional().describe("Minimum length"),
31
- defaultValue: z.any().optional().describe("Default value"),
32
- defaultNowValue: z
33
- .boolean()
34
- .optional()
35
- .describe("Whether to use current date/time as default"),
36
- entities: z
37
- .array(z.object({
38
- type: z.enum(["USER", "GROUP", "ORGANIZATION"]),
39
- code: z.string(),
40
- }))
41
- .optional()
42
- .describe("Default entities for user/group/organization selection fields"),
43
- options: z
44
- .record(z.object({
45
- label: z.string(),
46
- index: z.string(),
47
- }))
48
- .optional()
49
- .describe("Options for selection fields"),
50
- align: z
51
- .enum(["HORIZONTAL", "VERTICAL"])
52
- .optional()
53
- .describe("Option alignment for radio/checkbox fields"),
54
- expression: z.string().optional().describe("Calculation formula"),
55
- hideExpression: z
56
- .boolean()
57
- .optional()
58
- .describe("Whether to hide the formula"),
59
- format: z.string().optional().describe("Display format"),
60
- displayScale: z.string().optional().describe("Number of decimal places"),
61
- unit: z.string().optional().describe("Unit symbol"),
62
- unitPosition: z
63
- .enum(["BEFORE", "AFTER"])
64
- .optional()
65
- .describe("Unit position"),
66
- digit: z.boolean().optional().describe("Whether to use thousands separator"),
67
- thumbnailSize: z.string().optional().describe("Image thumbnail size"),
68
- protocol: z
69
- .enum(["WEB", "CALL", "MAIL"])
70
- .optional()
71
- .describe("Link protocol"),
72
- lookup: z
73
- .object({
74
- relatedApp: z.object({
75
- app: z.string(),
76
- code: z.string(),
77
- }),
78
- relatedKeyField: z.string(),
79
- fieldMappings: z.array(z.object({
80
- field: z.string(),
81
- relatedField: z.string(),
82
- })),
83
- lookupPickerFields: z.array(z.string()),
84
- filterCond: z.string().optional(),
85
- sort: z.string().optional(),
86
- })
87
- .optional()
88
- .describe("Lookup settings"),
89
- referenceTable: z
90
- .object({
91
- relatedApp: z.object({
92
- app: z.string(),
93
- code: z.string(),
94
- }),
95
- condition: z.object({
96
- field: z.string(),
97
- relatedField: z.string(),
98
- }),
99
- filterCond: z.string().optional(),
100
- displayFields: z.array(z.string()),
101
- sort: z.string().optional(),
102
- size: z.string().optional(),
103
- })
104
- .optional()
105
- .describe("Related records settings"),
106
- fields: z.record(z.any()).optional().describe("Fields in subtable"),
107
- openGroup: z
108
- .boolean()
109
- .optional()
110
- .describe("Whether the group is expanded by default"),
111
- });
112
17
  const outputSchema = {
113
- properties: z
114
- .record(fieldPropertySchema)
115
- .describe("Object containing field configurations"),
18
+ properties: propertiesForParameterSchema.describe("Object containing field configurations"),
116
19
  revision: z.string().describe("App configuration revision number"),
117
20
  };
118
21
  const toolName = "kintone-get-form-fields";
119
22
  const toolConfig = {
120
23
  title: "Get Form Fields",
121
- description: "Get form field settings from a kintone app",
24
+ description: "Get form field settings from a kintone app. " +
25
+ "Returns detailed field information including type, code, label, and all configuration settings " +
26
+ "(required status, default values, validation rules, options for selection fields, lookup configurations). " +
27
+ "Response includes 'properties' object with all fields and 'revision' string. " +
28
+ "Essential for understanding current field structure before add/update/delete operations. " +
29
+ "Use to verify lookup field configurations and field mappings. " +
30
+ "Supports both live and pre-live app settings retrieval.",
122
31
  inputSchema,
123
32
  outputSchema,
124
33
  };
@@ -1,6 +1,6 @@
1
1
  import { z } from "zod";
2
2
  import { createTool } from "../../factory.js";
3
- import { layoutElementSchema } from "../../../schema/app/index.js";
3
+ import { layoutForParameterSchema } from "../../../schema/app/index.js";
4
4
  const inputSchema = {
5
5
  app: z
6
6
  .string()
@@ -11,9 +11,7 @@ const inputSchema = {
11
11
  .describe("Whether to retrieve from preview environment (requires app administration permission for preview, record view/add permission for production)"),
12
12
  };
13
13
  const outputSchema = {
14
- layout: z
15
- .array(layoutElementSchema)
16
- .describe("Array of layout elements (rows, subtables, groups)"),
14
+ layout: layoutForParameterSchema.describe("Array of layout elements (rows, subtables, groups)"),
17
15
  revision: z.string().describe("App configuration revision number"),
18
16
  };
19
17
  const callback = async ({ app, preview }, { client }) => {
@@ -37,7 +35,11 @@ const callback = async ({ app, preview }, { client }) => {
37
35
  };
38
36
  export const getFormLayout = createTool("kintone-get-form-layout", {
39
37
  title: "Get Form Layout",
40
- description: "Get form layout from a kintone app",
38
+ description: "Get form layout from a kintone app. " +
39
+ "Returns layout structure with rows, subtables, groups, and field positioning. " +
40
+ "Use to understand current form arrangement before layout updates. " +
41
+ "Essential when adding new fields that need specific positioning or when rearranging existing fields. " +
42
+ "Supports both live and pre-live app settings retrieval.",
41
43
  inputSchema,
42
44
  outputSchema,
43
45
  }, callback);
@@ -0,0 +1,50 @@
1
+ import { z } from "zod";
2
+ import { createTool } from "../../factory.js";
3
+ import { propertiesForParameterSchema } from "../../../schema/app/index.js";
4
+ const inputSchema = {
5
+ app: z
6
+ .string()
7
+ .describe("The ID of the app to update form fields for (numeric value as string)"),
8
+ properties: propertiesForParameterSchema.describe("Object containing field configurations to update"),
9
+ revision: z
10
+ .string()
11
+ .optional()
12
+ .describe("Expected app configuration revision number. If the specified revision number does not match the current app's revision, an error will occur and the update will not be performed. If not specified or set to '-1', the revision number will not be checked."),
13
+ };
14
+ const outputSchema = {
15
+ revision: z.string().describe("Updated app configuration revision number"),
16
+ };
17
+ const toolName = "kintone-update-form-fields";
18
+ const toolConfig = {
19
+ title: "Update Form Fields",
20
+ description: "Update form field settings in a kintone app (preview environment only). " +
21
+ "Requires App Management permissions. " +
22
+ "Cannot update field codes for Label, Blank space, Border, Status, Assignee, or Category fields. " +
23
+ "For selection fields, unspecified options will be deleted. " +
24
+ "Option keys must exactly match current option names. " +
25
+ "For lookup fields, existing lookup configurations may not update properly - consider deleting and recreating the field instead. " +
26
+ "Use kintone-get-form-fields first to check current settings. " +
27
+ "Changes require kintone-deploy-app to apply to live app.",
28
+ inputSchema,
29
+ outputSchema,
30
+ };
31
+ const callback = async ({ app, properties, revision }, { client }) => {
32
+ const response = await client.app.updateFormFields({
33
+ app,
34
+ properties: properties,
35
+ revision,
36
+ });
37
+ const result = {
38
+ revision: response.revision,
39
+ };
40
+ return {
41
+ structuredContent: result,
42
+ content: [
43
+ {
44
+ type: "text",
45
+ text: JSON.stringify(result, null, 2),
46
+ },
47
+ ],
48
+ };
49
+ };
50
+ export const updateFormFields = createTool(toolName, toolConfig, callback);
@@ -0,0 +1,48 @@
1
+ import { z } from "zod";
2
+ import { createTool } from "../../factory.js";
3
+ import { layoutForParameterSchema } from "../../../schema/app/index.js";
4
+ const inputSchema = {
5
+ app: z
6
+ .string()
7
+ .describe("The ID of the app to update form layout for (numeric value as string)"),
8
+ layout: layoutForParameterSchema.describe("Array of layout elements (rows, subtables, groups)"),
9
+ revision: z
10
+ .string()
11
+ .optional()
12
+ .describe("Expected app configuration revision number. If the specified revision number does not match the current app's revision, an error will occur and the update will not be performed. If not specified or set to '-1', the revision number will not be checked."),
13
+ };
14
+ const outputSchema = {
15
+ revision: z.string().describe("Updated app configuration revision number"),
16
+ };
17
+ const toolName = "kintone-update-form-layout";
18
+ const toolConfig = {
19
+ title: "Update Form Layout",
20
+ description: "Update form layout settings in a kintone app (preview environment only). " +
21
+ "Use kintone-get-form-fields and kintone-get-form-layout first to understand current structure. " +
22
+ "Field codes are case-sensitive and must match exactly. " +
23
+ "For SUBTABLE fields, use nested structure: {type: 'SUBTABLE', code: 'table_code', fields: [{type: 'field_type', code: 'field_code'}, ...]}. " +
24
+ "Required when adding new fields to ensure proper positioning. " +
25
+ "Changes require kintone-deploy-app to apply to live app.",
26
+ inputSchema,
27
+ outputSchema,
28
+ };
29
+ const callback = async ({ app, layout, revision }, { client }) => {
30
+ const response = await client.app.updateFormLayout({
31
+ app,
32
+ layout,
33
+ revision,
34
+ });
35
+ const result = {
36
+ revision: response.revision,
37
+ };
38
+ return {
39
+ structuredContent: result,
40
+ content: [
41
+ {
42
+ type: "text",
43
+ text: JSON.stringify(result, null, 2),
44
+ },
45
+ ],
46
+ };
47
+ };
48
+ export const updateFormLayout = createTool(toolName, toolConfig, callback);
@@ -0,0 +1,119 @@
1
+ import { z } from "zod";
2
+ import { createTool } from "../../factory.js";
3
+ const inputSchema = {
4
+ app: z
5
+ .string()
6
+ .describe("The ID of the app to update (numeric value as string)"),
7
+ name: z
8
+ .string()
9
+ .min(1)
10
+ .max(64)
11
+ .optional()
12
+ .describe("The app name (1-64 characters)"),
13
+ description: z
14
+ .string()
15
+ .max(10000)
16
+ .optional()
17
+ .describe("The app description (up to 10,000 characters)"),
18
+ icon: z
19
+ .discriminatedUnion("type", [
20
+ z.object({
21
+ type: z.literal("PRESET"),
22
+ key: z.string().describe("The icon key for PRESET type"),
23
+ }),
24
+ z.object({
25
+ type: z.literal("FILE"),
26
+ file: z
27
+ .object({
28
+ fileKey: z.string().describe("The file key for uploaded icon"),
29
+ })
30
+ .describe("The file information for FILE type"),
31
+ }),
32
+ ])
33
+ .optional()
34
+ .describe("The app icon configuration"),
35
+ theme: z
36
+ .enum(["WHITE", "RED", "GREEN", "BLUE", "YELLOW", "BLACK"])
37
+ .optional()
38
+ .describe("The design theme"),
39
+ titleField: z
40
+ .discriminatedUnion("selectionMode", [
41
+ z.object({
42
+ selectionMode: z.literal("AUTO"),
43
+ }),
44
+ z.object({
45
+ selectionMode: z.literal("MANUAL"),
46
+ code: z.string().describe("The field code for MANUAL selection mode"),
47
+ }),
48
+ ])
49
+ .optional()
50
+ .describe("The record title field settings"),
51
+ enableThumbnails: z
52
+ .boolean()
53
+ .optional()
54
+ .describe("Whether to enable thumbnail display"),
55
+ enableComments: z
56
+ .boolean()
57
+ .optional()
58
+ .describe("Whether to enable record comments"),
59
+ enableBulkDeletion: z
60
+ .boolean()
61
+ .optional()
62
+ .describe("Whether to enable bulk deletion of records"),
63
+ enableDuplicateRecord: z
64
+ .boolean()
65
+ .optional()
66
+ .describe("Whether to enable the reuse record feature"),
67
+ enableInlineRecordEditing: z
68
+ .boolean()
69
+ .optional()
70
+ .describe("Whether to enable inline editing in record list"),
71
+ numberPrecision: z
72
+ .object({
73
+ digits: z.string().optional().describe("Total number of digits (1-30)"),
74
+ decimalPlaces: z
75
+ .string()
76
+ .optional()
77
+ .describe("Number of decimal places (0-10)"),
78
+ roundingMode: z
79
+ .enum(["HALF_EVEN", "UP", "DOWN"])
80
+ .optional()
81
+ .describe("Rounding method"),
82
+ })
83
+ .optional()
84
+ .describe("The numeric calculation precision settings"),
85
+ firstMonthOfFiscalYear: z
86
+ .string()
87
+ .optional()
88
+ .describe("The first month of the fiscal year (1-12)"),
89
+ revision: z
90
+ .string()
91
+ .optional()
92
+ .describe("Expected revision number for optimistic locking"),
93
+ };
94
+ const outputSchema = {
95
+ revision: z.string().describe("The revision number after the update"),
96
+ };
97
+ const toolName = "kintone-update-general-settings";
98
+ const toolConfig = {
99
+ title: "Update General Settings",
100
+ description: "Update the general settings of a kintone app. Changes are made to the pre-live environment, which is a temporary storage area where app information is saved before deployment. To reflect changes to the production environment, execute the kintone-deploy-app tool after this tool.",
101
+ inputSchema,
102
+ outputSchema,
103
+ };
104
+ const callback = async (params, { client }) => {
105
+ const response = await client.app.updateAppSettings(params);
106
+ const result = {
107
+ revision: response.revision,
108
+ };
109
+ return {
110
+ structuredContent: result,
111
+ content: [
112
+ {
113
+ type: "text",
114
+ text: JSON.stringify(result, null, 2),
115
+ },
116
+ ],
117
+ };
118
+ };
119
+ export const updateGeneralSettings = createTool(toolName, toolConfig, callback);
package/dist/version.js CHANGED
@@ -1,2 +1,2 @@
1
1
  // This file is auto-generated. Do not edit manually.
2
- export const version = "1.1.0"; // x-release-please-version
2
+ export const version = "1.2.1"; // x-release-please-version
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kintone/mcp-server",
3
- "version": "1.1.0",
3
+ "version": "1.2.1",
4
4
  "description": "The official MCP Server for kintone",
5
5
  "keywords": [
6
6
  "kintone",
@@ -30,7 +30,7 @@
30
30
  "dist"
31
31
  ],
32
32
  "dependencies": {
33
- "@kintone/rest-api-client": "^5.7.4",
33
+ "@kintone/rest-api-client": "^5.7.5",
34
34
  "@modelcontextprotocol/sdk": "^1.17.5",
35
35
  "file-type": "^21.0.0",
36
36
  "https-proxy-agent": "^7.0.6",
@@ -41,15 +41,17 @@
41
41
  "@commitlint/cli": "^19.8.1",
42
42
  "@commitlint/config-conventional": "^19.8.1",
43
43
  "@cybozu/eslint-config": "^24.2.0",
44
- "@cybozu/license-manager": "^1.3.1",
45
- "@types/node": "^22.18.1",
44
+ "@cybozu/license-manager": "^1.4.0",
45
+ "@modelcontextprotocol/inspector": "^0.17.0",
46
+ "@types/node": "^22.18.8",
46
47
  "doctoc": "^2.2.1",
47
- "eslint": "^9.35.0",
48
- "eslint-plugin-package-json": "^0.56.2",
49
- "globals": "^16.3.0",
48
+ "eslint": "^9.37.0",
49
+ "eslint-plugin-package-json": "^0.56.3",
50
+ "globals": "^16.4.0",
51
+ "npm": "^11.6.1",
50
52
  "prettier": "^3.6.2",
51
- "tsx": "^4.20.5",
52
- "typescript": "^5.9.2",
53
+ "tsx": "^4.20.6",
54
+ "typescript": "^5.9.3",
53
55
  "vitest": "^3.2.4"
54
56
  },
55
57
  "engines": {
@@ -73,6 +75,8 @@
73
75
  "fix": "pnpm run \"/^fix:.*/\"",
74
76
  "fix:eslint": "pnpm lint:eslint --fix",
75
77
  "fix:prettier": "pnpm lint:prettier --write",
78
+ "inspector": "mcp-inspector node dist/index.js",
79
+ "inspector:dev": "mcp-inspector tsx src/index.ts",
76
80
  "license:analyze": "license-manager analyze -c license-manager.config.cjs",
77
81
  "license:extract": "license-manager extract -c license-manager.config.cjs -w .",
78
82
  "lint": "pnpm run \"/^lint:.*/\"",