onlymcp 0.16.4 → 0.19.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 (123) hide show
  1. package/LICENSE +33 -17
  2. package/README.md +7 -1
  3. package/dist/bin/cli.js +46 -564
  4. package/dist/bin/mcp.js +45 -66
  5. package/package.json +6 -10
  6. package/dist/apiBaseUrl.d.ts +0 -12
  7. package/dist/apiBaseUrl.js +0 -28
  8. package/dist/apiBaseUrl.js.map +0 -1
  9. package/dist/apiClient.d.ts +0 -296
  10. package/dist/apiClient.js +0 -224
  11. package/dist/apiClient.js.map +0 -1
  12. package/dist/auth/deviceLogin.d.ts +0 -5
  13. package/dist/auth/deviceLogin.js +0 -40
  14. package/dist/auth/deviceLogin.js.map +0 -1
  15. package/dist/auth/keyring.d.ts +0 -5
  16. package/dist/auth/keyring.js +0 -28
  17. package/dist/auth/keyring.js.map +0 -1
  18. package/dist/bin/cli.d.ts +0 -2
  19. package/dist/bin/cli.js.map +0 -1
  20. package/dist/bin/mcp.d.ts +0 -2
  21. package/dist/bin/mcp.js.map +0 -1
  22. package/dist/cache.d.ts +0 -7
  23. package/dist/cache.js +0 -32
  24. package/dist/cache.js.map +0 -1
  25. package/dist/deviceId.d.ts +0 -2
  26. package/dist/deviceId.js +0 -97
  27. package/dist/deviceId.js.map +0 -1
  28. package/dist/export/unpack.d.ts +0 -33
  29. package/dist/export/unpack.js +0 -54
  30. package/dist/export/unpack.js.map +0 -1
  31. package/dist/identity.d.ts +0 -29
  32. package/dist/identity.js +0 -116
  33. package/dist/identity.js.map +0 -1
  34. package/dist/import/collect.d.ts +0 -25
  35. package/dist/import/collect.js +0 -101
  36. package/dist/import/collect.js.map +0 -1
  37. package/dist/import/frontmatter.d.ts +0 -44
  38. package/dist/import/frontmatter.js +0 -93
  39. package/dist/import/frontmatter.js.map +0 -1
  40. package/dist/import/plan.d.ts +0 -74
  41. package/dist/import/plan.js +0 -190
  42. package/dist/import/plan.js.map +0 -1
  43. package/dist/import/prune.d.ts +0 -46
  44. package/dist/import/prune.js +0 -61
  45. package/dist/import/prune.js.map +0 -1
  46. package/dist/import/secrets.d.ts +0 -7
  47. package/dist/import/secrets.js +0 -77
  48. package/dist/import/secrets.js.map +0 -1
  49. package/dist/import/upload.d.ts +0 -21
  50. package/dist/import/upload.js +0 -99
  51. package/dist/import/upload.js.map +0 -1
  52. package/dist/install.d.ts +0 -81
  53. package/dist/install.js +0 -168
  54. package/dist/install.js.map +0 -1
  55. package/dist/instructions.d.ts +0 -4
  56. package/dist/instructions.js +0 -67
  57. package/dist/instructions.js.map +0 -1
  58. package/dist/memoryPath.d.ts +0 -1
  59. package/dist/memoryPath.js +0 -13
  60. package/dist/memoryPath.js.map +0 -1
  61. package/dist/memorySync.d.ts +0 -28
  62. package/dist/memorySync.js +0 -56
  63. package/dist/memorySync.js.map +0 -1
  64. package/dist/paths.d.ts +0 -16
  65. package/dist/paths.js +0 -58
  66. package/dist/paths.js.map +0 -1
  67. package/dist/registry/caveats.d.ts +0 -17
  68. package/dist/registry/caveats.js +0 -74
  69. package/dist/registry/caveats.js.map +0 -1
  70. package/dist/registry/clients.d.ts +0 -17
  71. package/dist/registry/clients.js +0 -402
  72. package/dist/registry/clients.js.map +0 -1
  73. package/dist/registry/index.d.ts +0 -6
  74. package/dist/registry/index.js +0 -7
  75. package/dist/registry/index.js.map +0 -1
  76. package/dist/registry/serverInfo.d.ts +0 -25
  77. package/dist/registry/serverInfo.js +0 -33
  78. package/dist/registry/serverInfo.js.map +0 -1
  79. package/dist/registry/servers.d.ts +0 -58
  80. package/dist/registry/servers.js +0 -259
  81. package/dist/registry/servers.js.map +0 -1
  82. package/dist/registry/toolHints.d.ts +0 -29
  83. package/dist/registry/toolHints.js +0 -41
  84. package/dist/registry/toolHints.js.map +0 -1
  85. package/dist/registry/types.d.ts +0 -71
  86. package/dist/registry/types.js +0 -6
  87. package/dist/registry/types.js.map +0 -1
  88. package/dist/skillFilePath.d.ts +0 -1
  89. package/dist/skillFilePath.js +0 -29
  90. package/dist/skillFilePath.js.map +0 -1
  91. package/dist/stubs.d.ts +0 -7
  92. package/dist/stubs.js +0 -159
  93. package/dist/stubs.js.map +0 -1
  94. package/dist/tools/connections.d.ts +0 -154
  95. package/dist/tools/connections.js +0 -164
  96. package/dist/tools/connections.js.map +0 -1
  97. package/dist/tools/getAgentDefinition.d.ts +0 -26
  98. package/dist/tools/getAgentDefinition.js +0 -29
  99. package/dist/tools/getAgentDefinition.js.map +0 -1
  100. package/dist/tools/getSkill.d.ts +0 -26
  101. package/dist/tools/getSkill.js +0 -26
  102. package/dist/tools/getSkill.js.map +0 -1
  103. package/dist/tools/getSkillFile.d.ts +0 -27
  104. package/dist/tools/getSkillFile.js +0 -39
  105. package/dist/tools/getSkillFile.js.map +0 -1
  106. package/dist/tools/index.d.ts +0 -263
  107. package/dist/tools/index.js +0 -69
  108. package/dist/tools/index.js.map +0 -1
  109. package/dist/tools/lists.d.ts +0 -38
  110. package/dist/tools/lists.js +0 -39
  111. package/dist/tools/lists.js.map +0 -1
  112. package/dist/tools/memoryGraph.d.ts +0 -69
  113. package/dist/tools/memoryGraph.js +0 -128
  114. package/dist/tools/memoryGraph.js.map +0 -1
  115. package/dist/tools/memoryRead.d.ts +0 -25
  116. package/dist/tools/memoryRead.js +0 -33
  117. package/dist/tools/memoryRead.js.map +0 -1
  118. package/dist/tools/memoryWrite.d.ts +0 -27
  119. package/dist/tools/memoryWrite.js +0 -34
  120. package/dist/tools/memoryWrite.js.map +0 -1
  121. package/dist/tools/write.d.ts +0 -166
  122. package/dist/tools/write.js +0 -193
  123. package/dist/tools/write.js.map +0 -1
@@ -1,33 +0,0 @@
1
- import { z } from 'zod';
2
- import { ApiError } from '../apiClient.js';
3
- import { isSafeMemoryPath } from '../memoryPath.js';
4
- export const MemoryReadInput = z.object({ path: z.string().min(3).max(256) });
5
- export function createMemoryReadTool(api) {
6
- const inFlight = new Map();
7
- return {
8
- name: 'memory_read',
9
- description: 'Reads a memory file live from the OnlyMCP cloud. No disk cache.',
10
- inputSchema: MemoryReadInput,
11
- async handler(args) {
12
- if (!isSafeMemoryPath(args.path)) {
13
- return { content: [{ type: 'text', text: 'errors.INVALID_PATH' }], isError: true };
14
- }
15
- try {
16
- // Nur exakt gleichzeitige Wiederholungen teilen sich eine Anfrage.
17
- // Kein Zeit-Cache: nach dem Aufloesen ist der Eintrag weg.
18
- let p = inFlight.get(args.path);
19
- if (!p) {
20
- p = api.readMemory(args.path).then((f) => f.content);
21
- inFlight.set(args.path, p);
22
- p.finally(() => inFlight.delete(args.path));
23
- }
24
- return { content: [{ type: 'text', text: await p }] };
25
- }
26
- catch (e) {
27
- const code = e instanceof ApiError ? e.code : 'errors.UNKNOWN';
28
- return { content: [{ type: 'text', text: code }], isError: true };
29
- }
30
- },
31
- };
32
- }
33
- //# sourceMappingURL=memoryRead.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"memoryRead.js","sourceRoot":"","sources":["../../src/tools/memoryRead.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAE9E,MAAM,UAAU,oBAAoB,CAAC,GAAc;IACjD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA2B,CAAC;IAEpD,OAAO;QACL,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,iEAAiE;QAC9E,WAAW,EAAE,eAAe;QAC5B,KAAK,CAAC,OAAO,CAAC,IAAqC;YACjD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACjC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC9F,CAAC;YACD,IAAI,CAAC;gBACH,mEAAmE;gBACnE,2DAA2D;gBAC3D,IAAI,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAChC,IAAI,CAAC,CAAC,EAAE,CAAC;oBACP,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;oBACrD,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;oBAC3B,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC9C,CAAC;gBACD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;YACjE,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,IAAI,GAAG,CAAC,YAAY,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC;gBAC/D,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC7E,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -1,27 +0,0 @@
1
- import { z } from 'zod';
2
- import type { ApiClient } from '../apiClient.js';
3
- export declare const MemoryWriteInput: z.ZodObject<{
4
- path: z.ZodString;
5
- content: z.ZodString;
6
- }, z.core.$strip>;
7
- export declare function createMemoryWriteTool(api: ApiClient): {
8
- name: string;
9
- description: string;
10
- inputSchema: z.ZodObject<{
11
- path: z.ZodString;
12
- content: z.ZodString;
13
- }, z.core.$strip>;
14
- handler(args: z.infer<typeof MemoryWriteInput>): Promise<{
15
- content: {
16
- type: "text";
17
- text: string;
18
- }[];
19
- isError: boolean;
20
- } | {
21
- content: {
22
- type: "text";
23
- text: string;
24
- }[];
25
- isError?: undefined;
26
- }>;
27
- };
@@ -1,34 +0,0 @@
1
- import { hostname } from 'node:os';
2
- import { z } from 'zod';
3
- import { ApiError } from '../apiClient.js';
4
- import { isSafeMemoryPath } from '../memoryPath.js';
5
- export const MemoryWriteInput = z.object({
6
- path: z.string().min(3).max(256),
7
- content: z.string().max(1_000_000),
8
- });
9
- export function createMemoryWriteTool(api) {
10
- return {
11
- name: 'memory_write',
12
- description: 'Writes a memory file live into the OnlyMCP cloud (write-through).',
13
- inputSchema: MemoryWriteInput,
14
- async handler(args) {
15
- if (!isSafeMemoryPath(args.path)) {
16
- return { content: [{ type: 'text', text: 'errors.INVALID_PATH' }], isError: true };
17
- }
18
- try {
19
- const res = await api.writeMemory(args.path, args.content, hostname());
20
- let text = res.warning
21
- ? `${res.path} ${res.updatedAt} ${res.warning.code} ${JSON.stringify(res.warning.params)}`
22
- : `${res.path} ${res.updatedAt}`;
23
- if (res.routedTo)
24
- text += ` (created in team ${res.routedTo.teamName})`;
25
- return { content: [{ type: 'text', text }] };
26
- }
27
- catch (e) {
28
- const code = e instanceof ApiError ? e.code : 'errors.UNKNOWN';
29
- return { content: [{ type: 'text', text: code }], isError: true };
30
- }
31
- },
32
- };
33
- }
34
- //# sourceMappingURL=memoryWrite.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"memoryWrite.js","sourceRoot":"","sources":["../../src/tools/memoryWrite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IAChC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC;CACnC,CAAC,CAAC;AAEH,MAAM,UAAU,qBAAqB,CAAC,GAAc;IAClD,OAAO;QACL,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,mEAAmE;QAChF,WAAW,EAAE,gBAAgB;QAC7B,KAAK,CAAC,OAAO,CAAC,IAAsC;YAClD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACjC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC9F,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACvE,IAAI,IAAI,GAAG,GAAG,CAAC,OAAO;oBACpB,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;oBAC1F,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;gBACnC,IAAI,GAAG,CAAC,QAAQ;oBAAE,IAAI,IAAI,qBAAqB,GAAG,CAAC,QAAQ,CAAC,QAAQ,GAAG,CAAC;gBACxE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YACxD,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,IAAI,GAAG,CAAC,YAAY,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC;gBAC/D,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC7E,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -1,166 +0,0 @@
1
- import { z } from 'zod';
2
- import type { ApiClient } from '../apiClient.js';
3
- export declare const SkillWriteInput: z.ZodObject<{
4
- name: z.ZodString;
5
- body: z.ZodString;
6
- }, z.core.$strip>;
7
- export declare function createSkillWriteTool(api: ApiClient): {
8
- name: string;
9
- description: string;
10
- inputSchema: z.ZodObject<{
11
- name: z.ZodString;
12
- body: z.ZodString;
13
- }, z.core.$strip>;
14
- handler: (args: z.infer<typeof SkillWriteInput>) => Promise<{
15
- content: {
16
- type: "text";
17
- text: string;
18
- }[];
19
- }>;
20
- };
21
- export declare const SkillDeleteInput: z.ZodObject<{
22
- name: z.ZodString;
23
- }, z.core.$strip>;
24
- export declare function createSkillDeleteTool(api: ApiClient): {
25
- name: string;
26
- description: string;
27
- inputSchema: z.ZodObject<{
28
- name: z.ZodString;
29
- }, z.core.$strip>;
30
- handler: (args: z.infer<typeof SkillDeleteInput>) => Promise<{
31
- content: {
32
- type: "text";
33
- text: string;
34
- }[];
35
- }>;
36
- };
37
- export declare const ListSkillFilesInput: z.ZodObject<{
38
- skill: z.ZodString;
39
- }, z.core.$strip>;
40
- export declare function createListSkillFilesTool(api: ApiClient): {
41
- name: string;
42
- description: string;
43
- inputSchema: z.ZodObject<{
44
- skill: z.ZodString;
45
- }, z.core.$strip>;
46
- handler: (args: z.infer<typeof ListSkillFilesInput>) => Promise<{
47
- content: {
48
- type: "text";
49
- text: string;
50
- }[];
51
- }>;
52
- };
53
- export declare const SkillFileWriteInput: z.ZodObject<{
54
- skill: z.ZodString;
55
- path: z.ZodString;
56
- content: z.ZodString;
57
- encoding: z.ZodDefault<z.ZodEnum<{
58
- utf8: "utf8";
59
- base64: "base64";
60
- }>>;
61
- }, z.core.$strip>;
62
- export declare function createSkillFileWriteTool(api: ApiClient): {
63
- name: string;
64
- description: string;
65
- inputSchema: z.ZodObject<{
66
- skill: z.ZodString;
67
- path: z.ZodString;
68
- content: z.ZodString;
69
- encoding: z.ZodDefault<z.ZodEnum<{
70
- utf8: "utf8";
71
- base64: "base64";
72
- }>>;
73
- }, z.core.$strip>;
74
- handler: (args: z.infer<typeof SkillFileWriteInput>) => Promise<{
75
- content: {
76
- type: "text";
77
- text: string;
78
- }[];
79
- }>;
80
- };
81
- export declare const SkillFileDeleteInput: z.ZodObject<{
82
- skill: z.ZodString;
83
- path: z.ZodString;
84
- }, z.core.$strip>;
85
- export declare function createSkillFileDeleteTool(api: ApiClient): {
86
- name: string;
87
- description: string;
88
- inputSchema: z.ZodObject<{
89
- skill: z.ZodString;
90
- path: z.ZodString;
91
- }, z.core.$strip>;
92
- handler: (args: z.infer<typeof SkillFileDeleteInput>) => Promise<{
93
- content: {
94
- type: "text";
95
- text: string;
96
- }[];
97
- }>;
98
- };
99
- export declare const AgentWriteInput: z.ZodObject<{
100
- name: z.ZodString;
101
- description: z.ZodString;
102
- body: z.ZodString;
103
- model: z.ZodOptional<z.ZodString>;
104
- tools: z.ZodOptional<z.ZodArray<z.ZodString>>;
105
- }, z.core.$strip>;
106
- export declare function createAgentWriteTool(api: ApiClient): {
107
- name: string;
108
- description: string;
109
- inputSchema: z.ZodObject<{
110
- name: z.ZodString;
111
- description: z.ZodString;
112
- body: z.ZodString;
113
- model: z.ZodOptional<z.ZodString>;
114
- tools: z.ZodOptional<z.ZodArray<z.ZodString>>;
115
- }, z.core.$strip>;
116
- handler: (args: z.infer<typeof AgentWriteInput>) => Promise<{
117
- content: {
118
- type: "text";
119
- text: string;
120
- }[];
121
- }>;
122
- };
123
- export declare const AgentDeleteInput: z.ZodObject<{
124
- name: z.ZodString;
125
- }, z.core.$strip>;
126
- export declare function createAgentDeleteTool(api: ApiClient): {
127
- name: string;
128
- description: string;
129
- inputSchema: z.ZodObject<{
130
- name: z.ZodString;
131
- }, z.core.$strip>;
132
- handler: (args: z.infer<typeof AgentDeleteInput>) => Promise<{
133
- content: {
134
- type: "text";
135
- text: string;
136
- }[];
137
- }>;
138
- };
139
- export declare const ListMemoryInput: z.ZodObject<{}, z.core.$strip>;
140
- export declare function createListMemoryTool(api: ApiClient): {
141
- name: string;
142
- description: string;
143
- inputSchema: z.ZodObject<{}, z.core.$strip>;
144
- handler: () => Promise<{
145
- content: {
146
- type: "text";
147
- text: string;
148
- }[];
149
- }>;
150
- };
151
- export declare const MemoryDeleteInput: z.ZodObject<{
152
- path: z.ZodString;
153
- }, z.core.$strip>;
154
- export declare function createMemoryDeleteTool(api: ApiClient): {
155
- name: string;
156
- description: string;
157
- inputSchema: z.ZodObject<{
158
- path: z.ZodString;
159
- }, z.core.$strip>;
160
- handler: (args: z.infer<typeof MemoryDeleteInput>) => Promise<{
161
- content: {
162
- type: "text";
163
- text: string;
164
- }[];
165
- }>;
166
- };
@@ -1,193 +0,0 @@
1
- import { z } from 'zod';
2
- import { ApiError } from '../apiClient.js';
3
- import { isSafeMemoryPath } from '../memoryPath.js';
4
- import { isSafeSkillFilePath } from '../skillFilePath.js';
5
- /**
6
- * Anlegen, Aendern und Loeschen ueber den stdio-Server.
7
- *
8
- * Bis 0.9.0 konnte dieser Server lesen und genau eine Sache schreiben:
9
- * memory_write. Ein Skill liess sich damit laden, aber nicht anlegen - dafuer
10
- * blieben das Dashboard oder `npx onlymcp import`. Das war nie ein Entscheid,
11
- * es war eine Luecke: die API konnte es die ganze Zeit.
12
- *
13
- * Die Rechtepruefung sitzt im Server, nicht hier. Dieser Client schickt die
14
- * Anfrage und gibt den Fehlercode weiter, den er zurueckbekommt - `errors.
15
- * FORBIDDEN` heisst dann, dass ein Team-Recht fehlt, und der Agent liest das
16
- * und hoert auf, es zu versuchen.
17
- */
18
- const text = (value) => ({ content: [{ type: 'text', text: value }] });
19
- const bad = (value) => ({ content: [{ type: 'text', text: value }], isError: true });
20
- /** Jeder Aufruf endet entweder in einer Antwort oder in einem Fehlercode. */
21
- async function attempt(run) {
22
- try {
23
- return text(await run());
24
- }
25
- catch (e) {
26
- if (e instanceof ApiError) {
27
- const params = Object.keys(e.params).length ? ` ${JSON.stringify(e.params)}` : '';
28
- return bad(`${e.code}${params}`);
29
- }
30
- return bad('errors.UNKNOWN');
31
- }
32
- }
33
- const skillNameSchema = z
34
- .string()
35
- .min(1)
36
- .max(64)
37
- .regex(/^[a-z0-9]+(-[a-z0-9]+)*$/, 'errors.INVALID_NAME');
38
- export const SkillWriteInput = z.object({
39
- name: skillNameSchema,
40
- body: z.string().max(200_000),
41
- });
42
- export function createSkillWriteTool(api) {
43
- return {
44
- name: 'skill_write',
45
- description: 'Create a skill or replace the body of an existing one. The body is the whole SKILL.md, frontmatter included.',
46
- inputSchema: SkillWriteInput,
47
- handler: (args) => attempt(async () => {
48
- const res = await api.putSkill(args.name, args.body);
49
- return `${res.name} ${res.updatedAt}`;
50
- }),
51
- };
52
- }
53
- export const SkillDeleteInput = z.object({ name: skillNameSchema });
54
- export function createSkillDeleteTool(api) {
55
- return {
56
- name: 'skill_delete',
57
- description: 'Delete one skill and every file that belongs to it. Moves it to the trash; it can be restored in the dashboard for the trash period (default 7 days).',
58
- inputSchema: SkillDeleteInput,
59
- handler: (args) => attempt(async () => {
60
- await api.deleteSkill(args.name);
61
- return `Deleted skill ${args.name}`;
62
- }),
63
- };
64
- }
65
- export const ListSkillFilesInput = z.object({ skill: skillNameSchema });
66
- export function createListSkillFilesTool(api) {
67
- return {
68
- name: 'list_skill_files',
69
- description: 'List the companion files of one skill, with their size in bytes.',
70
- inputSchema: ListSkillFilesInput,
71
- handler: (args) => attempt(async () => {
72
- const { files } = await api.getSkill(args.skill);
73
- if (files.length === 0)
74
- return `${args.skill} has no companion files.`;
75
- return files.map((f) => `${f.path} (${f.size} bytes, ${f.encoding})`).join('\n');
76
- }),
77
- };
78
- }
79
- export const SkillFileWriteInput = z.object({
80
- skill: skillNameSchema,
81
- path: z.string().min(1).max(256),
82
- content: z.string().max(3_000_000),
83
- encoding: z.enum(['utf8', 'base64']).default('utf8'),
84
- });
85
- export function createSkillFileWriteTool(api) {
86
- return {
87
- name: 'skill_file_write',
88
- description: 'Create or replace one companion file of a skill. Use encoding base64 for anything that is not text.',
89
- inputSchema: SkillFileWriteInput,
90
- handler: (args) => {
91
- if (!isSafeSkillFilePath(args.path))
92
- return Promise.resolve(bad('errors.INVALID_PATH'));
93
- return attempt(async () => {
94
- const res = await api.putSkillFile(args.skill, args.path, args.content, args.encoding);
95
- return `${args.skill}/${res.path} ${res.size} bytes`;
96
- });
97
- },
98
- };
99
- }
100
- export const SkillFileDeleteInput = z.object({
101
- skill: skillNameSchema,
102
- path: z.string().min(1).max(256),
103
- });
104
- export function createSkillFileDeleteTool(api) {
105
- return {
106
- name: 'skill_file_delete',
107
- description: 'Delete one companion file of a skill. The skill itself stays.',
108
- inputSchema: SkillFileDeleteInput,
109
- handler: (args) => {
110
- if (!isSafeSkillFilePath(args.path))
111
- return Promise.resolve(bad('errors.INVALID_PATH'));
112
- return attempt(async () => {
113
- await api.deleteSkillFile(args.skill, args.path);
114
- return `Deleted ${args.skill}/${args.path}`;
115
- });
116
- },
117
- };
118
- }
119
- export const AgentWriteInput = z.object({
120
- name: skillNameSchema,
121
- description: z.string().min(1).max(1000),
122
- body: z.string().max(200_000),
123
- model: z.string().max(64).optional(),
124
- tools: z.array(z.string().max(128)).max(200).optional(),
125
- });
126
- export function createAgentWriteTool(api) {
127
- return {
128
- name: 'agent_write',
129
- description: 'Create an agent or replace an existing one. Leave model out to keep the one it already has.',
130
- inputSchema: AgentWriteInput,
131
- handler: (args) => attempt(async () => {
132
- // Die REST-Route ersetzt die ganze Zeile, anders als das Werkzeug am
133
- // entfernten Gateway. Also erst lesen, was da ist, damit ein
134
- // Nachfuehren der Beschreibung nicht stillschweigend das Modell
135
- // abraeumt - ein Agent ohne model laeuft danach auf dem Modell der
136
- // Hauptsitzung.
137
- const before = await api.getAgent(args.name).catch(() => null);
138
- const res = await api.putAgent(args.name, {
139
- description: args.description,
140
- body: args.body,
141
- model: args.model ?? before?.model ?? undefined,
142
- tools: args.tools ?? before?.tools ?? [],
143
- });
144
- return `${res.name} ${res.updatedAt}`;
145
- }),
146
- };
147
- }
148
- export const AgentDeleteInput = z.object({ name: skillNameSchema });
149
- export function createAgentDeleteTool(api) {
150
- return {
151
- name: 'agent_delete',
152
- description: 'Delete one agent. Moves it to the trash; it can be restored in the dashboard for the trash period (default 7 days).',
153
- inputSchema: AgentDeleteInput,
154
- handler: (args) => attempt(async () => {
155
- await api.deleteAgent(args.name);
156
- return `Deleted agent ${args.name}`;
157
- }),
158
- };
159
- }
160
- export const ListMemoryInput = z.object({});
161
- export function createListMemoryTool(api) {
162
- return {
163
- name: 'list_memory',
164
- description: 'List the paths of every memory file in this account, private and team, sorted by path.',
165
- inputSchema: ListMemoryInput,
166
- handler: () => attempt(async () => {
167
- const { files } = await api.listMemory();
168
- if (files.length === 0)
169
- return '(none)';
170
- return files
171
- .map((f) => f.path + (f.scope === 'team' ? ` (team${f.teamName ? `: ${f.teamName}` : ''})` : ''))
172
- .sort()
173
- .join('\n');
174
- }),
175
- };
176
- }
177
- export const MemoryDeleteInput = z.object({ path: z.string().min(3).max(256) });
178
- export function createMemoryDeleteTool(api) {
179
- return {
180
- name: 'memory_delete',
181
- description: 'Delete one memory file. Moves it to the trash; it can be restored in the dashboard for the trash period (default 7 days).',
182
- inputSchema: MemoryDeleteInput,
183
- handler: (args) => {
184
- if (!isSafeMemoryPath(args.path))
185
- return Promise.resolve(bad('errors.INVALID_PATH'));
186
- return attempt(async () => {
187
- await api.deleteMemory(args.path);
188
- return `Deleted ${args.path}`;
189
- });
190
- },
191
- };
192
- }
193
- //# sourceMappingURL=write.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"write.js","sourceRoot":"","sources":["../../src/tools/write.ts"],"names":[],"mappings":"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"}