@aalis/plugin-mcp-client 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.
package/README.md ADDED
@@ -0,0 +1,43 @@
1
+ # plugin-mcp-client
2
+
3
+ 作为 [MCP (Model Context Protocol)](https://modelcontextprotocol.io) **client** 连接外部 MCP servers(通过 stdio),把它们暴露的 tools 包装注册到 Aalis 的 `ToolService`,让 Aalis agent 可以直接调用外部生态的工具。
4
+
5
+ ## 接入要点
6
+
7
+ - 每个 server 在 config 中独立一项(`id` / `command` / `args` / `env`)
8
+ - 工具名会加前缀 `mcp_<server-id>_<tool-name>` 避免与本地工具命名冲突
9
+ - 每个 server 注册一个工具分组 `mcp:<server-id>`,可在 platform 配置中按需启用
10
+ - `ctx.onDispose` 注册了 client 关闭回调,插件卸载时自动断开
11
+ - 工具的 `safety` / `authority` 由 config 中按 server 配置,**默认 `safe`**——
12
+ 对接 filesystem / shell 等高危 server 时务必显式设为 `dangerous`
13
+
14
+ ## 配置示例
15
+
16
+ ```yaml
17
+ plugins:
18
+ "@aalis/plugin-mcp-client":
19
+ servers:
20
+ - id: github
21
+ command: npx
22
+ args: ["-y", "@modelcontextprotocol/server-github"]
23
+ env:
24
+ GITHUB_PERSONAL_ACCESS_TOKEN: "ghp_xxx"
25
+ enabled: true
26
+
27
+ - id: fs
28
+ command: npx
29
+ args: ["-y", "@modelcontextprotocol/server-filesystem", "/path/to/allowed/dir"]
30
+ safety: dangerous # 文件系统访问视为高危
31
+ authority: 3
32
+ ```
33
+
34
+ ## 依赖
35
+
36
+ - `@modelcontextprotocol/sdk` ^1.0.4
37
+ - inject.required: `tools`(plugin-tools-api / plugin-tools)
38
+
39
+ ## 注意
40
+
41
+ - MCP `inputSchema` 顶层非 `type: 'object'` 时会被包装为 `{ input: schema }`
42
+ - 工具名超过 64 字符(OpenAI 限制)会被截断
43
+ - 非法字符(`/` `.` 等)会被替换为下划线
@@ -0,0 +1,52 @@
1
+ /**
2
+ * @aalis/plugin-mcp-client
3
+ *
4
+ * 作为 MCP client 连接外部 MCP servers(通过 stdio),把它们的 tools
5
+ * 包装注册到 Aalis 的 ToolService,让 Aalis agent 可以直接调用。
6
+ *
7
+ * 设计要点:
8
+ * - 每个 server 在 config.servers 里独立一项(id / command / args / env)
9
+ * - 工具名加前缀 `mcp_<server-id>_<tool-name>` 避免与本地工具冲突
10
+ * - 每个 server 注册一个工具分组 `mcp:<server-id>`
11
+ * - dispose 时关闭所有 client 连接(通过 ctx.onDispose)
12
+ * - 安全级别由 config 中按 server 配置(默认 safe);高危 server 应显式设为 dangerous
13
+ */
14
+ import type { ConfigSchema, Context } from '@aalis/core';
15
+ import type { SafetyLevel } from '@aalis/plugin-authority-api';
16
+ import '@aalis/plugin-tools-api';
17
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
18
+ interface ServerSpec {
19
+ /** 唯一 id,用于工具命名空间 */
20
+ id: string;
21
+ /** 可执行命令(如 npx / node / python) */
22
+ command: string;
23
+ /** 命令行参数 */
24
+ args?: string[];
25
+ /** 环境变量 */
26
+ env?: Record<string, string>;
27
+ /** 是否启用,默认 true */
28
+ enabled?: boolean;
29
+ /** 该 server 提供的工具的安全级别,默认 'safe';建议对文件/shell 类设为 'dangerous' */
30
+ safety?: SafetyLevel;
31
+ /** 该 server 提供的工具的最低权限等级,默认 1 */
32
+ authority?: number;
33
+ }
34
+ interface Config {
35
+ servers: ServerSpec[];
36
+ }
37
+ export declare const name = "@aalis/plugin-mcp-client";
38
+ export declare const displayName = "MCP \u5BA2\u6237\u7AEF";
39
+ export declare const subsystem = "tools";
40
+ export declare const inject: {
41
+ required: string[];
42
+ };
43
+ export declare const defaultConfig: Config;
44
+ export declare const configSchema: ConfigSchema;
45
+ export declare function apply(ctx: Context, rawConfig: Record<string, unknown>): Promise<void>;
46
+ /**
47
+ * 把一个已连接的 MCP Client 上暴露的所有工具桥接进 Aalis ToolService。
48
+ * 导出以便集成测试直接传入 InMemoryTransport 配对的 client。
49
+ */
50
+ export declare function bridgeClientToTools(ctx: Context, client: Client, spec: ServerSpec): Promise<void>;
51
+ export {};
52
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAc,YAAY,EAAE,OAAO,EAAwB,MAAM,aAAa,CAAC;AAC3F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAI/D,OAAO,yBAAyB,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAGnE,UAAU,UAAU;IAClB,qBAAqB;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,mCAAmC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY;IACZ,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW;IACX,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,mBAAmB;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gEAAgE;IAChE,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,MAAM;IACd,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB;AAED,eAAO,MAAM,IAAI,6BAA6B,CAAC;AAC/C,eAAO,MAAM,WAAW,2BAAY,CAAC;AACrC,eAAO,MAAM,SAAS,UAAU,CAAC;AAEjC,eAAO,MAAM,MAAM;;CAA0B,CAAC;AAE9C,eAAO,MAAM,aAAa,EAAE,MAE3B,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,YAuD1B,CAAC;AAQF,wBAAsB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAqC3F;AA0KD;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAsCvG"}
package/dist/index.js ADDED
@@ -0,0 +1,355 @@
1
+ /**
2
+ * @aalis/plugin-mcp-client
3
+ *
4
+ * 作为 MCP client 连接外部 MCP servers(通过 stdio),把它们的 tools
5
+ * 包装注册到 Aalis 的 ToolService,让 Aalis agent 可以直接调用。
6
+ *
7
+ * 设计要点:
8
+ * - 每个 server 在 config.servers 里独立一项(id / command / args / env)
9
+ * - 工具名加前缀 `mcp_<server-id>_<tool-name>` 避免与本地工具冲突
10
+ * - 每个 server 注册一个工具分组 `mcp:<server-id>`
11
+ * - dispose 时关闭所有 client 连接(通过 ctx.onDispose)
12
+ * - 安全级别由 config 中按 server 配置(默认 safe);高危 server 应显式设为 dangerous
13
+ */
14
+ import { useToolService } from '@aalis/plugin-tools-api';
15
+ // 引入 plugin-tools-api 触发 declaration merging,使 ctx.registerTool 类型生效
16
+ import '@aalis/plugin-tools-api';
17
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
18
+ import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
19
+ export const name = '@aalis/plugin-mcp-client';
20
+ export const displayName = 'MCP 客户端';
21
+ export const subsystem = 'tools';
22
+ export const inject = { required: ['tools'] };
23
+ export const defaultConfig = {
24
+ servers: [],
25
+ };
26
+ export const configSchema = {
27
+ servers: {
28
+ type: 'array',
29
+ label: 'MCP 服务器列表',
30
+ description: '通过 stdio 连接的 MCP 服务器。每条目至少需要 id 与 command;安全级别按需调整。',
31
+ items: {
32
+ id: {
33
+ type: 'string',
34
+ label: '唯一 ID',
35
+ description: '用于工具命名空间,最终工具名形如 mcp_<id>_<tool>。仅允许字母数字与下划线/中划线。',
36
+ required: true,
37
+ },
38
+ command: {
39
+ type: 'string',
40
+ label: '可执行命令',
41
+ description: '例如 npx / node / python / 绝对路径。',
42
+ required: true,
43
+ },
44
+ args: {
45
+ type: 'textarea',
46
+ label: '命令参数',
47
+ description: '每行一个参数;或用空格分隔。会按行优先解析,行内再按空格切分。',
48
+ default: '',
49
+ },
50
+ env: {
51
+ type: 'textarea',
52
+ label: '环境变量',
53
+ description: '每行一个 KEY=VALUE。',
54
+ default: '',
55
+ },
56
+ enabled: {
57
+ type: 'boolean',
58
+ label: '启用',
59
+ description: '关闭可临时跳过该 server 而不删除整条配置。',
60
+ default: true,
61
+ },
62
+ safety: {
63
+ type: 'select',
64
+ label: '安全级别',
65
+ description: '控制该 server 暴露的所有工具的默认安全级别;dangerous 受 allowDangerous 约束。',
66
+ default: 'safe',
67
+ options: [
68
+ { label: 'safe(安全)', value: 'safe' },
69
+ { label: 'dangerous(高危,受授权策略约束)', value: 'dangerous' },
70
+ ],
71
+ },
72
+ authority: {
73
+ type: 'number',
74
+ label: '最低权限等级',
75
+ description: '调用该 server 工具所需的最低 authority;默认 1。',
76
+ default: 1,
77
+ },
78
+ },
79
+ default: [],
80
+ },
81
+ };
82
+ export async function apply(ctx, rawConfig) {
83
+ const rawServers = (rawConfig.servers ?? []);
84
+ const servers = rawServers
85
+ .map((s, i) => normalizeServerSpec(s, i, ctx))
86
+ .filter((s) => s !== undefined);
87
+ if (servers.length === 0) {
88
+ ctx.logger.info('未配置任何 MCP server,仅注册元数据工具');
89
+ registerSelfServiceTools(ctx);
90
+ return;
91
+ }
92
+ // 注册分组:每个 enabled server 一个分组,让平台可按需启用
93
+ for (const spec of servers) {
94
+ if (spec.enabled === false)
95
+ continue;
96
+ useToolService(ctx).registerGroup({
97
+ name: `mcp:${spec.id}`,
98
+ label: `MCP / ${spec.id}`,
99
+ description: `通过 plugin-mcp-client 桥接的远端 MCP server "${spec.id}"`,
100
+ });
101
+ }
102
+ // 并发连接所有 enabled servers;失败的不影响其他
103
+ await Promise.all(servers
104
+ .filter(s => s.enabled !== false)
105
+ .map(spec => connectServer(ctx, spec).catch(err => {
106
+ ctx.logger.error(`连接 MCP server "${spec.id}" 失败: ${err instanceof Error ? err.message : String(err)}`);
107
+ })));
108
+ // 注册 agent 自服务工具:只读列表 + toggle 已配置 server 的启用开关。
109
+ // 故意不提供「新增 server」工具——那等价于让 agent 任意 spawn 子进程,授权风险过大。
110
+ // 若要新增 server,应在 WebUI / yaml 手工配置。
111
+ registerSelfServiceTools(ctx);
112
+ }
113
+ /**
114
+ * 在 ToolService 中注册 mcp_list_servers / mcp_set_server_enabled 两个 agent 自服务工具。
115
+ * 二者都属于 `mcp:_meta` 分组,便于平台按需开放。
116
+ */
117
+ function registerSelfServiceTools(ctx) {
118
+ const tools = useToolService(ctx);
119
+ tools.registerGroup({
120
+ name: 'mcp:_meta',
121
+ label: 'MCP / 元数据',
122
+ description: '让 agent 列出和切换已配置的 MCP server(不能新增/删除条目)。',
123
+ });
124
+ tools.register({
125
+ definition: {
126
+ type: 'function',
127
+ function: {
128
+ name: 'mcp_list_servers',
129
+ description: '列出本插件已配置的所有 MCP server(id / command / 当前 enabled 状态)。只读,不接触子进程。',
130
+ parameters: { type: 'object', properties: {} },
131
+ },
132
+ },
133
+ groups: ['mcp:_meta'],
134
+ safety: 'safe',
135
+ authority: 1,
136
+ handler: async () => {
137
+ const cfg = ctx.config.getPluginConfig(name);
138
+ const list = (cfg.servers ?? []).map((s, i) => {
139
+ const r = s ?? {};
140
+ return {
141
+ index: i,
142
+ id: typeof r.id === 'string' ? r.id : `(\u7f3a\u5931 id)`,
143
+ command: typeof r.command === 'string' ? r.command : '',
144
+ enabled: r.enabled !== false,
145
+ };
146
+ });
147
+ return JSON.stringify(list, null, 2);
148
+ },
149
+ });
150
+ tools.register({
151
+ definition: {
152
+ type: 'function',
153
+ function: {
154
+ name: 'mcp_set_server_enabled',
155
+ description: '切换某个已配置 MCP server 的 enabled 字段并持久化;插件会自动 bounce 让变更生效。' +
156
+ '只能开关已存在的条目,不能新增;id 必须匹配 mcp_list_servers 返回的某项。',
157
+ parameters: {
158
+ type: 'object',
159
+ properties: {
160
+ id: { type: 'string', description: '目标 server 的 id' },
161
+ enabled: { type: 'boolean', description: 'true = 启用,false = 停用' },
162
+ },
163
+ required: ['id', 'enabled'],
164
+ },
165
+ },
166
+ },
167
+ groups: ['mcp:_meta'],
168
+ // 写配置 + 触发 bounce 不算 dangerous(不能 spawn 任意命令),但仍要求 authority>=2。
169
+ safety: 'safe',
170
+ authority: 2,
171
+ handler: async (args) => {
172
+ const id = typeof args.id === 'string' ? args.id : '';
173
+ const enabled = args.enabled === true;
174
+ if (!id)
175
+ return '失败:参数 id 必填';
176
+ const pm = ctx.getService('plugins');
177
+ const app = ctx.getService('app');
178
+ if (!pm || !app)
179
+ return '失败:app/plugins 服务不可用';
180
+ const current = ctx.config.getPluginConfig(name);
181
+ const servers = Array.isArray(current.servers) ? [...current.servers] : [];
182
+ const idx = servers.findIndex(s => {
183
+ const r = s ?? {};
184
+ return r.id === id;
185
+ });
186
+ if (idx < 0)
187
+ return `失败:没有 id="${id}" 的 server,请先用 mcp_list_servers 查看`;
188
+ const before = servers[idx] ?? {};
189
+ if ((before.enabled !== false) === enabled) {
190
+ return `无变化:server "${id}" 当前 enabled=${enabled}`;
191
+ }
192
+ servers[idx] = { ...before, enabled };
193
+ const ok = await pm.updatePluginConfig(name, { ...current, servers });
194
+ if (!ok)
195
+ return `失败:updatePluginConfig 返回 false`;
196
+ app.saveConfig();
197
+ return `已将 server "${id}" 设置为 enabled=${enabled},插件会 bounce 后生效`;
198
+ },
199
+ });
200
+ }
201
+ /**
202
+ * 把来自 WebUI(textarea 字符串)/ yaml(数组对象)两种形态的 server 配置项统一成 ServerSpec。
203
+ * 非法条目(缺 id 或 command)跳过并日志警告,避免整插件挂掉。
204
+ */
205
+ function normalizeServerSpec(raw, index, ctx) {
206
+ if (!raw || typeof raw !== 'object') {
207
+ ctx.logger.warn(`servers[${index}] 不是对象,跳过`);
208
+ return undefined;
209
+ }
210
+ const r = raw;
211
+ const id = typeof r.id === 'string' ? r.id.trim() : '';
212
+ const command = typeof r.command === 'string' ? r.command.trim() : '';
213
+ if (!id || !command) {
214
+ ctx.logger.warn(`servers[${index}] 缺少 id 或 command,跳过`);
215
+ return undefined;
216
+ }
217
+ // args: 支持 string[] | string(每行一参数 / 空格分隔)
218
+ let args;
219
+ if (Array.isArray(r.args)) {
220
+ args = r.args.map(x => String(x)).filter(Boolean);
221
+ }
222
+ else if (typeof r.args === 'string' && r.args.trim()) {
223
+ args = r.args
224
+ .split('\n')
225
+ .flatMap(line => line.trim().split(/\s+/))
226
+ .filter(Boolean);
227
+ }
228
+ // env: 支持 Record<string,string> | string(KEY=VALUE 每行一条)
229
+ let env;
230
+ if (r.env && typeof r.env === 'object' && !Array.isArray(r.env)) {
231
+ env = Object.fromEntries(Object.entries(r.env).map(([k, v]) => [k, String(v)]));
232
+ }
233
+ else if (typeof r.env === 'string' && r.env.trim()) {
234
+ env = {};
235
+ for (const line of r.env.split('\n')) {
236
+ const trimmed = line.trim();
237
+ if (!trimmed || trimmed.startsWith('#'))
238
+ continue;
239
+ const eq = trimmed.indexOf('=');
240
+ if (eq <= 0)
241
+ continue;
242
+ env[trimmed.slice(0, eq).trim()] = trimmed.slice(eq + 1).trim();
243
+ }
244
+ }
245
+ const safety = r.safety === 'dangerous' ? 'dangerous' : r.safety === 'safe' ? 'safe' : undefined;
246
+ const authority = typeof r.authority === 'number' ? r.authority : undefined;
247
+ const enabled = r.enabled !== false;
248
+ return { id, command, args, env, enabled, safety, authority };
249
+ }
250
+ async function connectServer(ctx, spec) {
251
+ const transport = new StdioClientTransport({
252
+ command: spec.command,
253
+ args: spec.args ?? [],
254
+ env: spec.env,
255
+ });
256
+ const client = new Client({ name: 'aalis-mcp-client', version: '0.1.0' }, { capabilities: {} });
257
+ await client.connect(transport);
258
+ ctx.logger.info(`MCP server "${spec.id}" 已连接 (${spec.command} ${(spec.args ?? []).join(' ')})`);
259
+ // 连接生命周期:ctx dispose 时关闭
260
+ ctx.onDispose(async () => {
261
+ try {
262
+ await client.close();
263
+ ctx.logger.info(`MCP server "${spec.id}" 已关闭`);
264
+ }
265
+ catch (err) {
266
+ ctx.logger.debug(`关闭 MCP server "${spec.id}" 抛错(已忽略):`, err);
267
+ }
268
+ });
269
+ await bridgeClientToTools(ctx, client, spec);
270
+ }
271
+ /**
272
+ * 把一个已连接的 MCP Client 上暴露的所有工具桥接进 Aalis ToolService。
273
+ * 导出以便集成测试直接传入 InMemoryTransport 配对的 client。
274
+ */
275
+ export async function bridgeClientToTools(ctx, client, spec) {
276
+ const { tools: mcpTools } = (await client.listTools());
277
+ ctx.logger.info(` 发现 ${mcpTools.length} 个工具`);
278
+ for (const t of mcpTools) {
279
+ const toolName = sanitizeToolName(`mcp_${spec.id}_${t.name}`);
280
+ const parameters = normalizeParameters(t.inputSchema);
281
+ const definition = {
282
+ type: 'function',
283
+ function: {
284
+ name: toolName,
285
+ description: t.description ?? `[MCP ${spec.id}] ${t.name}`,
286
+ parameters,
287
+ },
288
+ };
289
+ useToolService(ctx).register({
290
+ definition,
291
+ groups: [`mcp:${spec.id}`],
292
+ safety: spec.safety ?? 'safe',
293
+ authority: spec.authority ?? 1,
294
+ handler: async (args) => {
295
+ try {
296
+ const result = await client.callTool({
297
+ name: t.name,
298
+ arguments: args,
299
+ });
300
+ return formatToolResult(result);
301
+ }
302
+ catch (err) {
303
+ const msg = err instanceof Error ? err.message : String(err);
304
+ return `MCP 调用 ${spec.id}/${t.name} 失败: ${msg}`;
305
+ }
306
+ },
307
+ });
308
+ ctx.logger.debug(` - 工具已注册: ${toolName}`);
309
+ }
310
+ }
311
+ /**
312
+ * MCP 工具名可能含 OpenAI tool-name 不允许的字符(如 '/'、'.'),统一映射为下划线。
313
+ * 同时去重多余下划线,截断到 64 字符(OpenAI 限制)。
314
+ */
315
+ function sanitizeToolName(raw) {
316
+ let s = raw.replace(/[^a-zA-Z0-9_-]/g, '_').replace(/_+/g, '_');
317
+ if (s.length > 64)
318
+ s = s.slice(0, 64);
319
+ return s;
320
+ }
321
+ /**
322
+ * 把 MCP 的 inputSchema 规范化为 Aalis ToolDefinition 所需的 OpenAI parameters 形状。
323
+ * MCP 通常给完整 JSON Schema,这里只取顶层 type=object 的 properties / required。
324
+ */
325
+ function normalizeParameters(schema) {
326
+ if (!schema || typeof schema !== 'object') {
327
+ return { type: 'object', properties: {} };
328
+ }
329
+ const type = schema.type ?? 'object';
330
+ if (type !== 'object') {
331
+ // 非 object:包装成 { input: ... }
332
+ return {
333
+ type: 'object',
334
+ properties: { input: schema },
335
+ required: ['input'],
336
+ };
337
+ }
338
+ return {
339
+ type: 'object',
340
+ properties: schema.properties ?? {},
341
+ required: Array.isArray(schema.required) ? schema.required : undefined,
342
+ additionalProperties: typeof schema.additionalProperties === 'boolean' ? schema.additionalProperties : undefined,
343
+ };
344
+ }
345
+ function formatToolResult(result) {
346
+ const r = result;
347
+ const parts = (r.content ?? []).map(c => {
348
+ if (c.type === 'text')
349
+ return c.text ?? '';
350
+ return `[${c.type}]`;
351
+ });
352
+ const body = parts.join('\n');
353
+ return r.isError ? `MCP 工具返回错误:\n${body}` : body;
354
+ }
355
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "@aalis/plugin-mcp-client",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "keywords": [
6
+ "aalis-plugin"
7
+ ],
8
+ "main": "dist/index.js",
9
+ "types": "dist/index.d.ts",
10
+ "files": [
11
+ "dist"
12
+ ],
13
+ "dependencies": {
14
+ "@modelcontextprotocol/sdk": "^1.0.4",
15
+ "@aalis/plugin-tools-api": "^0.1.0"
16
+ },
17
+ "devDependencies": {
18
+ "@types/node": "^22.0.0",
19
+ "typescript": "^5.7.0",
20
+ "@aalis/plugin-authority-api": "0.1.0",
21
+ "@aalis/core": "0.1.0"
22
+ },
23
+ "peerDependencies": {
24
+ "@aalis/core": "^0.1.0"
25
+ },
26
+ "aalis": {
27
+ "service": {
28
+ "required": [
29
+ "tools"
30
+ ]
31
+ }
32
+ },
33
+ "scripts": {
34
+ "build": "tsc",
35
+ "dev": "tsc --watch"
36
+ }
37
+ }