@ace-grid/mcp 1.0.6 → 1.0.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.
- package/README.md +2 -16
- package/dist/index.js +1 -21
- package/dist/tools.d.ts +0 -20
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +0 -41
- package/package.json +4 -3
- package/dist/portalApi.d.ts +0 -18
- package/dist/portalApi.d.ts.map +0 -1
- package/dist/portalApi.js +0 -34
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @ace-grid/mcp
|
|
2
2
|
|
|
3
|
-
Ace Grid MCP is a local Model Context Protocol server for Ace Grid documentation, API metadata, config validation, migration help, framework example generation
|
|
3
|
+
Ace Grid MCP is a local Model Context Protocol server for Ace Grid documentation, API metadata, config validation, migration help, and framework example generation.
|
|
4
4
|
|
|
5
5
|
It is designed for MCP-compatible AI coding tools such as Claude Desktop, Cursor, Codex, and other clients that can launch a stdio MCP server.
|
|
6
6
|
|
|
@@ -44,16 +44,7 @@ For local development from this repository:
|
|
|
44
44
|
|
|
45
45
|
## Local-first behavior
|
|
46
46
|
|
|
47
|
-
Documentation, API search, config validation, implementation planning, and example generation use bundled metadata and run locally.
|
|
48
|
-
|
|
49
|
-
```bash
|
|
50
|
-
ACE_GRID_PORTAL_TOKEN=eyJ... ace-grid-mcp
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
Optional environment variables:
|
|
54
|
-
|
|
55
|
-
- `ACE_GRID_API_BASE_URL`: Ace Grid API base URL. Defaults to `https://api.ace-grid.com`.
|
|
56
|
-
- `ACE_GRID_PORTAL_TOKEN`: bearer token for authenticated account, app, and license-key operations.
|
|
47
|
+
Documentation, API search, config validation, implementation planning, and example generation use bundled metadata and run locally. No Ace Grid account or Portal token is required.
|
|
57
48
|
|
|
58
49
|
## Tools
|
|
59
50
|
|
|
@@ -71,11 +62,6 @@ Optional environment variables:
|
|
|
71
62
|
- `ace_grid_list_examples`: list bundled framework examples.
|
|
72
63
|
- `ace_grid_generate_framework_example`: generate a bundled framework example.
|
|
73
64
|
- `ace_grid_license_setup`: explain license config and public-key behavior.
|
|
74
|
-
- `ace_grid_account_status`: optional authenticated account overview.
|
|
75
|
-
- `ace_grid_list_apps`: optional authenticated app listing.
|
|
76
|
-
- `ace_grid_create_app`: optional authenticated app creation.
|
|
77
|
-
- `ace_grid_list_license_keys`: optional authenticated key listing.
|
|
78
|
-
- `ace_grid_create_license_key`: optional authenticated key creation.
|
|
79
65
|
|
|
80
66
|
## Publishing checklist
|
|
81
67
|
|
package/dist/index.js
CHANGED
|
@@ -5,7 +5,7 @@ import { z } from "zod";
|
|
|
5
5
|
import { toolHandlers } from "./tools.js";
|
|
6
6
|
const server = new McpServer({
|
|
7
7
|
name: "ace-grid-mcp",
|
|
8
|
-
version: "
|
|
8
|
+
version: "1.0.6",
|
|
9
9
|
});
|
|
10
10
|
server.tool("ace_grid_search_docs", "Search bundled Ace Grid docs pages, guide text, API metadata, and feature groups.", {
|
|
11
11
|
limit: z.number().int().min(1).max(50).optional(),
|
|
@@ -55,25 +55,5 @@ server.tool("ace_grid_generate_framework_example", "Generate a bundled Ace Grid
|
|
|
55
55
|
includeActions: z.boolean().optional(),
|
|
56
56
|
}, async (input) => toolHandlers.generateFrameworkExample(input));
|
|
57
57
|
server.tool("ace_grid_license_setup", "Explain Ace Grid license config, domain auto-detection, and public signing-key behavior.", {}, async () => toolHandlers.licenseSetup());
|
|
58
|
-
server.tool("ace_grid_account_status", "Fetch authenticated Ace Grid account, entitlement, and subscription status. Requires ACE_GRID_PORTAL_TOKEN or token input.", {
|
|
59
|
-
token: z.string().optional(),
|
|
60
|
-
}, async (input) => toolHandlers.accountStatus(input));
|
|
61
|
-
server.tool("ace_grid_list_apps", "List authenticated Ace Grid license apps. Requires ACE_GRID_PORTAL_TOKEN or token input.", {
|
|
62
|
-
token: z.string().optional(),
|
|
63
|
-
}, async (input) => toolHandlers.listApps(input));
|
|
64
|
-
server.tool("ace_grid_create_app", "Create an authenticated Ace Grid license app. Requires ACE_GRID_PORTAL_TOKEN or token input.", {
|
|
65
|
-
allowedDomains: z.array(z.string()).optional(),
|
|
66
|
-
name: z.string().min(1),
|
|
67
|
-
token: z.string().optional(),
|
|
68
|
-
}, async (input) => toolHandlers.createApp(input));
|
|
69
|
-
server.tool("ace_grid_list_license_keys", "List license keys for an authenticated Ace Grid app. Requires ACE_GRID_PORTAL_TOKEN or token input.", {
|
|
70
|
-
appId: z.string().min(1),
|
|
71
|
-
token: z.string().optional(),
|
|
72
|
-
}, async (input) => toolHandlers.listLicenseKeys(input));
|
|
73
|
-
server.tool("ace_grid_create_license_key", "Create a license key for an authenticated Ace Grid app. Requires ACE_GRID_PORTAL_TOKEN or token input.", {
|
|
74
|
-
appId: z.string().min(1),
|
|
75
|
-
label: z.string().optional(),
|
|
76
|
-
token: z.string().optional(),
|
|
77
|
-
}, async (input) => toolHandlers.createLicenseKey(input));
|
|
78
58
|
const transport = new StdioServerTransport();
|
|
79
59
|
await server.connect(transport);
|
package/dist/tools.d.ts
CHANGED
|
@@ -54,25 +54,5 @@ export declare const toolHandlers: {
|
|
|
54
54
|
includeActions?: boolean;
|
|
55
55
|
}): ToolResult;
|
|
56
56
|
licenseSetup(): ToolResult;
|
|
57
|
-
accountStatus(input?: {
|
|
58
|
-
token?: string;
|
|
59
|
-
}): Promise<ToolResult>;
|
|
60
|
-
listApps(input?: {
|
|
61
|
-
token?: string;
|
|
62
|
-
}): Promise<ToolResult>;
|
|
63
|
-
createApp(input: {
|
|
64
|
-
allowedDomains?: string[];
|
|
65
|
-
name: string;
|
|
66
|
-
token?: string;
|
|
67
|
-
}): Promise<ToolResult>;
|
|
68
|
-
listLicenseKeys(input: {
|
|
69
|
-
appId: string;
|
|
70
|
-
token?: string;
|
|
71
|
-
}): Promise<ToolResult>;
|
|
72
|
-
createLicenseKey(input: {
|
|
73
|
-
appId: string;
|
|
74
|
-
label?: string;
|
|
75
|
-
token?: string;
|
|
76
|
-
}): Promise<ToolResult>;
|
|
77
57
|
};
|
|
78
58
|
//# sourceMappingURL=tools.d.ts.map
|
package/dist/tools.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAiBL,KAAK,gBAAgB,EACrB,KAAK,WAAW,EACjB,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAiBL,KAAK,gBAAgB,EACrB,KAAK,WAAW,EACjB,MAAM,cAAc,CAAC;AAEtB,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE,KAAK,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;KACd,CAAC,CAAC;CACJ,CAAC;AAwBF,eAAO,MAAM,YAAY;sBACL;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;qBAQlC;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;2BAO3B;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;;;uBAqBrC;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE;mBAgB1B;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE;0BAgBT;QAAE,MAAM,EAAE,OAAO,CAAA;KAAE;8BAIf;QACxB,SAAS,CAAC,EAAE,gBAAgB,CAAC;QAC7B,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,WAAW,CAAC;KACpB;kCAI6B;QAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,gBAAgB,CAAC;QAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,WAAW,CAAC;KACpB;gCAI2B;QAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,IAAI,CAAC,EAAE,WAAW,GAAG,KAAK,GAAG,YAAY,CAAC;KAC3C;;oCAU+B;QAC9B,SAAS,EAAE,MAAM,CAAC;QAClB,cAAc,CAAC,EAAE,OAAO,CAAC;KAC1B;;CAgBF,CAAC"}
|
package/dist/tools.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { formulaSnapshot, generateImplementation, generateReactExample, getDocsPage, getFrameworkExample, getProp, gridSnapshot, licenseSetupGuide, listDocsPages, listFeatureGroups, listFrameworkExamples, planImplementation, searchCatalog, searchDocs, searchEverything, validateGridConfig, } from "./catalog.js";
|
|
2
|
-
import { PortalClient } from "./portalApi.js";
|
|
3
2
|
function jsonResult(value) {
|
|
4
3
|
return {
|
|
5
4
|
content: [
|
|
@@ -111,44 +110,4 @@ export const toolHandlers = {
|
|
|
111
110
|
licenseSetup() {
|
|
112
111
|
return jsonResult(licenseSetupGuide());
|
|
113
112
|
},
|
|
114
|
-
async accountStatus(input = {}) {
|
|
115
|
-
const client = new PortalClient({ token: input.token });
|
|
116
|
-
const [me, entitlements, subscriptions] = await Promise.all([
|
|
117
|
-
client.request("/portal/me"),
|
|
118
|
-
client.request("/portal/entitlements"),
|
|
119
|
-
client.request("/portal/subscriptions"),
|
|
120
|
-
]);
|
|
121
|
-
return jsonResult({
|
|
122
|
-
me,
|
|
123
|
-
entitlements,
|
|
124
|
-
subscriptions,
|
|
125
|
-
});
|
|
126
|
-
},
|
|
127
|
-
async listApps(input = {}) {
|
|
128
|
-
const client = new PortalClient({ token: input.token });
|
|
129
|
-
return jsonResult(await client.request("/portal/apps"));
|
|
130
|
-
},
|
|
131
|
-
async createApp(input) {
|
|
132
|
-
const client = new PortalClient({ token: input.token });
|
|
133
|
-
return jsonResult(await client.request("/portal/apps", {
|
|
134
|
-
body: {
|
|
135
|
-
allowedDomains: input.allowedDomains ?? [],
|
|
136
|
-
name: input.name,
|
|
137
|
-
},
|
|
138
|
-
method: "POST",
|
|
139
|
-
}));
|
|
140
|
-
},
|
|
141
|
-
async listLicenseKeys(input) {
|
|
142
|
-
const client = new PortalClient({ token: input.token });
|
|
143
|
-
return jsonResult(await client.request(`/portal/apps/${encodeURIComponent(input.appId)}/keys`));
|
|
144
|
-
},
|
|
145
|
-
async createLicenseKey(input) {
|
|
146
|
-
const client = new PortalClient({ token: input.token });
|
|
147
|
-
return jsonResult(await client.request(`/portal/apps/${encodeURIComponent(input.appId)}/keys`, {
|
|
148
|
-
body: {
|
|
149
|
-
label: input.label,
|
|
150
|
-
},
|
|
151
|
-
method: "POST",
|
|
152
|
-
}));
|
|
153
|
-
},
|
|
154
113
|
};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ace-grid/mcp",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"description": "Model Context Protocol server for Ace Grid docs, API metadata, config validation, migration help, and
|
|
3
|
+
"version": "1.0.7",
|
|
4
|
+
"description": "Model Context Protocol server for Ace Grid docs, API metadata, config validation, migration help, and framework examples.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"ace-grid-mcp": "./dist/index.js"
|
|
@@ -13,7 +13,8 @@
|
|
|
13
13
|
"LICENSE"
|
|
14
14
|
],
|
|
15
15
|
"scripts": {
|
|
16
|
-
"build": "tsc -p tsconfig.json",
|
|
16
|
+
"build": "npm run clean && tsc -p tsconfig.json",
|
|
17
|
+
"clean": "node scripts/clean-dist.mjs",
|
|
17
18
|
"demo": "tsx src/demoServer.ts",
|
|
18
19
|
"dev": "tsx src/index.ts",
|
|
19
20
|
"prepack": "npm run build",
|
package/dist/portalApi.d.ts
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
export type PortalClientOptions = {
|
|
2
|
-
apiBaseUrl?: string;
|
|
3
|
-
token?: string;
|
|
4
|
-
};
|
|
5
|
-
export type PortalRequestOptions = {
|
|
6
|
-
body?: unknown;
|
|
7
|
-
method?: "GET" | "POST" | "PATCH" | "DELETE";
|
|
8
|
-
};
|
|
9
|
-
export declare class PortalAuthError extends Error {
|
|
10
|
-
constructor();
|
|
11
|
-
}
|
|
12
|
-
export declare class PortalClient {
|
|
13
|
-
private readonly apiBaseUrl;
|
|
14
|
-
private readonly token?;
|
|
15
|
-
constructor(options?: PortalClientOptions);
|
|
16
|
-
request<T>(path: string, options?: PortalRequestOptions): Promise<T>;
|
|
17
|
-
}
|
|
18
|
-
//# sourceMappingURL=portalApi.d.ts.map
|
package/dist/portalApi.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"portalApi.d.ts","sourceRoot":"","sources":["../src/portalApi.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,GAAG;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;CAC9C,CAAC;AAEF,qBAAa,eAAgB,SAAQ,KAAK;;CAIzC;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAS;gBAEpB,OAAO,GAAE,mBAAwB;IAKvC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,CAAC,CAAC;CAyB/E"}
|
package/dist/portalApi.js
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
export class PortalAuthError extends Error {
|
|
2
|
-
constructor() {
|
|
3
|
-
super("Set ACE_GRID_PORTAL_TOKEN to use authenticated Ace Grid account tools.");
|
|
4
|
-
}
|
|
5
|
-
}
|
|
6
|
-
export class PortalClient {
|
|
7
|
-
apiBaseUrl;
|
|
8
|
-
token;
|
|
9
|
-
constructor(options = {}) {
|
|
10
|
-
this.apiBaseUrl = options.apiBaseUrl ?? process.env.ACE_GRID_API_BASE_URL ?? "https://api.ace-grid.com";
|
|
11
|
-
this.token = options.token ?? process.env.ACE_GRID_PORTAL_TOKEN;
|
|
12
|
-
}
|
|
13
|
-
async request(path, options = {}) {
|
|
14
|
-
if (!this.token) {
|
|
15
|
-
throw new PortalAuthError();
|
|
16
|
-
}
|
|
17
|
-
const response = await fetch(`${this.apiBaseUrl}${path}`, {
|
|
18
|
-
body: options.body ? JSON.stringify(options.body) : undefined,
|
|
19
|
-
headers: {
|
|
20
|
-
authorization: `Bearer ${this.token}`,
|
|
21
|
-
...(options.body ? { "content-type": "application/json" } : {}),
|
|
22
|
-
},
|
|
23
|
-
method: options.method ?? "GET",
|
|
24
|
-
});
|
|
25
|
-
const body = await response.json().catch(() => ({}));
|
|
26
|
-
if (!response.ok) {
|
|
27
|
-
const message = typeof body === "object" && body && "message" in body
|
|
28
|
-
? String(body.message)
|
|
29
|
-
: "Ace Grid portal API request failed.";
|
|
30
|
-
throw new Error(message);
|
|
31
|
-
}
|
|
32
|
-
return body;
|
|
33
|
-
}
|
|
34
|
-
}
|