import { Injectable } from '@nestjs/common'; import { type Request } from 'express'; import { isDefined } from 'twenty-shared/utils'; 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 { MetadataQueryBuilderFactory } from 'src/engine/api/rest/metadata/query-builder/metadata-query-builder.factory'; import { type 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 { fields, objects } = request.body.params.arguments; const selectors = { ...(isDefined(fields) ? { fields } : {}), ...(isDefined(objects) ? { objects } : {}), }; 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, selectors), ); return response.data.data; } }