added data mcp tests

This commit is contained in:
dswbx
2025-08-12 20:22:38 +02:00
parent 871cec9251
commit bd3d2ea900
9 changed files with 425 additions and 105 deletions

View File

@@ -445,7 +445,15 @@ export class DataController extends Controller {
tags: ["data"],
}),
permission(DataPermissions.entityUpdate),
mcpTool("data_entity_update_many"),
mcpTool("data_entity_update_many", {
inputSchema: {
param: s.object({ entity: entitiesEnum }),
json: s.object({
update: s.object({}),
where: s.object({}),
}),
},
}),
jsc("param", s.object({ entity: entitiesEnum })),
jsc(
"json",
@@ -521,7 +529,12 @@ export class DataController extends Controller {
tags: ["data"],
}),
permission(DataPermissions.entityDelete),
mcpTool("data_entity_delete_many"),
mcpTool("data_entity_delete_many", {
inputSchema: {
param: s.object({ entity: entitiesEnum }),
json: s.object({}),
},
}),
jsc("param", s.object({ entity: entitiesEnum })),
jsc("json", repoQuery.properties.where),
async (c) => {

View File

@@ -83,7 +83,10 @@ export const dataConfigSchema = $object("config_data", {
relations: $record("config_data_relations", s.anyOf(relationsSchema), {
default: {},
}).optional(),
indices: $record("config_data_indices", indicesSchema, { default: {} }).optional(),
indices: $record("config_data_indices", indicesSchema, {
default: {},
mcp: { update: false },
}).optional(),
}).strict();
export type AppDataConfig = s.Static<typeof dataConfigSchema>;

View File

@@ -7,7 +7,16 @@ import {
type SchemaWithMcpOptions,
} from "./McpSchemaHelper";
export interface RecordToolSchemaOptions extends s.IRecordOptions, SchemaWithMcpOptions {}
type RecordToolAdditionalOptions = {
get?: boolean;
add?: boolean;
update?: boolean;
remove?: boolean;
};
export interface RecordToolSchemaOptions
extends s.IRecordOptions,
SchemaWithMcpOptions<RecordToolAdditionalOptions> {}
const opts = Symbol.for("bknd-mcp-record-opts");
@@ -28,7 +37,7 @@ export class RecordToolSchema<
};
}
get mcp(): McpSchemaHelper {
get mcp(): McpSchemaHelper<RecordToolAdditionalOptions> {
return this[mcpSchemaSymbol];
}
@@ -104,6 +113,12 @@ export class RecordToolSchema<
description: "key to add",
}),
value: this.getNewSchema(),
return_config: s
.boolean({
default: false,
description: "If the new configuration should be returned",
})
.optional(),
}),
},
async (params, ctx: AppToolHandlerCtx) => {
@@ -122,7 +137,9 @@ export class RecordToolSchema<
return ctx.json({
success: true,
module: module_name,
config: ctx.context.app.module[module_name as any].config,
config: params.return_config
? ctx.context.app.module[module_name as any].config
: undefined,
});
},
);
@@ -138,6 +155,12 @@ export class RecordToolSchema<
description: "key to update",
}),
value: this.getNewSchema(s.object({})),
return_config: s
.boolean({
default: false,
description: "If the new configuration should be returned",
})
.optional(),
}),
},
async (params, ctx: AppToolHandlerCtx) => {
@@ -156,7 +179,9 @@ export class RecordToolSchema<
return ctx.json({
success: true,
module: module_name,
config: ctx.context.app.module[module_name as any].config,
config: params.return_config
? ctx.context.app.module[module_name as any].config
: undefined,
});
},
);
@@ -171,6 +196,12 @@ export class RecordToolSchema<
key: s.string({
description: "key to remove",
}),
return_config: s
.boolean({
default: false,
description: "If the new configuration should be returned",
})
.optional(),
}),
},
async (params, ctx: AppToolHandlerCtx) => {
@@ -189,20 +220,22 @@ export class RecordToolSchema<
return ctx.json({
success: true,
module: module_name,
config: ctx.context.app.module[module_name as any].config,
config: params.return_config
? ctx.context.app.module[module_name as any].config
: undefined,
});
},
);
}
getTools(node: s.Node<RecordToolSchema<AP, O>>): Tool<any, any, any>[] {
const { tools = [] } = this.mcp.options;
const { tools = [], get = true, add = true, update = true, remove = true } = this.mcp.options;
return [
this.toolGet(node),
this.toolAdd(node),
this.toolUpdate(node),
this.toolRemove(node),
get && this.toolGet(node),
add && this.toolAdd(node),
update && this.toolUpdate(node),
remove && this.toolRemove(node),
...tools,
].filter(Boolean) as Tool<any, any, any>[];
}

View File

@@ -21,9 +21,9 @@ export interface McpToolOptions {
resources?: Resource<any, any, any, any>[];
}
export interface SchemaWithMcpOptions {
mcp?: McpToolOptions;
}
export type SchemaWithMcpOptions<AdditionalOptions = {}> = {
mcp?: McpToolOptions & AdditionalOptions;
};
export type AppToolContext = {
app: App;
@@ -35,13 +35,13 @@ export interface McpSchema extends s.Schema {
getTools(node: s.Node<any>): Tool<any, any, any>[];
}
export class McpSchemaHelper {
export class McpSchemaHelper<AdditionalOptions = {}> {
cleanSchema: s.ObjectSchema<any, any>;
constructor(
public schema: s.Schema,
public name: string,
public options: McpToolOptions,
public options: McpToolOptions & AdditionalOptions,
) {
this.cleanSchema = this.getCleanSchema();
}