@oneentry/mcp-platform-server 0.1.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.
Files changed (100) hide show
  1. package/README.md +189 -0
  2. package/data/catalog.json +1 -0
  3. package/data/knowledge.json +1 -0
  4. package/dist/api/audit.d.ts +32 -0
  5. package/dist/api/audit.d.ts.map +1 -0
  6. package/dist/api/audit.js +35 -0
  7. package/dist/api/audit.js.map +1 -0
  8. package/dist/api/auth.d.ts +53 -0
  9. package/dist/api/auth.d.ts.map +1 -0
  10. package/dist/api/auth.js +126 -0
  11. package/dist/api/auth.js.map +1 -0
  12. package/dist/api/catalog.d.ts +39 -0
  13. package/dist/api/catalog.d.ts.map +1 -0
  14. package/dist/api/catalog.js +108 -0
  15. package/dist/api/catalog.js.map +1 -0
  16. package/dist/api/client.d.ts +60 -0
  17. package/dist/api/client.d.ts.map +1 -0
  18. package/dist/api/client.js +196 -0
  19. package/dist/api/client.js.map +1 -0
  20. package/dist/api/policy.d.ts +52 -0
  21. package/dist/api/policy.d.ts.map +1 -0
  22. package/dist/api/policy.js +0 -0
  23. package/dist/api/policy.js.map +1 -0
  24. package/dist/api/shape.d.ts +19 -0
  25. package/dist/api/shape.d.ts.map +1 -0
  26. package/dist/api/shape.js +151 -0
  27. package/dist/api/shape.js.map +1 -0
  28. package/dist/api/types.d.ts +85 -0
  29. package/dist/api/types.d.ts.map +1 -0
  30. package/dist/api/types.js +2 -0
  31. package/dist/api/types.js.map +1 -0
  32. package/dist/bin/cli.d.ts +3 -0
  33. package/dist/bin/cli.d.ts.map +1 -0
  34. package/dist/bin/cli.js +48 -0
  35. package/dist/bin/cli.js.map +1 -0
  36. package/dist/config/config.d.ts +108 -0
  37. package/dist/config/config.d.ts.map +1 -0
  38. package/dist/config/config.js +167 -0
  39. package/dist/config/config.js.map +1 -0
  40. package/dist/index.d.ts +23 -0
  41. package/dist/index.d.ts.map +1 -0
  42. package/dist/index.js +18 -0
  43. package/dist/index.js.map +1 -0
  44. package/dist/knowledge/chunk.d.ts +35 -0
  45. package/dist/knowledge/chunk.d.ts.map +1 -0
  46. package/dist/knowledge/chunk.js +87 -0
  47. package/dist/knowledge/chunk.js.map +1 -0
  48. package/dist/knowledge/loader.d.ts +27 -0
  49. package/dist/knowledge/loader.d.ts.map +1 -0
  50. package/dist/knowledge/loader.js +125 -0
  51. package/dist/knowledge/loader.js.map +1 -0
  52. package/dist/knowledge/search.d.ts +34 -0
  53. package/dist/knowledge/search.d.ts.map +1 -0
  54. package/dist/knowledge/search.js +95 -0
  55. package/dist/knowledge/search.js.map +1 -0
  56. package/dist/knowledge/types.d.ts +47 -0
  57. package/dist/knowledge/types.d.ts.map +1 -0
  58. package/dist/knowledge/types.js +2 -0
  59. package/dist/knowledge/types.js.map +1 -0
  60. package/dist/server.d.ts +16 -0
  61. package/dist/server.d.ts.map +1 -0
  62. package/dist/server.js +48 -0
  63. package/dist/server.js.map +1 -0
  64. package/dist/session.d.ts +43 -0
  65. package/dist/session.d.ts.map +1 -0
  66. package/dist/session.js +75 -0
  67. package/dist/session.js.map +1 -0
  68. package/dist/tools/api-call.d.ts +5 -0
  69. package/dist/tools/api-call.d.ts.map +1 -0
  70. package/dist/tools/api-call.js +169 -0
  71. package/dist/tools/api-call.js.map +1 -0
  72. package/dist/tools/api-discovery.d.ts +5 -0
  73. package/dist/tools/api-discovery.d.ts.map +1 -0
  74. package/dist/tools/api-discovery.js +80 -0
  75. package/dist/tools/api-discovery.js.map +1 -0
  76. package/dist/tools/docs.d.ts +5 -0
  77. package/dist/tools/docs.d.ts.map +1 -0
  78. package/dist/tools/docs.js +113 -0
  79. package/dist/tools/docs.js.map +1 -0
  80. package/dist/tools/guide.d.ts +11 -0
  81. package/dist/tools/guide.d.ts.map +1 -0
  82. package/dist/tools/guide.js +67 -0
  83. package/dist/tools/guide.js.map +1 -0
  84. package/dist/tools/result.d.ts +19 -0
  85. package/dist/tools/result.d.ts.map +1 -0
  86. package/dist/tools/result.js +19 -0
  87. package/dist/tools/result.js.map +1 -0
  88. package/dist/tools/whoami.d.ts +5 -0
  89. package/dist/tools/whoami.d.ts.map +1 -0
  90. package/dist/tools/whoami.js +42 -0
  91. package/dist/tools/whoami.js.map +1 -0
  92. package/dist/transports/http.d.ts +10 -0
  93. package/dist/transports/http.d.ts.map +1 -0
  94. package/dist/transports/http.js +126 -0
  95. package/dist/transports/http.js.map +1 -0
  96. package/dist/transports/stdio.d.ts +8 -0
  97. package/dist/transports/stdio.d.ts.map +1 -0
  98. package/dist/transports/stdio.js +15 -0
  99. package/dist/transports/stdio.js.map +1 -0
  100. package/package.json +60 -0
@@ -0,0 +1,80 @@
1
+ import { z } from 'zod';
2
+ import { errorResult, jsonResult } from './result.js';
3
+ /** Регистрирует `cms_api_search` и `cms_api_describe`. */
4
+ export const registerApiDiscovery = (server, deps) => {
5
+ const { catalog } = deps;
6
+ server.registerTool('cms_api_search', {
7
+ title: 'Search Admin API operations',
8
+ description: 'Find Admin API operations by keyword, tag, HTTP method or mutating/non-mutating. Returns operation ids to pass to cms_api_describe. This is the only authority on which endpoints exist.',
9
+ inputSchema: {
10
+ query: z.string().describe('Keywords: entity, path fragment, or action ("menu position", "orders refund").'),
11
+ tag: z.string().optional().describe('Restrict to one tag, e.g. "Orders".'),
12
+ method: z.enum(['get', 'post', 'put', 'patch', 'delete']).optional(),
13
+ mutating: z.boolean().optional().describe('true = only writes/deletes, false = only reads.'),
14
+ limit: z.number().int().min(1).max(50).optional().describe('Maximum hits, default 15.'),
15
+ },
16
+ annotations: { readOnlyHint: true, openWorldHint: false },
17
+ }, ({ query, tag, method, mutating, limit }) => {
18
+ const hits = catalog.search({
19
+ query,
20
+ ...(tag ? { tag } : {}),
21
+ ...(method ? { method } : {}),
22
+ ...(mutating !== undefined ? { mutating } : {}),
23
+ ...(limit ? { limit } : {}),
24
+ });
25
+ if (hits.length === 0) {
26
+ return jsonResult({
27
+ hits: [],
28
+ tags: [...new Set(catalog.operations().map((o) => o.tag))].sort(),
29
+ hint: 'Nothing matched. Try a bare entity name, or filter by one of the tags listed here.',
30
+ });
31
+ }
32
+ return jsonResult({
33
+ hits,
34
+ next: 'Get the payload shape with cms_api_describe { opId }.',
35
+ });
36
+ });
37
+ server.registerTool('cms_api_describe', {
38
+ title: 'Describe an Admin API operation',
39
+ description: 'Full detail for one operation: path and query parameters, request-body schema, required permission, risk level, and the knowledge sections that explain the payload. Fields marked "x-loose": true have a TypeScript-shaped type in the source swagger — trust their example, not their type.',
40
+ inputSchema: {
41
+ opId: z.string().min(1).describe('Operation id from cms_api_search, e.g. "AdminPagesController_findAllRoot".'),
42
+ },
43
+ annotations: { readOnlyHint: true, openWorldHint: false },
44
+ }, ({ opId }) => {
45
+ const operation = catalog.get(opId);
46
+ if (!operation) {
47
+ return errorResult(`Unknown opId "${opId}".`, {
48
+ didYouMean: catalog.suggest(opId),
49
+ hint: 'Operation ids come from cms_api_search — do not construct them by hand.',
50
+ });
51
+ }
52
+ const loose = [
53
+ ...(operation.body?.schema.properties
54
+ ? Object.entries(operation.body.schema.properties)
55
+ .filter(([, schema]) => schema['x-loose'] === true)
56
+ .map(([name, schema]) => ({ field: name, sourceType: schema['x-source-type'] }))
57
+ : []),
58
+ ];
59
+ return jsonResult({
60
+ opId: operation.opId,
61
+ method: operation.method.toUpperCase(),
62
+ path: operation.path,
63
+ fullPath: operation.fullPath,
64
+ tag: operation.tag,
65
+ summary: operation.summary,
66
+ permission: operation.permission ?? null,
67
+ risk: operation.risk,
68
+ alwaysConfirm: operation.alwaysConfirm,
69
+ params: operation.params,
70
+ body: operation.body ?? null,
71
+ looseFields: loose,
72
+ responseSummary: operation.responseSummary ?? null,
73
+ docs: operation.docLinks,
74
+ next: operation.risk === 'read'
75
+ ? 'Call it with cms_api_call { opId, path, query }.'
76
+ : 'Read the linked docs, then call cms_api_call with dryRun: true first.',
77
+ });
78
+ });
79
+ };
80
+ //# sourceMappingURL=api-discovery.js.map
@@ -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,5 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { SharedDeps } from '../session.js';
3
+ /** Регистрирует `cms_docs_search` и `cms_docs_read`. */
4
+ export declare const registerDocs: (server: McpServer, deps: SharedDeps) => void;
5
+ //# sourceMappingURL=docs.d.ts.map
@@ -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"}
@@ -0,0 +1,113 @@
1
+ import { z } from 'zod';
2
+ import { errorResult, jsonResult } from './result.js';
3
+ /** Предел размера одного раздела, отдаваемого модели. */
4
+ const MAX_SECTION_BYTES = 12_288;
5
+ /** Регистрирует `cms_docs_search` и `cms_docs_read`. */
6
+ export const registerDocs = (server, deps) => {
7
+ const { knowledge } = deps;
8
+ server.registerTool('cms_docs_search', {
9
+ title: 'Search CMS knowledge',
10
+ description: 'Search the project knowledge base (module reference docs, e2e conventions, code style, shipped-fix write-ups, and this server\'s operating rules) and return matching sections with snippets. Use before writing any payload.',
11
+ inputSchema: {
12
+ query: z.string().min(2).describe('Natural-language query; Russian and English both work.'),
13
+ limit: z.number().int().min(1).max(20).optional().describe('Maximum hits, default 8.'),
14
+ },
15
+ annotations: { readOnlyHint: true, openWorldHint: false },
16
+ }, ({ query, limit }) => {
17
+ const hits = knowledge.search(query, limit ?? 8);
18
+ if (hits.length === 0) {
19
+ return jsonResult({
20
+ hits: [],
21
+ hint: 'Nothing matched. Try a module name (menus, orders, blocks, attributes) or an entity field name.',
22
+ });
23
+ }
24
+ return jsonResult({
25
+ hits: hits.map((hit) => ({
26
+ docId: hit.docId,
27
+ anchor: hit.anchor,
28
+ title: hit.title,
29
+ doc: hit.docTitle,
30
+ score: hit.score,
31
+ snippet: hit.snippet,
32
+ })),
33
+ next: 'Read a hit with cms_docs_read { docId, anchor }.',
34
+ });
35
+ });
36
+ server.registerTool('cms_docs_read', {
37
+ title: 'Read a CMS knowledge section',
38
+ description: 'Read one section of a knowledge document. Omit the anchor to get the document preamble plus its section list, then page through the sections you need.',
39
+ inputSchema: {
40
+ docId: z.string().min(1).describe('Document id, e.g. "back/docs/menus-module" or "mcp/operating-rules".'),
41
+ anchor: z.string().optional().describe('Section anchor from cms_docs_search; omit for the preamble.'),
42
+ },
43
+ annotations: { readOnlyHint: true, openWorldHint: false },
44
+ }, ({ docId, anchor }) => {
45
+ const doc = knowledge.doc(docId);
46
+ if (!doc) {
47
+ const candidates = knowledge
48
+ .docs()
49
+ .filter((d) => d.docId.includes(docId) || docId.includes(d.docId.split('/').pop() ?? ''))
50
+ .slice(0, 8)
51
+ .map((d) => d.docId);
52
+ return errorResult(`Unknown docId "${docId}".`, {
53
+ candidates,
54
+ hint: 'Use cms_docs_search to get a valid docId.',
55
+ });
56
+ }
57
+ const chunk = knowledge.chunk(`${docId}#${anchor ?? ''}`);
58
+ if (!chunk) {
59
+ return errorResult(`Document "${docId}" has no section "${anchor ?? ''}".`, {
60
+ anchors: doc.anchors.map((a) => a.anchor),
61
+ });
62
+ }
63
+ const text = Buffer.byteLength(chunk.text, 'utf8') > MAX_SECTION_BYTES
64
+ ? `${chunk.text.slice(0, MAX_SECTION_BYTES)}\n\n…[section truncated]`
65
+ : chunk.text;
66
+ return jsonResult({
67
+ docId,
68
+ anchor: chunk.anchor,
69
+ title: chunk.title,
70
+ doc: doc.title,
71
+ sourcePath: `${chunk.repo}:${chunk.path}`,
72
+ text,
73
+ sections: doc.anchors.map((a) => ({ anchor: a.anchor, title: a.title, bytes: a.bytes })),
74
+ });
75
+ });
76
+ /** Ресурсы дублируют два самых нужных документа, чтобы клиент мог их закрепить. */
77
+ server.registerResource('operating-rules', 'oneentry://knowledge/mcp/operating-rules', {
78
+ title: 'OneEntry CMS operating rules',
79
+ description: 'The payload and safety rules an agent must follow before writing to this CMS.',
80
+ mimeType: 'text/markdown',
81
+ }, () => {
82
+ const sections = knowledge
83
+ .pack.chunks.filter((chunk) => chunk.docId === 'mcp/operating-rules')
84
+ .map((chunk) => (chunk.title && chunk.anchor ? `## ${chunk.title}\n\n${chunk.text}` : chunk.text));
85
+ return {
86
+ contents: [
87
+ {
88
+ uri: 'oneentry://knowledge/mcp/operating-rules',
89
+ mimeType: 'text/markdown',
90
+ text: sections.join('\n\n'),
91
+ },
92
+ ],
93
+ };
94
+ });
95
+ server.registerResource('knowledge-index', 'oneentry://knowledge/index', {
96
+ title: 'OneEntry CMS knowledge index',
97
+ description: 'Every available knowledge document with its sections.',
98
+ mimeType: 'application/json',
99
+ }, () => ({
100
+ contents: [
101
+ {
102
+ uri: 'oneentry://knowledge/index',
103
+ mimeType: 'application/json',
104
+ text: JSON.stringify(knowledge.docs().map((doc) => ({
105
+ docId: doc.docId,
106
+ title: doc.title,
107
+ sections: doc.anchors.length,
108
+ })), null, 2),
109
+ },
110
+ ],
111
+ }));
112
+ };
113
+ //# sourceMappingURL=docs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs.js","sourceRoot":"","sources":["../../src/tools/docs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { SharedDeps } from '../session.js';
3
+ /**
4
+ * Собирает краткое руководство: режим, политика, карта тегов и порядок работы.
5
+ * Генерируется, а не хранится текстом, потому что половина содержимого —
6
+ * фактическое состояние сервера, и расхождение здесь дороже дублирования.
7
+ */
8
+ export declare const renderGuide: (deps: SharedDeps) => string;
9
+ /** Регистрирует `cms_guide`. */
10
+ export declare const registerGuide: (server: McpServer, deps: SharedDeps) => void;
11
+ //# sourceMappingURL=guide.d.ts.map
@@ -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"}
@@ -0,0 +1,67 @@
1
+ import { textResult } from './result.js';
2
+ /** Сколько тегов показывать в карте API. */
3
+ const TAG_LIMIT = 24;
4
+ /**
5
+ * Собирает краткое руководство: режим, политика, карта тегов и порядок работы.
6
+ * Генерируется, а не хранится текстом, потому что половина содержимого —
7
+ * фактическое состояние сервера, и расхождение здесь дороже дублирования.
8
+ */
9
+ export const renderGuide = (deps) => {
10
+ const { config, catalog, knowledge } = deps;
11
+ const counts = new Map();
12
+ for (const operation of catalog.operations()) {
13
+ counts.set(operation.tag, (counts.get(operation.tag) ?? 0) + 1);
14
+ }
15
+ const tags = [...counts.entries()]
16
+ .sort((a, b) => b[1] - a[1])
17
+ .slice(0, TAG_LIMIT)
18
+ .map(([tag, count]) => `${tag} (${String(count)})`)
19
+ .join(', ');
20
+ const allowLine = config.allow === 'read'
21
+ ? 'read-only — every POST/PUT/PATCH/DELETE is refused locally, without a request being sent'
22
+ : config.allow === 'write'
23
+ ? 'writes allowed; DELETE and the permanently gated paths still need a confirm token'
24
+ : 'writes and deletes allowed; deletes and the permanently gated paths still need a confirm token';
25
+ return [
26
+ '# OneEntry CMS Admin API — agent guide',
27
+ '',
28
+ `Mode: **${config.mode}** · Base URL: \`${config.baseUrl}\` · Policy: ${allowLine}.`,
29
+ `Catalog: ${String(catalog.operations().length)} operations (swagger ${catalog.catalog.swaggerHash}).`,
30
+ `Knowledge: ${String(knowledge.docs().length)} docs / ${String(knowledge.pack.chunks.length)} sections, source ${knowledge.pack.source}.`,
31
+ '',
32
+ '## How to work here',
33
+ '',
34
+ '1. `cms_docs_read` → `mcp/operating-rules` — **read it before your first write.** It carries the',
35
+ ' payload rules (locale-keyed `localizeInfos`, attribute-set-driven `attributesSets`,',
36
+ ' lexorank vs numeric `position`, eventual consistency) that make the difference between',
37
+ ' a 400 and a correct call.',
38
+ '2. `cms_docs_search` — find the reference doc for the entity you are touching.',
39
+ '3. `cms_api_search` → `cms_api_describe` — get the real operation and its payload shape.',
40
+ '4. `cms_api_call` — `dryRun: true` first for anything that mutates.',
41
+ '',
42
+ 'Never invent a path: `cms_api_search` is the only authority on what exists.',
43
+ '',
44
+ '## API map (tag → operations)',
45
+ '',
46
+ tags,
47
+ '',
48
+ '## Hard limits',
49
+ '',
50
+ '- Admin API only. The Content and Developer APIs are deliberately not exposed.',
51
+ '- `immutable-settings`, `admins`, `backups`, `modules`, `payments/webhook`, `settings-general`,',
52
+ ' `system/captcha-keys` and `auth/logout/all-users` are permanently confirm-gated.',
53
+ '- Responses are capped; overflow is reported as `_truncated`. Narrow the query instead.',
54
+ ...(catalog.catalog.warnings.length > 0
55
+ ? ['', '## Warnings', '', ...catalog.catalog.warnings.map((w) => `- ${w}`)]
56
+ : []),
57
+ ].join('\n');
58
+ };
59
+ /** Регистрирует `cms_guide`. */
60
+ export const registerGuide = (server, deps) => {
61
+ server.registerTool('cms_guide', {
62
+ title: 'CMS guide',
63
+ description: 'Read this first. What this server exposes, the current mode and write policy, the API map, and the order in which to use the other tools.',
64
+ annotations: { readOnlyHint: true, openWorldHint: false },
65
+ }, () => textResult(renderGuide(deps)));
66
+ };
67
+ //# sourceMappingURL=guide.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guide.js","sourceRoot":"","sources":["../../src/tools/guide.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /** Форма результата вызова инструмента MCP. */
2
+ export interface ToolResult {
3
+ content: Array<{
4
+ type: 'text';
5
+ text: string;
6
+ }>;
7
+ isError?: boolean;
8
+ [key: string]: unknown;
9
+ }
10
+ /** Успешный результат-JSON. */
11
+ export declare const jsonResult: (payload: unknown) => ToolResult;
12
+ /** Успешный результат-текст (для человекочитаемых руководств). */
13
+ export declare const textResult: (text: string) => ToolResult;
14
+ /**
15
+ * Ошибка инструмента. Возвращаем её как isError, а не бросаем исключение:
16
+ * модель должна увидеть текст и исправиться, а не получить обрыв сессии.
17
+ */
18
+ export declare const errorResult: (message: string, extra?: Record<string, unknown>) => ToolResult;
19
+ //# sourceMappingURL=result.d.ts.map
@@ -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,19 @@
1
+ /** Успешный результат-JSON. */
2
+ export const jsonResult = (payload) => ({
3
+ content: [{ type: 'text', text: JSON.stringify(payload, null, 2) }],
4
+ });
5
+ /** Успешный результат-текст (для человекочитаемых руководств). */
6
+ export const textResult = (text) => ({
7
+ content: [{ type: 'text', text }],
8
+ });
9
+ /**
10
+ * Ошибка инструмента. Возвращаем её как isError, а не бросаем исключение:
11
+ * модель должна увидеть текст и исправиться, а не получить обрыв сессии.
12
+ */
13
+ export const errorResult = (message, extra) => ({
14
+ content: [
15
+ { type: 'text', text: JSON.stringify({ error: message, ...(extra ?? {}) }, null, 2) },
16
+ ],
17
+ isError: true,
18
+ });
19
+ //# sourceMappingURL=result.js.map
@@ -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,5 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { Session } from '../session.js';
3
+ /** Регистрирует `cms_whoami` — состояние сервера и подключённого админа. */
4
+ export declare const registerWhoami: (server: McpServer, getSession: () => Session) => void;
5
+ //# sourceMappingURL=whoami.d.ts.map
@@ -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"}
@@ -0,0 +1,42 @@
1
+ import { jsonResult } from './result.js';
2
+ /** Регистрирует `cms_whoami` — состояние сервера и подключённого админа. */
3
+ export const registerWhoami = (server, getSession) => {
4
+ server.registerTool('cms_whoami', {
5
+ title: 'Who am I',
6
+ description: 'Current mode, Admin API base URL, write policy, the authenticated admin and its permissions, and the versions of the bundled catalog and knowledge pack.',
7
+ annotations: { readOnlyHint: true, openWorldHint: true },
8
+ }, async () => {
9
+ const session = getSession();
10
+ const { config, catalog, knowledge } = session.shared;
11
+ const identity = await session.identity();
12
+ return jsonResult({
13
+ mode: config.mode,
14
+ baseUrl: config.baseUrl,
15
+ allow: config.allow,
16
+ authenticated: identity !== undefined,
17
+ ...(identity
18
+ ? { admin: { id: identity.id, permissionCount: identity.permissions.length, permissions: identity.permissions } }
19
+ : {
20
+ admin: null,
21
+ hint: session.isConfigured
22
+ ? 'Credentials are configured but authentication failed — check ONEENTRY_CMS_LOGIN / ONEENTRY_CMS_PASSWORD and that the stand is reachable.'
23
+ : 'No credentials configured. Set ONEENTRY_CMS_LOGIN + ONEENTRY_CMS_PASSWORD (or ONEENTRY_CMS_TOKEN).',
24
+ }),
25
+ catalog: {
26
+ operations: catalog.operations().length,
27
+ swaggerHash: catalog.catalog.swaggerHash,
28
+ builtAt: catalog.catalog.builtAt,
29
+ knownPermissions: catalog.catalog.permissions.length,
30
+ warnings: catalog.catalog.warnings,
31
+ },
32
+ knowledge: {
33
+ source: knowledge.pack.source,
34
+ builtAt: knowledge.pack.builtAt,
35
+ docs: knowledge.docs().length,
36
+ sections: knowledge.pack.chunks.length,
37
+ },
38
+ audit: config.auditPath ?? null,
39
+ });
40
+ });
41
+ };
42
+ //# sourceMappingURL=whoami.js.map
@@ -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,10 @@
1
+ import type { Config } from '../config/config.js';
2
+ /**
3
+ * Запускает сервер поверх Streamable HTTP — remote-режим.
4
+ * На каждое MCP-подключение создаётся своя `Session` со своими токенами
5
+ * и своими подтверждениями; общий каталог и знания строятся один раз.
6
+ */
7
+ export declare const runHttp: (config: Config) => Promise<{
8
+ close: () => Promise<void>;
9
+ }>;
10
+ //# sourceMappingURL=http.d.ts.map
@@ -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"}
@@ -0,0 +1,126 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
3
+ import { isInitializeRequest } from '@modelcontextprotocol/sdk/types.js';
4
+ import express from 'express';
5
+ import { createServer, createSharedDeps } from '../server.js';
6
+ import { Session } from '../session.js';
7
+ /** Заголовки, которыми клиент передаёт свои учётные данные CMS. */
8
+ const HEADER_TOKEN = 'x-cms-token';
9
+ const HEADER_LOGIN = 'x-cms-login';
10
+ const HEADER_PASSWORD = 'x-cms-password';
11
+ const headerValue = (request, name) => {
12
+ const raw = request.headers[name];
13
+ const value = Array.isArray(raw) ? raw[0] : raw;
14
+ return typeof value === 'string' && value.trim() !== '' ? value.trim() : undefined;
15
+ };
16
+ /**
17
+ * Читает учётные данные сессии из заголовков подключения.
18
+ * Только отсюда и из конфигурации сервера — никогда из аргументов инструмента:
19
+ * иначе внедрённая в текст инструкция могла бы подменить личность.
20
+ */
21
+ const credentialsFromRequest = (request) => {
22
+ const token = headerValue(request, HEADER_TOKEN);
23
+ if (token) {
24
+ return { token };
25
+ }
26
+ const login = headerValue(request, HEADER_LOGIN);
27
+ const password = headerValue(request, HEADER_PASSWORD);
28
+ if (login && password) {
29
+ return { login, password };
30
+ }
31
+ return undefined;
32
+ };
33
+ /**
34
+ * Проверка Origin. Транспорт SDK умеет это сам, но помечает как deprecated
35
+ * в пользу внешней middleware — делаем внешнюю.
36
+ */
37
+ const originGuard = (allowedOrigins) => (request, response, next) => {
38
+ const origin = headerValue(request, 'origin');
39
+ if (!origin) {
40
+ next();
41
+ return;
42
+ }
43
+ if (allowedOrigins.includes(origin)) {
44
+ next();
45
+ return;
46
+ }
47
+ response.status(403).json({
48
+ error: `Origin "${origin}" is not allowed. Start the server with --allowed-origins to permit it.`,
49
+ });
50
+ };
51
+ /**
52
+ * Запускает сервер поверх Streamable HTTP — remote-режим.
53
+ * На каждое MCP-подключение создаётся своя `Session` со своими токенами
54
+ * и своими подтверждениями; общий каталог и знания строятся один раз.
55
+ */
56
+ export const runHttp = async (config) => {
57
+ const deps = createSharedDeps(config);
58
+ const sessions = new Map();
59
+ const app = express();
60
+ app.use(express.json({ limit: '4mb' }));
61
+ app.use(originGuard(config.http.allowedOrigins));
62
+ app.get('/health', (_request, response) => {
63
+ response.json({ ok: true, mode: config.mode, sessions: sessions.size });
64
+ });
65
+ app.post('/mcp', async (request, response) => {
66
+ const sessionId = headerValue(request, 'mcp-session-id');
67
+ const existing = sessionId ? sessions.get(sessionId) : undefined;
68
+ if (existing) {
69
+ await existing.transport.handleRequest(request, response, request.body);
70
+ return;
71
+ }
72
+ if (sessionId || !isInitializeRequest(request.body)) {
73
+ response.status(400).json({
74
+ error: 'Unknown or missing MCP session. Send an initialize request first.',
75
+ });
76
+ return;
77
+ }
78
+ const transport = new StreamableHTTPServerTransport({
79
+ sessionIdGenerator: () => randomUUID(),
80
+ onsessioninitialized: (id) => {
81
+ sessions.set(id, { transport, session });
82
+ },
83
+ onsessionclosed: (id) => {
84
+ sessions.delete(id);
85
+ },
86
+ });
87
+ const session = new Session(deps, credentialsFromRequest(request));
88
+ const server = createServer(deps, () => session);
89
+ transport.onclose = () => {
90
+ if (transport.sessionId) {
91
+ sessions.delete(transport.sessionId);
92
+ }
93
+ };
94
+ await server.connect(transport);
95
+ await transport.handleRequest(request, response, request.body);
96
+ });
97
+ /** GET открывает SSE-поток, DELETE закрывает сессию — обе требуют существующей сессии. */
98
+ const requireSession = async (request, response) => {
99
+ const sessionId = headerValue(request, 'mcp-session-id');
100
+ const managed = sessionId ? sessions.get(sessionId) : undefined;
101
+ if (!managed) {
102
+ response.status(404).json({ error: 'Unknown MCP session.' });
103
+ return;
104
+ }
105
+ await managed.transport.handleRequest(request, response);
106
+ };
107
+ app.get('/mcp', requireSession);
108
+ app.delete('/mcp', requireSession);
109
+ const httpServer = await new Promise((resolveListen) => {
110
+ const listener = app.listen(config.http.port, config.http.host, () => {
111
+ resolveListen(listener);
112
+ });
113
+ });
114
+ process.stderr.write(`oneentry-mcp-platform listening on http://${config.http.host}:${String(config.http.port)}/mcp ` +
115
+ `(allow=${config.allow}, baseUrl=${config.baseUrl})\n`);
116
+ return {
117
+ close: async () => {
118
+ for (const managed of sessions.values()) {
119
+ await managed.transport.close();
120
+ }
121
+ sessions.clear();
122
+ await new Promise((resolveClose) => httpServer.close(() => resolveClose()));
123
+ },
124
+ };
125
+ };
126
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/transports/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { Config } from '../config/config.js';
2
+ /**
3
+ * Запускает сервер поверх stdio — local-режим.
4
+ * Сессия одна на процесс: клиент сам порождает процесс на подключение,
5
+ * поэтому изоляция обеспечивается операционной системой, а не нашим кодом.
6
+ */
7
+ export declare const runStdio: (config: Config) => Promise<void>;
8
+ //# sourceMappingURL=stdio.d.ts.map
@@ -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,15 @@
1
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
2
+ import { createServer, createSharedDeps } from '../server.js';
3
+ import { Session } from '../session.js';
4
+ /**
5
+ * Запускает сервер поверх stdio — local-режим.
6
+ * Сессия одна на процесс: клиент сам порождает процесс на подключение,
7
+ * поэтому изоляция обеспечивается операционной системой, а не нашим кодом.
8
+ */
9
+ export const runStdio = async (config) => {
10
+ const deps = createSharedDeps(config);
11
+ const session = new Session(deps);
12
+ const server = createServer(deps, () => session);
13
+ await server.connect(new StdioServerTransport());
14
+ };
15
+ //# sourceMappingURL=stdio.js.map
@@ -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"}