@cmssy/mcp-server 0.94.0 → 0.95.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/README.md +18 -6
- package/dist/__tests__/binder-tool-marker.test.js +1 -0
- package/dist/__tests__/binder-tool-marker.test.js.map +1 -1
- package/dist/__tests__/listing-manifests.test.d.ts +2 -0
- package/dist/__tests__/listing-manifests.test.d.ts.map +1 -0
- package/dist/__tests__/listing-manifests.test.js +20 -0
- package/dist/__tests__/listing-manifests.test.js.map +1 -0
- package/dist/__tests__/tool-annotations.test.d.ts +2 -0
- package/dist/__tests__/tool-annotations.test.d.ts.map +1 -0
- package/dist/__tests__/tool-annotations.test.js +84 -0
- package/dist/__tests__/tool-annotations.test.js.map +1 -0
- package/dist/ai-tools-binder.d.ts +3 -0
- package/dist/ai-tools-binder.d.ts.map +1 -1
- package/dist/ai-tools-binder.js +25 -0
- package/dist/ai-tools-binder.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -6,9 +6,11 @@ MCP server for [Cmssy CMS](https://cmssy.com) — enables AI-driven page creatio
|
|
|
6
6
|
|
|
7
7
|
### Prerequisites
|
|
8
8
|
|
|
9
|
-
1.
|
|
10
|
-
2. An API token (
|
|
11
|
-
3. Your workspace ID
|
|
9
|
+
1. A Cmssy workspace - the free plan works; cart and checkout need Pro
|
|
10
|
+
2. An API token (Dashboard > API Tokens, starts with `cs_`)
|
|
11
|
+
3. Your workspace ID (Workspace Settings > General)
|
|
12
|
+
|
|
13
|
+
The server talks to `https://api.cmssy.io` by default. Pass `--api-url` only for another backend.
|
|
12
14
|
|
|
13
15
|
### Add to Claude Code
|
|
14
16
|
|
|
@@ -26,9 +28,7 @@ Add to `.mcp.json` in your project root:
|
|
|
26
28
|
"--token",
|
|
27
29
|
"cs_YOUR_TOKEN",
|
|
28
30
|
"--workspace-id",
|
|
29
|
-
"YOUR_WORKSPACE_ID"
|
|
30
|
-
"--api-url",
|
|
31
|
-
"https://api.your-cmssy.com"
|
|
31
|
+
"YOUR_WORKSPACE_ID"
|
|
32
32
|
]
|
|
33
33
|
}
|
|
34
34
|
}
|
|
@@ -64,6 +64,18 @@ when a tool fails on a field the API should serve, then compare.
|
|
|
64
64
|
Clearing the cache is `npx clear-npx-cache`, or pin the version in your config
|
|
65
65
|
so nothing has to be diagnosed.
|
|
66
66
|
|
|
67
|
+
## Privacy Policy
|
|
68
|
+
|
|
69
|
+
Full policy: <https://www.cmssy.com/privacy>. Contact: contact@cmssy.com.
|
|
70
|
+
|
|
71
|
+
- **What this server collects**: nothing of its own. It keeps no local database, writes no files and sends nothing to any analytics service.
|
|
72
|
+
- **What it sends, and where**: each tool call becomes a GraphQL request to the Cmssy API (`https://api.cmssy.io` unless you set `CMSSY_API_URL`), carrying your API token, your workspace ID, the tool's arguments, the client name and version, and the name of the tool being run. The Cmssy API records one usage event per tool call from those last two.
|
|
73
|
+
- **Files and URLs**: `upload_media` reads only the local file path or downloads only the URL you pass it, then uploads the bytes to the Cmssy storage URL the API returns. It touches no other file.
|
|
74
|
+
- **Usage and storage**: the Cmssy API stores workspace content (pages, records, media, orders, customers) as described in the policy above, in the European Union. Content is not sold and not used to train AI models.
|
|
75
|
+
- **Third-party sharing**: the server talks to the Cmssy API and the Cmssy storage URL only, plus any URL you hand to `upload_media`. Third parties the Cmssy service itself uses are listed in the policy.
|
|
76
|
+
- **Data retention**: the server keeps nothing after a call returns. Workspace data stays until you delete it or close your account; retention periods are in the policy.
|
|
77
|
+
- **Your token**: it acts with the permissions of the member who created it. Revoke it under Dashboard > API Tokens at any time.
|
|
78
|
+
|
|
67
79
|
## Response shape (write tools)
|
|
68
80
|
|
|
69
81
|
As of 0.6.0, most write tools accept an optional `response` arg:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"binder-tool-marker.test.js","sourceRoot":"","sources":["../../src/__tests__/binder-tool-marker.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAE3D,QAAQ,CAAC,uDAAuD,EAAE,GAAG,EAAE;IACrE,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,IAAI,IAAwC,CAAC;QAC7C,MAAM,IAAI,GAAG;YACX,IAAI,EAAE,YAAY;YAClB,WAAW,EAAE,EAAE;YACf,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;YACzB,OAAO,EAAE,KAAK,IAAI,EAAE;gBAClB,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;gBAC9B,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;YACtB,CAAC;SACmB,CAAC;QAEvB,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,EAAE,EAAkB,CAAC,CAAC;QAC9D,MAAM,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC;QAE1C,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC/C,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"binder-tool-marker.test.js","sourceRoot":"","sources":["../../src/__tests__/binder-tool-marker.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAE3D,QAAQ,CAAC,uDAAuD,EAAE,GAAG,EAAE;IACrE,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,IAAI,IAAwC,CAAC;QAC7C,MAAM,IAAI,GAAG;YACX,IAAI,EAAE,YAAY;YAClB,WAAW,EAAE,EAAE;YACf,mBAAmB,EAAE,CAAC,YAAY,CAAC;YACnC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;YACzB,OAAO,EAAE,KAAK,IAAI,EAAE;gBAClB,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;gBAC9B,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;YACtB,CAAC;SACmB,CAAC;QAEvB,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,EAAE,EAAkB,CAAC,CAAC;QAC9D,MAAM,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC;QAE1C,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC/C,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listing-manifests.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/listing-manifests.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { dirname, resolve } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { describe, expect, it } from "vitest";
|
|
5
|
+
import { PACKAGE_VERSION } from "../package-version.js";
|
|
6
|
+
const root = resolve(dirname(fileURLToPath(import.meta.url)), "../..");
|
|
7
|
+
function readJson(path) {
|
|
8
|
+
return JSON.parse(readFileSync(resolve(root, path), "utf8"));
|
|
9
|
+
}
|
|
10
|
+
describe("listing manifests ship the published version", () => {
|
|
11
|
+
it("bundles the same version in the MCPB manifest", () => {
|
|
12
|
+
expect(readJson("mcpb/manifest.json").version).toBe(PACKAGE_VERSION);
|
|
13
|
+
});
|
|
14
|
+
it("pins the Claude plugin to the same npm version it declares", () => {
|
|
15
|
+
const plugin = readJson("claude-plugin/.claude-plugin/plugin.json");
|
|
16
|
+
expect(plugin.version).toBe(PACKAGE_VERSION);
|
|
17
|
+
expect(plugin.mcpServers.cmssy.args).toContain(`@cmssy/mcp-server@${PACKAGE_VERSION}`);
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
//# sourceMappingURL=listing-manifests.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listing-manifests.test.js","sourceRoot":"","sources":["../../src/__tests__/listing-manifests.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAEvE,SAAS,QAAQ,CAAC,IAAY;IAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,QAAQ,CAAC,8CAA8C,EAAE,GAAG,EAAE;IAC5D,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,MAAM,MAAM,GAAG,QAAQ,CAAC,0CAA0C,CAGjE,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,SAAS,CAC5C,qBAAqB,eAAe,EAAE,CACvC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-annotations.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/tool-annotations.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { CONFIRM_GATED_TOOLS } from "@cmssy/ai-tools";
|
|
3
|
+
import { createServer } from "../server.js";
|
|
4
|
+
import { toolAnnotations } from "../ai-tools-binder.js";
|
|
5
|
+
import { connectServer } from "./mcp-harness.js";
|
|
6
|
+
async function listedTools() {
|
|
7
|
+
const server = createServer({ query: vi.fn() });
|
|
8
|
+
const client = await connectServer(server);
|
|
9
|
+
const { tools } = await client.listTools();
|
|
10
|
+
return tools;
|
|
11
|
+
}
|
|
12
|
+
describe("tool annotations for the Claude directory", () => {
|
|
13
|
+
it("lists the server's tools at all", async () => {
|
|
14
|
+
expect((await listedTools()).length).toBeGreaterThan(90);
|
|
15
|
+
});
|
|
16
|
+
it("gives every tool a title and an explicit read-only or destructive hint", async () => {
|
|
17
|
+
const missing = (await listedTools())
|
|
18
|
+
.filter((tool) => !tool.title ||
|
|
19
|
+
tool.annotations?.title !== tool.title ||
|
|
20
|
+
typeof tool.annotations?.readOnlyHint !== "boolean" ||
|
|
21
|
+
typeof tool.annotations?.destructiveHint !== "boolean")
|
|
22
|
+
.map((tool) => tool.name);
|
|
23
|
+
expect(missing).toEqual([]);
|
|
24
|
+
});
|
|
25
|
+
it("marks every confirm-gated tool destructive and never read-only", async () => {
|
|
26
|
+
const gated = (await listedTools()).filter((tool) => CONFIRM_GATED_TOOLS.has(tool.name));
|
|
27
|
+
expect(gated.length).toBe(CONFIRM_GATED_TOOLS.size);
|
|
28
|
+
expect(gated
|
|
29
|
+
.filter((tool) => tool.annotations?.destructiveHint !== true ||
|
|
30
|
+
tool.annotations?.readOnlyHint !== false)
|
|
31
|
+
.map((tool) => tool.name)).toEqual([]);
|
|
32
|
+
});
|
|
33
|
+
it("never calls a read-only tool destructive", async () => {
|
|
34
|
+
const contradictory = (await listedTools())
|
|
35
|
+
.filter((tool) => tool.annotations?.readOnlyHint === true &&
|
|
36
|
+
tool.annotations?.destructiveHint !== false)
|
|
37
|
+
.map((tool) => tool.name);
|
|
38
|
+
expect(contradictory).toEqual([]);
|
|
39
|
+
});
|
|
40
|
+
it("splits reads from writes by name and permission", async () => {
|
|
41
|
+
const byName = Object.fromEntries((await listedTools()).map((tool) => [tool.name, tool.annotations]));
|
|
42
|
+
expect(byName.list_pages).toMatchObject({
|
|
43
|
+
title: "List pages",
|
|
44
|
+
readOnlyHint: true,
|
|
45
|
+
destructiveHint: false,
|
|
46
|
+
});
|
|
47
|
+
expect(byName.get_workspace_info?.readOnlyHint).toBe(true);
|
|
48
|
+
expect(byName.create_page).toMatchObject({
|
|
49
|
+
readOnlyHint: false,
|
|
50
|
+
destructiveHint: false,
|
|
51
|
+
});
|
|
52
|
+
expect(byName.update_page_blocks).toMatchObject({
|
|
53
|
+
readOnlyHint: false,
|
|
54
|
+
destructiveHint: true,
|
|
55
|
+
});
|
|
56
|
+
expect(byName.refund_order).toMatchObject({
|
|
57
|
+
readOnlyHint: false,
|
|
58
|
+
destructiveHint: true,
|
|
59
|
+
});
|
|
60
|
+
expect(byName.update_region_settings?.readOnlyHint).toBe(false);
|
|
61
|
+
});
|
|
62
|
+
it("lets the confirm gate outrank a read-like or additive name", () => {
|
|
63
|
+
expect(toolAnnotations({
|
|
64
|
+
name: "create_snapshot",
|
|
65
|
+
requiredPermissions: ["pages:edit"],
|
|
66
|
+
confirmGated: true,
|
|
67
|
+
})).toMatchObject({ readOnlyHint: false, destructiveHint: true });
|
|
68
|
+
expect(toolAnnotations({
|
|
69
|
+
name: "list_and_purge",
|
|
70
|
+
requiredPermissions: ["pages:view"],
|
|
71
|
+
confirmGated: true,
|
|
72
|
+
})).toMatchObject({ readOnlyHint: false, destructiveHint: true });
|
|
73
|
+
});
|
|
74
|
+
it("keeps a read-like name with a write permission off the read-only list", () => {
|
|
75
|
+
expect(toolAnnotations({
|
|
76
|
+
name: "get_and_lock",
|
|
77
|
+
requiredPermissions: ["pages:edit"],
|
|
78
|
+
})).toMatchObject({ readOnlyHint: false, destructiveHint: true });
|
|
79
|
+
});
|
|
80
|
+
it("keeps a write-like name with no permission off the read-only list", () => {
|
|
81
|
+
expect(toolAnnotations({ name: "touch_session", requiredPermissions: [] })).toMatchObject({ readOnlyHint: false, destructiveHint: true });
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
//# sourceMappingURL=tool-annotations.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-annotations.test.js","sourceRoot":"","sources":["../../src/__tests__/tool-annotations.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { ToolAnnotations } from "@modelcontextprotocol/sdk/types.js";
|
|
2
3
|
import { z } from "zod";
|
|
3
4
|
import type { AiTool, WorkspaceOps } from "@cmssy/ai-tools";
|
|
4
5
|
export declare function boundDeclarations(server: McpServer): Map<string, AiTool>;
|
|
5
6
|
export declare function toolInputSchema(tool: Pick<AiTool, "inputSchema" | "confirmGated">): z.ZodObject<z.ZodRawShape>;
|
|
7
|
+
export declare function toolTitle(name: string): string;
|
|
8
|
+
export declare function toolAnnotations(tool: Pick<AiTool, "name" | "requiredPermissions" | "confirmGated">): ToolAnnotations;
|
|
6
9
|
export declare function bindSharedTool(server: McpServer, tool: AiTool, ops: WorkspaceOps): void;
|
|
7
10
|
//# sourceMappingURL=ai-tools-binder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-tools-binder.d.ts","sourceRoot":"","sources":["../src/ai-tools-binder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAyE5D,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAExE;AAOD,wBAAgB,eAAe,CAC7B,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,aAAa,GAAG,cAAc,CAAC,GACjD,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAY5B;AAED,wBAAgB,cAAc,CAC5B,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,YAAY,GAChB,IAAI,
|
|
1
|
+
{"version":3,"file":"ai-tools-binder.d.ts","sourceRoot":"","sources":["../src/ai-tools-binder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAyE5D,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAExE;AAOD,wBAAgB,eAAe,CAC7B,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,aAAa,GAAG,cAAc,CAAC,GACjD,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAY5B;AAKD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM9C;AAED,wBAAgB,eAAe,CAC7B,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,qBAAqB,GAAG,cAAc,CAAC,GAClE,eAAe,CAiBjB;AAED,wBAAgB,cAAc,CAC5B,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,YAAY,GAChB,IAAI,CAoDN"}
|
package/dist/ai-tools-binder.js
CHANGED
|
@@ -66,13 +66,38 @@ export function toolInputSchema(tool) {
|
|
|
66
66
|
}
|
|
67
67
|
return declared.safeExtend(coerced).strict();
|
|
68
68
|
}
|
|
69
|
+
const READ_NAME = /^(get|list|search)_/;
|
|
70
|
+
const ADDITIVE_NAME = /^(create|upload)_/;
|
|
71
|
+
export function toolTitle(name) {
|
|
72
|
+
const words = name.split("_");
|
|
73
|
+
return [
|
|
74
|
+
words[0].charAt(0).toUpperCase() + words[0].slice(1),
|
|
75
|
+
...words.slice(1),
|
|
76
|
+
].join(" ");
|
|
77
|
+
}
|
|
78
|
+
export function toolAnnotations(tool) {
|
|
79
|
+
const title = toolTitle(tool.name);
|
|
80
|
+
const readOnly = tool.confirmGated !== true &&
|
|
81
|
+
READ_NAME.test(tool.name) &&
|
|
82
|
+
tool.requiredPermissions.every((permission) => permission.endsWith(":view"));
|
|
83
|
+
if (readOnly) {
|
|
84
|
+
return { title, readOnlyHint: true, destructiveHint: false };
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
title,
|
|
88
|
+
readOnlyHint: false,
|
|
89
|
+
destructiveHint: tool.confirmGated === true || !ADDITIVE_NAME.test(tool.name),
|
|
90
|
+
};
|
|
91
|
+
}
|
|
69
92
|
export function bindSharedTool(server, tool, ops) {
|
|
70
93
|
const declared = declarations.get(server) ?? new Map();
|
|
71
94
|
declared.set(tool.name, tool);
|
|
72
95
|
declarations.set(server, declared);
|
|
73
96
|
server.registerTool(tool.name, {
|
|
97
|
+
title: toolTitle(tool.name),
|
|
74
98
|
description: tool.description,
|
|
75
99
|
inputSchema: toolInputSchema(tool),
|
|
100
|
+
annotations: toolAnnotations(tool),
|
|
76
101
|
}, async (input) => {
|
|
77
102
|
let executeInput = input;
|
|
78
103
|
if (tool.confirmGated === true) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-tools-binder.js","sourceRoot":"","sources":["../src/ai-tools-binder.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ai-tools-binder.js","sourceRoot":"","sources":["../src/ai-tools-binder.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cmssy/mcp-server",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "MCP server for Cmssy CMS
|
|
3
|
+
"version": "0.95.0",
|
|
4
|
+
"description": "MCP server for Cmssy - hosted headless CMS with native commerce, run by your AI agent",
|
|
5
5
|
"mcpName": "io.github.cmssy-io/cmssy-mcp",
|
|
6
6
|
"homepage": "https://cmssy.com",
|
|
7
7
|
"type": "module",
|