feat(ai): add mcp-metadata (#13150)

Co-authored-by: Félix Malfait <felix@twenty.com>
This commit is contained in:
Antoine Moreaux
2025-07-16 21:32:32 +02:00
committed by GitHub
parent b25f50e288
commit 11abe5440b
50 changed files with 1288 additions and 230 deletions
@@ -0,0 +1,58 @@
import { Injectable } from '@nestjs/common';
import { Request } from 'express';
import pick from 'lodash.pick';
import { MetadataQueryBuilderFactory } from 'src/engine/api/rest/metadata/query-builder/metadata-query-builder.factory';
import { MCPMetadataToolsService } from 'src/engine/api/mcp/services/tools/mcp-metadata-tools.service';
import { validationSchemaManager } from 'src/engine/api/mcp/utils/get-json-schema';
import { ObjectName } from 'src/engine/api/rest/metadata/types/metadata-entity.type';
@Injectable()
export class CreateToolsService {
constructor(
private readonly metadataQueryBuilderFactory: MetadataQueryBuilderFactory,
private readonly mCPMetadataToolsService: MCPMetadataToolsService,
) {}
get tools() {
return [
{
name: 'create-field-metadata',
description: 'Create a new field metadata',
inputSchema:
this.mCPMetadataToolsService.mergeSchemaWithCommonProperties(
validationSchemaManager.getSchemas().CreateFieldInput,
),
execute: (request: Request) => this.execute(request, 'fields'),
},
{
name: 'create-object-metadata',
description: 'Create a new object metadata',
inputSchema:
this.mCPMetadataToolsService.mergeSchemaWithCommonProperties(
validationSchemaManager.getSchemas().CreateObjectInput,
),
execute: (request: Request) => this.execute(request, 'objects'),
},
];
}
async execute(request: Request, objectName: ObjectName) {
const requestContext = {
body: request.body.params.arguments,
baseUrl: this.mCPMetadataToolsService.generateBaseUrl(request),
path: `/rest/metadata/${objectName}`,
headers: request.headers,
};
const response = await this.mCPMetadataToolsService.send(
requestContext,
await this.metadataQueryBuilderFactory.create(
requestContext,
pick(request.body.params.arguments, ['fields', 'objects']),
),
);
return response.data.data;
}
}