@kintone/mcp-server 1.4.0 → 1.6.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/CHANGELOG.md CHANGED
@@ -1,5 +1,26 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.6.0](https://github.com/kintone/mcp-server/compare/1.5.0...1.6.0) (2026-06-23)
4
+
5
+
6
+ ### Features
7
+
8
+ * add get space tool ([#435](https://github.com/kintone/mcp-server/issues/435)) ([24fe1a9](https://github.com/kintone/mcp-server/commit/24fe1a9a64e2cacd2dfd8e58baf6f8c5f36faa90))
9
+
10
+ ## [1.5.0](https://github.com/kintone/mcp-server/compare/1.4.0...1.5.0) (2026-06-02)
11
+
12
+
13
+ ### Features
14
+
15
+ * add kintone record comment tools (get/add) ([#414](https://github.com/kintone/mcp-server/issues/414)) ([d2ae555](https://github.com/kintone/mcp-server/commit/d2ae55519c1312e38fe4666f853086b44458fadc))
16
+
17
+
18
+ ### Bug Fixes
19
+
20
+ * **deps:** update dependency @modelcontextprotocol/sdk to v1.29.0 ([#317](https://github.com/kintone/mcp-server/issues/317)) ([1688179](https://github.com/kintone/mcp-server/commit/168817913c7a7927dc7304cce949e0efbcaa6793))
21
+ * remove stray console.log polluting MCP stdio stream ([#463](https://github.com/kintone/mcp-server/issues/463)) ([ab15d5a](https://github.com/kintone/mcp-server/commit/ab15d5a9525d45e64d2e8396d0ae568a20671d2f))
22
+ * use --node-linker=hoisted instead of --shamefully-hoist ([#459](https://github.com/kintone/mcp-server/issues/459)) ([a276b1c](https://github.com/kintone/mcp-server/commit/a276b1ca4939b68f858a2ddbb2186efccb57adc2))
23
+
3
24
  ## [1.4.0](https://github.com/kintone/mcp-server/compare/1.3.15...1.4.0) (2026-05-27)
4
25
 
5
26
 
package/README.md CHANGED
@@ -209,10 +209,13 @@ export HTTPS_PROXY="http://username:password@proxy.example.com:8080"
209
209
  | `kintone-update-records` | 複数のレコードを更新 |
210
210
  | `kintone-delete-records` | 複数のレコードを削除 |
211
211
  | `kintone-update-statuses` | 複数のレコードのステータスを更新 |
212
+ | `kintone-get-record-comments` | レコードのコメントを取得 |
213
+ | `kintone-add-record-comment` | レコードにコメントを追加 |
212
214
  | `kintone-add-app` | 動作テスト環境にアプリを作成 |
213
215
  | `kintone-deploy-app` | アプリ設定を運用環境へ反映 |
214
216
  | `kintone-update-general-settings` | アプリの一般設定を変更 |
215
217
  | `kintone-download-file` | 添付ファイルフィールドのファイルを保存 |
218
+ | `kintone-get-space` | スペースの情報を取得 |
216
219
 
217
220
  ## ドキュメント
218
221
 
@@ -0,0 +1 @@
1
+ export { spaceSchema } from "./space.js";
@@ -0,0 +1,75 @@
1
+ import { z } from "zod";
2
+ const userRefSchema = z.object({
3
+ code: z.string().describe("User login name (unique identifier)"),
4
+ name: z.string().describe("Display name of the user"),
5
+ });
6
+ const permissionsSchema = z.object({
7
+ createApp: z
8
+ .enum(["EVERYONE", "ADMIN"])
9
+ .describe("Who may create apps in this space: EVERYONE (any member) or ADMIN (space administrators only)"),
10
+ });
11
+ const attachedAppSchema = z.object({
12
+ threadId: z
13
+ .string()
14
+ .nullable()
15
+ .describe("Thread ID where the app is placed; null when not associated with a thread per API response"),
16
+ appId: z.string().describe("Numeric app ID as string"),
17
+ code: z.string().describe("App code (unique string)"),
18
+ name: z.string().describe("App name"),
19
+ description: z.string().describe("App description"),
20
+ createdAt: z.string().describe("App creation datetime (ISO 8601)"),
21
+ creator: userRefSchema.describe("User who created the app"),
22
+ modifiedAt: z.string().describe("App last modified datetime (ISO 8601)"),
23
+ modifier: userRefSchema.describe("User who last modified the app"),
24
+ });
25
+ export const spaceSchema = z.object({
26
+ id: z.string().describe("The space ID"),
27
+ name: z.string().describe("The space name"),
28
+ defaultThread: z
29
+ .string()
30
+ .describe("Thread ID of the default thread in this space"),
31
+ isPrivate: z.boolean().describe("Whether the space is private"),
32
+ creator: userRefSchema.describe("User who created the space"),
33
+ modifier: userRefSchema.describe("User who last modified the space"),
34
+ memberCount: z
35
+ .string()
36
+ .describe("Member count returned by the API (stringified number)"),
37
+ coverType: z
38
+ .enum(["BLOB", "PRESET"])
39
+ .describe("Cover image type: BLOB (custom upload) or PRESET (preset image)"),
40
+ coverKey: z.string().describe("Key of the cover image"),
41
+ coverUrl: z.string().describe("URL of the cover image"),
42
+ body: z
43
+ .string()
44
+ .nullable()
45
+ .describe("HTML body of the space portal; null when the portal has no content"),
46
+ useMultiThread: z.boolean().describe("Whether multiple threads are enabled"),
47
+ isGuest: z.boolean().describe("Whether the space is a guest space"),
48
+ attachedApps: z
49
+ .array(attachedAppSchema)
50
+ .describe("Apps attached to this space"),
51
+ fixedMember: z
52
+ .boolean()
53
+ .describe("Whether users are blocked from joining or leaving on their own"),
54
+ showAnnouncement: z
55
+ .boolean()
56
+ .nullable()
57
+ .describe("Announcement widget visibility; null for single-thread spaces where not applicable"),
58
+ showThreadList: z
59
+ .boolean()
60
+ .nullable()
61
+ .describe("Thread list widget visibility; null for single-thread spaces where not applicable"),
62
+ showAppList: z
63
+ .boolean()
64
+ .nullable()
65
+ .describe("App list widget visibility; null for single-thread spaces where not applicable"),
66
+ showMemberList: z
67
+ .boolean()
68
+ .nullable()
69
+ .describe("Member list widget visibility; null for single-thread spaces where not applicable"),
70
+ showRelatedLinkList: z
71
+ .boolean()
72
+ .nullable()
73
+ .describe("Related apps and spaces widget visibility; null for single-thread spaces where not applicable"),
74
+ permissions: permissionsSchema.describe("Space permission settings"),
75
+ });
@@ -1,7 +1,12 @@
1
1
  const filterRules = [
2
2
  {
3
3
  condition: (condition) => condition.isApiTokenAuth,
4
- excludeTools: ["kintone-get-apps", "kintone-add-app", "kintone-search"],
4
+ excludeTools: [
5
+ "kintone-get-apps",
6
+ "kintone-add-app",
7
+ "kintone-search",
8
+ "kintone-get-space",
9
+ ],
5
10
  },
6
11
  ];
7
12
  export function shouldEnableTool(toolName, condition) {
@@ -1,5 +1,7 @@
1
+ import { addRecordComment } from "./kintone/record/add-record-comment.js";
1
2
  import { addRecords } from "./kintone/record/add-records.js";
2
3
  import { deleteRecords } from "./kintone/record/delete-records.js";
4
+ import { getRecordComments } from "./kintone/record/get-record-comments.js";
3
5
  import { getRecords } from "./kintone/record/get-records.js";
4
6
  import { updateRecords } from "./kintone/record/update-records.js";
5
7
  import { getApp } from "./kintone/app/get-app.js";
@@ -18,6 +20,7 @@ import { addApp } from "./kintone/app/add-app.js";
18
20
  import { deployApp } from "./kintone/app/deploy-app.js";
19
21
  import { updateGeneralSettings } from "./kintone/app/update-general-settings.js";
20
22
  import { downloadFile } from "./kintone/file/download-file.js";
23
+ import { getSpace } from "./kintone/space/get-space.js";
21
24
  import { search } from "./kintone/search/search.js";
22
25
  export { createToolCallback } from "./factory.js";
23
26
  export const tools = [
@@ -36,10 +39,13 @@ export const tools = [
36
39
  addRecords,
37
40
  deleteRecords,
38
41
  getRecords,
42
+ getRecordComments,
43
+ addRecordComment,
39
44
  updateRecords,
40
45
  addApp,
41
46
  deployApp,
42
47
  updateGeneralSettings,
43
48
  downloadFile,
49
+ getSpace,
44
50
  search,
45
51
  ];
@@ -89,7 +89,6 @@ const toolConfig = {
89
89
  };
90
90
  const callback = async ({ app, lang, preview }, { client }) => {
91
91
  const settings = await client.app.getAppSettings({ app, lang, preview });
92
- console.log(settings);
93
92
  const result = {
94
93
  name: settings.name,
95
94
  description: settings.description,
@@ -0,0 +1,58 @@
1
+ import { z } from "zod";
2
+ import { createTool } from "../../factory.js";
3
+ const mentionSchema = z.object({
4
+ code: z
5
+ .string()
6
+ .describe("Login name (for USER), group/role code (for GROUP), or organization code (for ORGANIZATION). Display names are not accepted."),
7
+ type: z
8
+ .enum(["USER", "GROUP", "ORGANIZATION"])
9
+ .describe("Type of the mention target"),
10
+ });
11
+ const inputSchema = {
12
+ app: z
13
+ .string()
14
+ .describe("The ID of the app that contains the record (numeric value as string)"),
15
+ record: z.string().describe("The ID of the record to add a comment to"),
16
+ text: z
17
+ .string()
18
+ .min(1)
19
+ .max(65535)
20
+ .describe("Comment text. To mention users/groups/organizations, list the corresponding entries in 'mentions'. Do NOT include '@code' tokens in this text — not even as a greeting prefix such as '@user1 さん、' or '@group_name '. Mentions specified via the 'mentions' parameter are auto-rendered into the posted comment by kintone; any '@code' written in this text becomes a plain-text literal that does not link, does not notify, and visually duplicates the auto-rendered mention."),
21
+ mentions: z
22
+ .array(mentionSchema)
23
+ .optional()
24
+ .describe("Mentions to attach to the comment. Each entry pairs a code with its type (USER/GROUP/ORGANIZATION)."),
25
+ };
26
+ const outputSchema = {
27
+ id: z.string().describe("ID of the added comment"),
28
+ };
29
+ const toolName = "kintone-add-record-comment";
30
+ const toolConfig = {
31
+ title: "Add Record Comment",
32
+ description: "Add a single comment to a kintone record. The kintone API accepts one comment per call; to add comments to multiple records, call this tool repeatedly.",
33
+ inputSchema,
34
+ outputSchema,
35
+ };
36
+ const callback = async ({ app, record, text, mentions }, { client }) => {
37
+ const response = await client.record.addRecordComment({
38
+ app,
39
+ record,
40
+ comment: {
41
+ text,
42
+ mentions,
43
+ },
44
+ });
45
+ const result = {
46
+ id: response.id,
47
+ };
48
+ return {
49
+ structuredContent: result,
50
+ content: [
51
+ {
52
+ type: "text",
53
+ text: JSON.stringify(result, null, 2),
54
+ },
55
+ ],
56
+ };
57
+ };
58
+ export const addRecordComment = createTool(toolName, toolConfig, callback);
@@ -0,0 +1,82 @@
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 that contains the record (numeric value as string)"),
7
+ record: z.string().describe("The ID of the record to retrieve comments from"),
8
+ order: z
9
+ .enum(["asc", "desc"])
10
+ .optional()
11
+ .describe("Sort order of comments by createdAt. 'asc' = oldest first, 'desc' = newest first (default: desc)"),
12
+ limit: z
13
+ .number()
14
+ .min(1)
15
+ .max(10)
16
+ .optional()
17
+ .describe("Maximum number of comments to retrieve (1-10, default: 10 by kintone API)"),
18
+ offset: z
19
+ .number()
20
+ .min(0)
21
+ .optional()
22
+ .describe("Number of comments to skip (default: 0)"),
23
+ };
24
+ const commentSchema = z.object({
25
+ id: z.string().describe("Comment ID"),
26
+ text: z.string().describe("Comment text"),
27
+ createdAt: z.string().describe("Comment creation datetime (ISO 8601)"),
28
+ creator: z
29
+ .object({
30
+ code: z.string().describe("User code of the comment creator"),
31
+ name: z.string().describe("Display name of the comment creator"),
32
+ })
33
+ .describe("Information about the comment creator"),
34
+ mentions: z
35
+ .array(z.object({
36
+ code: z.string().describe("Code of the mentioned user/group/org"),
37
+ type: z
38
+ .enum(["USER", "GROUP", "ORGANIZATION"])
39
+ .describe("Type of the mention target"),
40
+ }))
41
+ .describe("Mentions in the comment"),
42
+ });
43
+ const outputSchema = {
44
+ comments: z.array(commentSchema).describe("Array of comments on the record"),
45
+ older: z
46
+ .boolean()
47
+ .describe("Whether there are older comments beyond this page"),
48
+ newer: z
49
+ .boolean()
50
+ .describe("Whether there are newer comments beyond this page"),
51
+ };
52
+ const toolName = "kintone-get-record-comments";
53
+ const toolConfig = {
54
+ title: "Get Record Comments",
55
+ description: "Get comments posted on a single kintone record. The kintone API returns comments for one record at a time; to fetch comments for multiple records, call this tool repeatedly. Up to 10 comments are returned per call; use offset to paginate.",
56
+ inputSchema,
57
+ outputSchema,
58
+ };
59
+ const callback = async ({ app, record, order, limit, offset }, { client }) => {
60
+ const response = await client.record.getRecordComments({
61
+ app,
62
+ record,
63
+ order,
64
+ limit,
65
+ offset,
66
+ });
67
+ const result = {
68
+ comments: response.comments,
69
+ older: response.older,
70
+ newer: response.newer,
71
+ };
72
+ return {
73
+ structuredContent: result,
74
+ content: [
75
+ {
76
+ type: "text",
77
+ text: JSON.stringify(result, null, 2),
78
+ },
79
+ ],
80
+ };
81
+ };
82
+ export const getRecordComments = createTool(toolName, toolConfig, callback);
@@ -0,0 +1,56 @@
1
+ import { z } from "zod";
2
+ import { createTool } from "../../factory.js";
3
+ import { spaceSchema } from "../../../schema/space/index.js";
4
+ const inputSchema = {
5
+ id: z
6
+ .string()
7
+ .describe("Space ID as returned by Kintone (numeric string). Same value as in space URLs and other Space APIs."),
8
+ };
9
+ const outputSchema = spaceSchema.shape;
10
+ const toolName = "kintone-get-space";
11
+ const toolDescription = "Retrieve a kintone space via the Space REST API (GET /k/v1/space.json). " +
12
+ "Read-only: returns metadata and portal content such as name, default thread, privacy, HTML body, cover image, " +
13
+ "widget visibility, member count, attached apps, and who may create apps (EVERYONE vs ADMIN). " +
14
+ "Requires permission to view the target space. Does not modify any space configuration.";
15
+ const toolConfig = {
16
+ title: "Get Space",
17
+ description: toolDescription,
18
+ inputSchema,
19
+ outputSchema,
20
+ };
21
+ const callback = async ({ id }, { client }) => {
22
+ const space = await client.space.getSpace({ id });
23
+ const result = {
24
+ id: space.id,
25
+ name: space.name,
26
+ defaultThread: space.defaultThread,
27
+ isPrivate: space.isPrivate,
28
+ creator: space.creator,
29
+ modifier: space.modifier,
30
+ memberCount: space.memberCount,
31
+ coverType: space.coverType,
32
+ coverKey: space.coverKey,
33
+ coverUrl: space.coverUrl,
34
+ body: space.body,
35
+ useMultiThread: space.useMultiThread,
36
+ isGuest: space.isGuest,
37
+ attachedApps: space.attachedApps,
38
+ fixedMember: space.fixedMember,
39
+ showAnnouncement: space.showAnnouncement,
40
+ showThreadList: space.showThreadList,
41
+ showAppList: space.showAppList,
42
+ showMemberList: space.showMemberList,
43
+ showRelatedLinkList: space.showRelatedLinkList,
44
+ permissions: space.permissions,
45
+ };
46
+ return {
47
+ structuredContent: result,
48
+ content: [
49
+ {
50
+ type: "text",
51
+ text: JSON.stringify(result, null, 2),
52
+ },
53
+ ],
54
+ };
55
+ };
56
+ export const getSpace = 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.4.0"; // x-release-please-version
2
+ export const version = "1.6.0"; // x-release-please-version
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kintone/mcp-server",
3
- "version": "1.4.0",
3
+ "version": "1.6.0",
4
4
  "description": "The official MCP Server for kintone",
5
5
  "keywords": [
6
6
  "kintone",
@@ -31,7 +31,7 @@
31
31
  ],
32
32
  "dependencies": {
33
33
  "@kintone/rest-api-client": "6.2.0",
34
- "@modelcontextprotocol/sdk": "1.26.0",
34
+ "@modelcontextprotocol/sdk": "1.29.0",
35
35
  "file-type": "22.0.1",
36
36
  "https-proxy-agent": "7.0.6",
37
37
  "zod": "3.25.76"
@@ -43,16 +43,16 @@
43
43
  "@cybozu/eslint-config": "25.0.1",
44
44
  "@cybozu/license-manager": "1.4.1",
45
45
  "@modelcontextprotocol/inspector": "0.18.0",
46
- "@types/node": "22.19.19",
47
- "doctoc": "2.4.1",
46
+ "@types/node": "22.20.0",
47
+ "doctoc": "2.5.0",
48
48
  "eslint": "9.39.4",
49
49
  "eslint-plugin-package-json": "0.88.3",
50
50
  "globals": "17.6.0",
51
- "npm": "11.15.0",
52
- "prettier": "3.8.3",
53
- "tsx": "4.22.3",
51
+ "npm": "11.17.0",
52
+ "prettier": "3.8.4",
53
+ "tsx": "4.22.4",
54
54
  "typescript": "5.9.3",
55
- "vitest": "4.1.7"
55
+ "vitest": "4.1.9"
56
56
  },
57
57
  "engines": {
58
58
  "node": ">= 22"