@oneentry/mcp-platform-server 0.1.3 → 0.1.5
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/dist/api/audit.d.ts.map +1 -0
- package/dist/api/audit.js.map +1 -0
- package/dist/api/auth.d.ts.map +1 -0
- package/dist/api/auth.js.map +1 -0
- package/dist/api/build-catalog.d.ts +1 -0
- package/dist/api/build-catalog.js +133 -20
- package/dist/api/catalog.d.ts +6 -1
- package/dist/api/catalog.d.ts.map +1 -0
- package/dist/api/catalog.js +53 -17
- package/dist/api/catalog.js.map +1 -0
- package/dist/api/client.d.ts +1 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +9 -0
- package/dist/api/client.js.map +1 -0
- package/dist/api/normalize-schema.js +6 -1
- package/dist/api/operation-notes.d.ts +10 -0
- package/dist/api/operation-notes.js +146 -0
- package/dist/api/policy.d.ts.map +1 -0
- package/dist/api/policy.js.map +1 -0
- package/dist/api/shape.d.ts.map +1 -0
- package/dist/api/shape.js.map +1 -0
- package/dist/api/swagger-source.d.ts +13 -1
- package/dist/api/swagger-source.js +93 -32
- package/dist/api/types.d.ts +16 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js.map +1 -0
- package/dist/bin/cli.d.ts.map +1 -0
- package/dist/bin/cli.js.map +1 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -0
- package/dist/knowledge/chunk.d.ts.map +1 -0
- package/dist/knowledge/chunk.js.map +1 -0
- package/dist/knowledge/loader.d.ts.map +1 -0
- package/dist/knowledge/loader.js.map +1 -0
- package/dist/knowledge/ru-en-terms.d.ts +1 -0
- package/dist/knowledge/ru-en-terms.js +67 -0
- package/dist/knowledge/search.d.ts.map +1 -0
- package/dist/knowledge/search.js +2 -1
- package/dist/knowledge/search.js.map +1 -0
- package/dist/knowledge/types.d.ts.map +1 -0
- package/dist/knowledge/types.js.map +1 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +19 -1
- package/dist/server.js.map +1 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js.map +1 -0
- package/dist/tools/api-call.d.ts.map +1 -0
- package/dist/tools/api-call.js +14 -1
- package/dist/tools/api-call.js.map +1 -0
- package/dist/tools/api-discovery.d.ts.map +1 -0
- package/dist/tools/api-discovery.js +109 -13
- package/dist/tools/api-discovery.js.map +1 -0
- package/dist/tools/docs.d.ts.map +1 -0
- package/dist/tools/docs.js +4 -1
- package/dist/tools/docs.js.map +1 -0
- package/dist/tools/guide.d.ts.map +1 -0
- package/dist/tools/guide.js +14 -2
- package/dist/tools/guide.js.map +1 -0
- package/dist/tools/result.d.ts.map +1 -0
- package/dist/tools/result.js.map +1 -0
- package/dist/tools/whoami.d.ts.map +1 -0
- package/dist/tools/whoami.js +5 -0
- package/dist/tools/whoami.js.map +1 -0
- package/dist/transports/http.d.ts.map +1 -0
- package/dist/transports/http.js +1 -1
- package/dist/transports/http.js.map +1 -0
- package/dist/transports/stdio.d.ts.map +1 -0
- package/dist/transports/stdio.js.map +1 -0
- package/knowledge/operating-rules.md +50 -41
- package/package.json +2 -1
|
@@ -1,5 +1,56 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import { unsupportedBodyFormat } from '../api/client.js';
|
|
2
3
|
import { errorResult, jsonResult } from './result.js';
|
|
4
|
+
const sampleValue = (schema, example) => {
|
|
5
|
+
if (example !== undefined) {
|
|
6
|
+
return example;
|
|
7
|
+
}
|
|
8
|
+
if (schema.example !== undefined) {
|
|
9
|
+
return schema.example;
|
|
10
|
+
}
|
|
11
|
+
if (schema.enum && schema.enum.length > 0) {
|
|
12
|
+
return schema.enum[0];
|
|
13
|
+
}
|
|
14
|
+
switch (schema.type) {
|
|
15
|
+
case 'number':
|
|
16
|
+
case 'integer':
|
|
17
|
+
return 0;
|
|
18
|
+
case 'boolean':
|
|
19
|
+
return false;
|
|
20
|
+
case 'array':
|
|
21
|
+
return [];
|
|
22
|
+
case 'object':
|
|
23
|
+
return {};
|
|
24
|
+
default:
|
|
25
|
+
return `<${schema['x-source-type'] ?? schema.type ?? 'value'}>`;
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
const isWorthShowing = (param) => param.required ||
|
|
29
|
+
param.example !== undefined ||
|
|
30
|
+
param.schema.example !== undefined ||
|
|
31
|
+
param.schema.default !== undefined;
|
|
32
|
+
const argsFor = (params, location, filter) => {
|
|
33
|
+
const out = {};
|
|
34
|
+
for (const param of params) {
|
|
35
|
+
if (param.location !== location || !filter(param)) {
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
out[param.name] = sampleValue(param.schema, param.example);
|
|
39
|
+
}
|
|
40
|
+
return out;
|
|
41
|
+
};
|
|
42
|
+
const callExample = (operation) => {
|
|
43
|
+
const path = argsFor(operation.params, 'path', () => true);
|
|
44
|
+
const query = argsFor(operation.params, 'query', isWorthShowing);
|
|
45
|
+
return {
|
|
46
|
+
opId: operation.opId,
|
|
47
|
+
...(Object.keys(path).length > 0 ? { path } : {}),
|
|
48
|
+
...(Object.keys(query).length > 0 ? { query } : {}),
|
|
49
|
+
...(operation.body?.schema.example !== undefined
|
|
50
|
+
? { body: operation.body.schema.example }
|
|
51
|
+
: {}),
|
|
52
|
+
};
|
|
53
|
+
};
|
|
3
54
|
export const registerApiDiscovery = (server, deps) => {
|
|
4
55
|
const { catalog } = deps;
|
|
5
56
|
server.registerTool('cms_api_search', {
|
|
@@ -22,10 +73,16 @@ export const registerApiDiscovery = (server, deps) => {
|
|
|
22
73
|
...(limit ? { limit } : {}),
|
|
23
74
|
});
|
|
24
75
|
if (hits.length === 0) {
|
|
76
|
+
const unexposed = catalog.unexposedMatches(query);
|
|
25
77
|
return jsonResult({
|
|
26
78
|
hits: [],
|
|
27
79
|
tags: [...new Set(catalog.operations().map((o) => o.tag))].sort(),
|
|
28
|
-
|
|
80
|
+
...(unexposed.length > 0 ? { knownButNotExposed: unexposed } : {}),
|
|
81
|
+
hint: unexposed.length > 0
|
|
82
|
+
? 'Nothing matched in this catalog, but the platform does know the names under ' +
|
|
83
|
+
'"knownButNotExposed" — this instance simply does not serve them, so no path ' +
|
|
84
|
+
'you construct will reach them. Do not guess URLs: report them as unavailable here.'
|
|
85
|
+
: 'Nothing matched. Try a bare entity name, or filter by one of the tags listed here.',
|
|
29
86
|
});
|
|
30
87
|
}
|
|
31
88
|
return jsonResult({
|
|
@@ -35,7 +92,7 @@ export const registerApiDiscovery = (server, deps) => {
|
|
|
35
92
|
});
|
|
36
93
|
server.registerTool('cms_api_describe', {
|
|
37
94
|
title: 'Describe an Admin API operation',
|
|
38
|
-
description: 'Full detail for one operation: path and query parameters, request-body schema, required permission, risk level, and whether it is permanently confirm-gated. Fields marked "x-loose": true could not be converted to a JSON Schema type — trust their example, not their type.',
|
|
95
|
+
description: 'Full detail for one operation: a ready-to-copy "example" call, path and query parameters, request-body schema, required permission, risk level, and whether it is permanently confirm-gated. Fields marked "x-loose": true could not be converted to a JSON Schema type — trust their example, not their type. Where the operation is known to answer success without doing the work, "silentNoOp" and "verifyWith" say so and name the read that proves it.',
|
|
39
96
|
inputSchema: {
|
|
40
97
|
opId: z.string().min(1).describe('Operation id from cms_api_search, e.g. "AdminPagesController_findAllRoot".'),
|
|
41
98
|
},
|
|
@@ -43,18 +100,28 @@ export const registerApiDiscovery = (server, deps) => {
|
|
|
43
100
|
}, ({ opId }) => {
|
|
44
101
|
const operation = catalog.get(opId);
|
|
45
102
|
if (!operation) {
|
|
103
|
+
const unexposed = catalog.unexposedMatches(opId);
|
|
46
104
|
return errorResult(`Unknown opId "${opId}".`, {
|
|
47
105
|
didYouMean: catalog.suggest(opId),
|
|
48
|
-
|
|
106
|
+
...(unexposed.length > 0 ? { knownButNotExposed: unexposed } : {}),
|
|
107
|
+
hint: unexposed.length > 0
|
|
108
|
+
? 'The platform knows this name, but this instance does not serve the operation, ' +
|
|
109
|
+
'so it cannot be called from here by any path. Report it as unavailable.'
|
|
110
|
+
: 'Operation ids come from cms_api_search — do not construct them by hand.',
|
|
49
111
|
});
|
|
50
112
|
}
|
|
51
|
-
const
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
: [])
|
|
57
|
-
|
|
113
|
+
const formatDenial = unsupportedBodyFormat(operation);
|
|
114
|
+
const properties = operation.body?.schema.properties;
|
|
115
|
+
const loose = properties
|
|
116
|
+
? Object.entries(properties)
|
|
117
|
+
.filter(([, schema]) => schema['x-loose'] === true)
|
|
118
|
+
.map(([name, schema]) => ({ field: name, sourceType: schema['x-source-type'] }))
|
|
119
|
+
: [];
|
|
120
|
+
const mismatched = properties
|
|
121
|
+
? Object.entries(properties)
|
|
122
|
+
.filter(([, schema]) => schema['x-example-mismatch'] !== undefined)
|
|
123
|
+
.map(([name, schema]) => ({ field: name, problem: schema['x-example-mismatch'] }))
|
|
124
|
+
: [];
|
|
58
125
|
return jsonResult({
|
|
59
126
|
opId: operation.opId,
|
|
60
127
|
method: operation.method.toUpperCase(),
|
|
@@ -66,12 +133,41 @@ export const registerApiDiscovery = (server, deps) => {
|
|
|
66
133
|
risk: operation.risk,
|
|
67
134
|
alwaysConfirm: operation.alwaysConfirm,
|
|
68
135
|
params: operation.params,
|
|
136
|
+
paramsByLocation: {
|
|
137
|
+
path: operation.params.filter((p) => p.location === 'path').map((p) => p.name),
|
|
138
|
+
query: operation.params.filter((p) => p.location === 'query').map((p) => p.name),
|
|
139
|
+
},
|
|
69
140
|
body: operation.body ?? null,
|
|
141
|
+
example: callExample(operation),
|
|
70
142
|
looseFields: loose,
|
|
143
|
+
...(mismatched.length > 0
|
|
144
|
+
? {
|
|
145
|
+
exampleMismatches: mismatched,
|
|
146
|
+
exampleMismatchHint: 'These fields declare one type and give an example of another. The example is ' +
|
|
147
|
+
'the contract — the instance accepts what the example shows.',
|
|
148
|
+
}
|
|
149
|
+
: {}),
|
|
150
|
+
...(operation.note ? { note: operation.note } : {}),
|
|
151
|
+
...(operation.silentNoOp ? { silentNoOp: operation.silentNoOp } : {}),
|
|
152
|
+
...(operation.verifyWith ? { verifyWith: operation.verifyWith } : {}),
|
|
153
|
+
...(operation.body?.schema['x-unresolved'] === true
|
|
154
|
+
? {
|
|
155
|
+
bodySchemaUnresolved: 'The document does not resolve this body schema, so the empty "properties" ' +
|
|
156
|
+
'above means "unknown", not "no fields". Build the body from "example"; ' +
|
|
157
|
+
'if there is none, ask the human rather than guessing.',
|
|
158
|
+
}
|
|
159
|
+
: {}),
|
|
160
|
+
...(formatDenial ? { notExecutable: formatDenial } : {}),
|
|
71
161
|
responseSummary: operation.responseSummary ?? null,
|
|
72
|
-
next:
|
|
73
|
-
? '
|
|
74
|
-
:
|
|
162
|
+
next: formatDenial
|
|
163
|
+
? 'Do not call this operation — report it as unavailable through MCP.'
|
|
164
|
+
: operation.risk === 'read'
|
|
165
|
+
? 'Call it with cms_api_call, copying the "example" above.'
|
|
166
|
+
: operation.verifyWith
|
|
167
|
+
? 'Search the knowledge base with cms_docs_search for this entity, call cms_api_call ' +
|
|
168
|
+
`with dryRun: true first, and afterwards read the result back with ` +
|
|
169
|
+
`${operation.verifyWith.opId} — a success status is not evidence here.`
|
|
170
|
+
: 'Search the knowledge base with cms_docs_search for this entity, then call cms_api_call with dryRun: true first.',
|
|
75
171
|
});
|
|
76
172
|
});
|
|
77
173
|
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-discovery.js","sourceRoot":"","sources":["../../src/tools/api-discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docs.d.ts","sourceRoot":"","sources":["../../src/tools/docs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAMhD,wDAAwD;AACxD,eAAO,MAAM,YAAY,GAAI,QAAQ,SAAS,EAAE,MAAM,UAAU,KAAG,IA0IlE,CAAC"}
|
package/dist/tools/docs.js
CHANGED
|
@@ -16,7 +16,10 @@ export const registerDocs = (server, deps) => {
|
|
|
16
16
|
if (hits.length === 0) {
|
|
17
17
|
return jsonResult({
|
|
18
18
|
hits: [],
|
|
19
|
-
hint: 'Nothing matched.
|
|
19
|
+
hint: 'Nothing matched. The knowledge base is written in English — ask in English, even ' +
|
|
20
|
+
'when the conversation is not. Try a module name (menus, orders, blocks, ' +
|
|
21
|
+
'attributes) or an entity field name. An empty result means this query found ' +
|
|
22
|
+
'nothing, not that the CMS has no documentation for it.',
|
|
20
23
|
});
|
|
21
24
|
}
|
|
22
25
|
return jsonResult({
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docs.js","sourceRoot":"","sources":["../../src/tools/docs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guide.d.ts","sourceRoot":"","sources":["../../src/tools/guide.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAMhD;;;;GAIG;AACH,eAAO,MAAM,WAAW,GAAI,MAAM,UAAU,KAAG,MAoD9C,CAAC;AAEF,gCAAgC;AAChC,eAAO,MAAM,aAAa,GAAI,QAAQ,SAAS,EAAE,MAAM,UAAU,KAAG,IAWnE,CAAC"}
|
package/dist/tools/guide.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ALWAYS_CONFIRM_PREFIXES } from '../api/operation-notes.js';
|
|
1
2
|
import { textResult } from './result.js';
|
|
2
3
|
const TAG_LIMIT = 24;
|
|
3
4
|
export const renderGuide = (deps) => {
|
|
@@ -50,8 +51,19 @@ export const renderGuide = (deps) => {
|
|
|
50
51
|
'## Hard limits',
|
|
51
52
|
'',
|
|
52
53
|
'- Admin API only. The Content and Developer APIs are deliberately not exposed.',
|
|
53
|
-
|
|
54
|
-
'
|
|
54
|
+
`- Mutations under ${ALWAYS_CONFIRM_PREFIXES.map((p) => `\`${p}\``).join(', ')} are`,
|
|
55
|
+
' permanently confirm-gated, at every allow level.',
|
|
56
|
+
'- **Request bodies are sent as JSON only.** An operation that declares another format —',
|
|
57
|
+
' file upload is `multipart/form-data` — cannot be called through this server at all.',
|
|
58
|
+
' `cms_api_describe` marks it `notExecutable`; no body shape will help. Upload files',
|
|
59
|
+
' outside MCP and read `mcp/docs/api/files-and-uploads` first, because doing so gives up',
|
|
60
|
+
' the confirmations, permission checks and `dryRun` this server provides.',
|
|
61
|
+
'- **The knowledge base is written in English.** Search it in English whatever language the',
|
|
62
|
+
' conversation is in; an empty result is a failed query, not a missing document.',
|
|
63
|
+
'- A success status is not evidence that the write landed. Where an operation is known to',
|
|
64
|
+
' answer success without doing the work, `cms_api_describe` says so under `silentNoOp` and',
|
|
65
|
+
' names the read that proves it under `verifyWith`. Verify with the read the *consumer*',
|
|
66
|
+
' uses, not the one you wrote to.',
|
|
55
67
|
'- Responses are capped; overflow is reported as `_truncated`. Narrow the query instead.',
|
|
56
68
|
...(catalog.catalog.warnings.length > 0
|
|
57
69
|
? ['', '## Warnings', '', ...catalog.catalog.warnings.map((w) => `- ${w}`)]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guide.js","sourceRoot":"","sources":["../../src/tools/guide.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../../src/tools/result.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,+BAA+B;AAC/B,eAAO,MAAM,UAAU,GAAI,SAAS,OAAO,KAAG,UAE5C,CAAC;AAEH,kEAAkE;AAClE,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,KAAG,UAExC,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,WAAW,GAAI,SAAS,MAAM,EAAE,QAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,UAK7E,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result.js","sourceRoot":"","sources":["../../src/tools/result.ts"],"names":[],"mappings":"AAOA,+BAA+B;AAC/B,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,OAAgB,EAAc,EAAE,CAAC,CAAC;IAC3D,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;CACpE,CAAC,CAAC;AAEH,kEAAkE;AAClE,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAY,EAAc,EAAE,CAAC,CAAC;IACvD,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;CAClC,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,OAAe,EAAE,KAA+B,EAAc,EAAE,CAAC,CAAC;IAC5F,OAAO,EAAE;QACP,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;KACtF;IACD,OAAO,EAAE,IAAI;CACd,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../src/tools/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAG7C,4EAA4E;AAC5E,eAAO,MAAM,cAAc,GAAI,QAAQ,SAAS,EAAE,YAAY,MAAM,OAAO,KAAG,IA4C7E,CAAC"}
|
package/dist/tools/whoami.js
CHANGED
|
@@ -26,6 +26,11 @@ export const registerWhoami = (server, getSession) => {
|
|
|
26
26
|
swaggerHash: catalog.catalog.swaggerHash,
|
|
27
27
|
builtAt: catalog.catalog.builtAt,
|
|
28
28
|
knownPermissions: catalog.catalog.permissions.length,
|
|
29
|
+
coverage: {
|
|
30
|
+
unexposedOperations: catalog.catalog.coverage.unexposedOpIds.length,
|
|
31
|
+
permissionsWithoutOperation: catalog.catalog.coverage.permissionsWithoutOperation.length,
|
|
32
|
+
hint: 'This catalog is what the instance serves, not everything the platform has. When cms_api_search finds nothing, it reports whether the name exists but is unexposed — trust that over constructing a path.',
|
|
33
|
+
},
|
|
29
34
|
warnings: catalog.catalog.warnings,
|
|
30
35
|
},
|
|
31
36
|
knowledge: {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/tools/whoami.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,4EAA4E;AAC5E,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAAiB,EAAE,UAAyB,EAAQ,EAAE;IACnF,MAAM,CAAC,YAAY,CACjB,YAAY,EACZ;QACE,KAAK,EAAE,UAAU;QACjB,WAAW,EACT,0JAA0J;QAC5J,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;KACzD,EACD,KAAK,IAAI,EAAE;QACT,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;QAC7B,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;QACtD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC;QAE1C,OAAO,UAAU,CAAC;YAChB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,aAAa,EAAE,QAAQ,KAAK,SAAS;YACrC,GAAG,CAAC,QAAQ;gBACV,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,eAAe,EAAE,QAAQ,CAAC,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE,EAAE;gBACjH,CAAC,CAAC;oBACE,KAAK,EAAE,IAAI;oBACX,IAAI,EAAE,OAAO,CAAC,YAAY;wBACxB,CAAC,CAAC,0IAA0I;wBAC5I,CAAC,CAAC,oGAAoG;iBACzG,CAAC;YACN,OAAO,EAAE;gBACP,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,MAAM;gBACvC,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,WAAW;gBACxC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,OAAO;gBAChC,gBAAgB,EAAE,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM;gBACpD,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ;aACnC;YACD,SAAS,EAAE;gBACT,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC,MAAM;gBAC7B,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,OAAO;gBAC/B,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC,MAAM;gBAC7B,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM;aACvC;YACD,KAAK,EAAE,MAAM,CAAC,SAAS,IAAI,IAAI;SAChC,CAAC,CAAC;IACL,CAAC,CACF,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/transports/http.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AA6DlD;;;;GAIG;AACH,eAAO,MAAM,OAAO,GAAU,QAAQ,MAAM,KAAG,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAiFpF,CAAC"}
|
package/dist/transports/http.js
CHANGED
|
@@ -45,7 +45,7 @@ const fillCatalog = async (deps, session) => {
|
|
|
45
45
|
}
|
|
46
46
|
try {
|
|
47
47
|
const bearer = await session.accessToken();
|
|
48
|
-
const rebuilt = await OperationCatalog.resolve(deps.config, bearer);
|
|
48
|
+
const rebuilt = await OperationCatalog.resolve(deps.config, { bearer });
|
|
49
49
|
if (!rebuilt.isEmpty) {
|
|
50
50
|
deps.catalog.adopt(rebuilt);
|
|
51
51
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/transports/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdio.d.ts","sourceRoot":"","sources":["../../src/transports/stdio.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAGlD;;;;GAIG;AACH,eAAO,MAAM,QAAQ,GAAU,QAAQ,MAAM,KAAG,OAAO,CAAC,IAAI,CAK3D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdio.js","sourceRoot":"","sources":["../../src/transports/stdio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAE9D,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC;;;;GAIG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAAE,MAAc,EAAiB,EAAE;IAC9D,MAAM,IAAI,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC;IACjD,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAC;AACnD,CAAC,CAAC"}
|
|
@@ -1,25 +1,23 @@
|
|
|
1
1
|
# Operating rules for the OneEntry Admin API
|
|
2
2
|
|
|
3
|
-
Read this before your first write. Every rule here has broken a real payload
|
|
4
|
-
|
|
5
|
-
These rules are short on purpose. When one of them applies to what you are about to do, follow the pointer before you build the body.
|
|
3
|
+
Read this before your first write. Every rule here has broken a real payload; each links to the document explaining it in full. When one applies to what you are about to do, follow the pointer before you build the body.
|
|
6
4
|
|
|
7
5
|
→ `mcp/docs/server/doc-map` · `mcp/docs/server/payload-conventions`
|
|
8
6
|
|
|
9
7
|
## The loop you must follow
|
|
10
8
|
|
|
11
9
|
1. `cms_guide` once, at the start.
|
|
12
|
-
2. `cms_docs_search` for the entity you are about to touch — **before**
|
|
13
|
-
3. `cms_api_search`
|
|
10
|
+
2. `cms_docs_search` for the entity you are about to touch — **before** the payload, not after a 400.
|
|
11
|
+
3. `cms_api_search` for the operation, then `cms_api_describe` for its shape.
|
|
14
12
|
4. `cms_api_call` with `dryRun: true` for anything that mutates, then again with the confirm token if one was issued.
|
|
15
13
|
|
|
16
|
-
Never invent a path, an operation id or a body key. `cms_api_search` is the only authority on what exists
|
|
14
|
+
Never invent a path, an operation id or a body key. `cms_api_search` is the only authority on what exists.
|
|
17
15
|
|
|
18
16
|
## Trust the example not the type
|
|
19
17
|
|
|
20
|
-
The
|
|
18
|
+
The API document carries field types that are not JSON Schema types. `cms_api_describe` normalises what it can and marks the rest `"x-loose": true`.
|
|
21
19
|
|
|
22
|
-
For
|
|
20
|
+
For those, **the `example` is the contract** — copy its shape. Validation here is advisory; the instance is the real validator, so a call is never blocked over a field we could not check. A field flagged `x-example-mismatch` contradicts its own type, and the example wins there too.
|
|
23
21
|
|
|
24
22
|
→ `mcp/docs/server/cms-api-describe#loose-fields`
|
|
25
23
|
|
|
@@ -31,7 +29,7 @@ Titles and descriptive content live under `localizeInfos`, keyed by locale code:
|
|
|
31
29
|
{ "localizeInfos": { "en_US": { "title": "Summer sale" } } }
|
|
32
30
|
```
|
|
33
31
|
|
|
34
|
-
Required
|
|
32
|
+
Required on a product, effectively required on a page. Do not hardcode `en_US`: read the active locales with `AdminLocalesController_findAllActive` and write every one the content is meant to appear in.
|
|
35
33
|
|
|
36
34
|
→ `mcp/docs/api/locales`
|
|
37
35
|
|
|
@@ -43,79 +41,90 @@ Required when creating a product, and effectively required on pages. Do not hard
|
|
|
43
41
|
{ "attributesSets": { "en_US": { "string_id42": "SKU-1" } } }
|
|
44
42
|
```
|
|
45
43
|
|
|
46
|
-
The inner key is `<attribute type>_id<attribute id>`,
|
|
47
|
-
|
|
48
|
-
A flat single-level map is accepted and stored empty. The call answers 201 and the attributes are silently missing, so always read the entity back by id after creating it.
|
|
44
|
+
The inner key is `<attribute type>_id<attribute id>`, read from the entity's attribute set. A flat one-level map is accepted, answers 201 and stores nothing — so read the entity back by id after creating it.
|
|
49
45
|
|
|
50
46
|
→ `mcp/docs/api/attribute-sets`
|
|
51
47
|
|
|
52
48
|
## Positions are lexorank or numeric depending on the endpoint
|
|
53
49
|
|
|
54
|
-
Ordering is a lexorank **string** on parent-scoped Admin operations
|
|
50
|
+
Ordering is a lexorank **string** on parent-scoped Admin operations and a **number** on flat lists and the Content API. Never sort a lexorank numerically, and never reorder by patching the field — use that entity's position operation.
|
|
55
51
|
|
|
56
52
|
→ `mcp/docs/server/payload-conventions#position-is-a-lexorank-string-or-a-number`
|
|
57
53
|
|
|
58
54
|
## A read straight after a write can lag
|
|
59
55
|
|
|
60
|
-
Reading an entity **by id** shows your write immediately.
|
|
56
|
+
Reading an entity **by id** shows your write immediately. Lists and searches may not, for a few seconds.
|
|
61
57
|
|
|
62
|
-
If a list does not
|
|
58
|
+
If a list does not show what you just created, re-read by id. **Never repeat the write** — you get a duplicate that consumes quota and has to be cleaned up by hand. And never swallow a failed read into an empty result: "empty" and "malformed" then look alike, and the next run recreates everything.
|
|
63
59
|
|
|
64
|
-
##
|
|
60
|
+
## A 200 means accepted not applied
|
|
61
|
+
|
|
62
|
+
Several endpoints take the body as one opaque value, so a wrong **shape** is stored as happily as a right one and the answer is still `200`.
|
|
63
|
+
|
|
64
|
+
Confirm a write by its effect, and **through the read its consumer uses**. The raw record echoes your input back, wrong shape included, while the projection a site receives shows nothing — verifying through the endpoint you wrote to proves little.
|
|
65
|
+
|
|
66
|
+
→ `mcp/docs/api/silent-no-ops`
|
|
67
|
+
|
|
68
|
+
## An omitted field can mean clear it
|
|
69
|
+
|
|
70
|
+
Most updates merge. A few apply an omitted field as **"set it to nothing"**, and still answer `200`: a page without `parentId` moves to the root, a block without `blockPages` detaches from every page, a menu item without its parent reference flattens, a user without `formData` loses it.
|
|
71
|
+
|
|
72
|
+
Products, `generalTypeId` and `attributeSetId` merge, so "PUT always replaces" is the wrong lesson. Read, change what you meant to, send it back whole — then check the fields that were **not** in your body.
|
|
65
73
|
|
|
66
|
-
|
|
74
|
+
→ `mcp/docs/server/payload-conventions#an-omitted-field-can-mean-clear-it`
|
|
67
75
|
|
|
68
|
-
|
|
76
|
+
## Prefer marker over id
|
|
77
|
+
|
|
78
|
+
Blocks, forms, menus, templates, general types and modules are addressed by a `marker` or `identifier` stable across instances. A numeric `id` is not, and a `404` on an id you were given is usually that. Where an operation accepts either, use the marker.
|
|
69
79
|
|
|
70
80
|
## Baseline data already exists do not recreate it
|
|
71
81
|
|
|
72
|
-
Every instance arrives populated:
|
|
82
|
+
Every instance arrives populated: user groups, modules, general types, attribute set and field types, locales, block types with their default templates, the singleton settings.
|
|
83
|
+
|
|
84
|
+
**List first, create second.** Some duplicates fail loudly, which is harmless. The dangerous ones — user groups, modules, attribute set types, settings — **succeed silently**.
|
|
73
85
|
|
|
74
|
-
|
|
86
|
+
Two lists are the exception and start **empty**: product statuses and template previews. Nothing seeds them, nothing reports their absence, and without them no product is sellable and no upload gets a preview. There, create.
|
|
75
87
|
|
|
76
88
|
→ `mcp/docs/api/baseline-data`
|
|
77
89
|
|
|
78
90
|
## Never touch these without a human saying so
|
|
79
91
|
|
|
80
|
-
Mutations
|
|
92
|
+
Mutations on the instance's own configuration — admins, modules, backups, settings — are permanently confirm-gated at every allow level. `cms_guide` prints the exact list.
|
|
81
93
|
|
|
82
|
-
The gate is not a suggestion. State what you intend to change, show the human the
|
|
94
|
+
The gate is not a suggestion. State what you intend to change, show the human the dry run's `target`, and wait for a yes here.
|
|
83
95
|
|
|
84
96
|
→ `mcp/docs/server/allow-levels#paths-that-are-always-confirm-gated`
|
|
85
97
|
|
|
86
98
|
## Permissions are checked before the request is sent
|
|
87
99
|
|
|
88
|
-
Each operation declares the permission it
|
|
89
|
-
|
|
90
|
-
A permission refusal means **ask for the grant** and stop. Retrying cannot succeed, and neither can a different operation that needs the same permission.
|
|
100
|
+
Each operation declares the permission it needs, and this server refuses locally when the admin does not hold it. Nothing is sent, so nothing changed. A refusal means **ask for the grant** and stop — no retry and no sibling operation gets past it.
|
|
91
101
|
|
|
92
102
|
→ `mcp/docs/api/admins-and-permissions`
|
|
93
103
|
|
|
94
104
|
## Truncated responses are deliberate
|
|
95
105
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
Do not retry hoping for more. Narrow the request with the operation's own `limit`, `offset` and filter parameters.
|
|
106
|
+
A large response comes back with a `_truncated` envelope reporting what was shown and what the total was. That is this server capping what it hands you, not the API. Do not retry hoping for more — narrow the request with the operation's own `limit`, `offset` and filters.
|
|
99
107
|
|
|
100
108
|
→ `mcp/docs/server/response-shaping`
|
|
101
109
|
|
|
102
110
|
## Operations with a single supported path
|
|
103
111
|
|
|
104
|
-
|
|
112
|
+
One route works and the obvious alternative does not. Use it directly.
|
|
105
113
|
|
|
106
|
-
- **Create a form** —
|
|
107
|
-
- **
|
|
108
|
-
- **
|
|
109
|
-
- **
|
|
110
|
-
- **
|
|
114
|
+
- **Create a form** — wrap in `newForm`, with `type` (`data` for a contact form) though the schema omits it.
|
|
115
|
+
- **Replace an attribute set schema** — send the schema object itself. Wrapped as `{ "schema": … }` it answers 200 and destroys it.
|
|
116
|
+
- **Update a product** — include `blocks` (`[]` if nothing to set), never `forms`.
|
|
117
|
+
- **Create a menu** — with `pagesIds: []`, attaching pages later. Non-empty on create answers 500.
|
|
118
|
+
- **Set a product status** — `statusId` in the product update. Bulk `set-status` takes it in a field named `id`, and given `statusId` it nulls the status and answers `201 true`.
|
|
111
119
|
|
|
112
|
-
|
|
120
|
+
## List products and other calls whose input is split
|
|
113
121
|
|
|
114
|
-
|
|
122
|
+
`POST /products/all` is the only way to list products, and its input is split: **paging and `langCode` go in the query, the body is an array of filters** — `[]` for none. Sent in the body they are ignored, and the 400 blames `langCode` for a value you never sent.
|
|
123
|
+
|
|
124
|
+
Copy `example` from `cms_api_describe` whole: separate `params` and `body` schemas do not assemble into an obvious call, and `example` is already one.
|
|
115
125
|
|
|
116
|
-
|
|
126
|
+
A 5xx outside these two lists means stop and report it, with the operation id and the request.
|
|
127
|
+
|
|
128
|
+
## Where to look next
|
|
117
129
|
|
|
118
|
-
|
|
119
|
-
- `mcp/docs/server/payload-conventions` — the rules above, in full
|
|
120
|
-
- `mcp/docs/api/baseline-data` — what already exists on your instance
|
|
121
|
-
- `mcp/docs/server/errors-and-refusals` — what a specific error means and what to do next
|
|
130
|
+
`mcp/docs/server/doc-map` lists every document with a reason to read it. The corpus is **English** — search it in English whatever language you answer in.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oneentry/mcp-platform-server",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.5",
|
|
4
4
|
"description": "MCP server that lets an AI agent operate the OneEntry Admin API, grounded in the project's own rules",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -50,6 +50,7 @@
|
|
|
50
50
|
"start": "node dist/bin/cli.js",
|
|
51
51
|
"dev": "tsx src/bin/cli.ts",
|
|
52
52
|
"sync:permissions": "tsx build/sync-permissions.ts",
|
|
53
|
+
"docs:audit": "tsx build/docs-audit.ts",
|
|
53
54
|
"publish:knowledge": "node -e \"console.error('REFUSED: the knowledge repository is hand-authored. Bulk-copying internal docs into it is prohibited.'); process.exit(1)\"",
|
|
54
55
|
"lint": "eslint \"{src,build,__tests__}/**/*.ts\"",
|
|
55
56
|
"test": "vitest run",
|