feat(mcp): tools de idiomas y traducciones

- Nueva categoria tools/languages: list_web_languages,
  get_record_translations y set_record_translations (registros, config,
  textos_generales y vars de modulo via builder_custom).
- Param lang opcional en list_table_records y get_record
  (options.translates de CocoDB).
- Docs actualizados (03/04/06/09/11b + ACAI_ENDPOINTS) con el modelo de
  cms_traducciones y los workflows de traduccion.
This commit is contained in:
Jordan Diaz
2026-07-16 20:09:47 +00:00
parent d475845c27
commit d46c204ed0
13 changed files with 382 additions and 3 deletions

View File

@@ -20,9 +20,10 @@ Examples:
recordNum: z.string().describe("Record 'num' (primary key)"),
loadUploads: z.boolean().optional().default(true).describe("Load upload field data (default: true)"),
loadRelations: z.boolean().optional().default(true).describe("Resolve foreign key relations (default: true)"),
lang: z.string().optional().describe("Language prefix (e.g. 'en'). Returns translated values for translatable fields"),
}),
{ readOnlyHint: true, destructiveHint: false },
withAuth(async ({ tableName, recordNum, loadUploads = true, loadRelations = true }, extra) => {
withAuth(async ({ tableName, recordNum, loadUploads = true, loadRelations = true, lang }, extra) => {
try {
const validationError = validateRequired(
{ tableName, recordNum },
@@ -53,6 +54,11 @@ Examples:
payload.options.ignoreSchema = true;
}
// Si se pide un idioma, el motor CocoDB aplica la traduccion en lectura.
if (lang) {
payload.options.translates = lang;
}
const response = await AcaiHttpClient.postCmsApi(
credentials,
"get",

View File

@@ -15,9 +15,10 @@ export function registerListTableRecordsTool(server) {
limit: z.number().optional().describe("Max records to return. Default: 50. Use 5-10 for previews, up to 200 max for large exports."),
fields: z.array(z.string()).optional().describe("Return only these columns (e.g., ['num', 'titulo', 'precio']). Omit to return all columns. Always include 'num' if you need record IDs."),
truncateText: z.number().optional().describe("Truncate string field values longer than this many chars. Appends '... [truncated, N chars]'. Combine with 'fields' for maximum token savings."),
lang: z.string().optional().describe("Language prefix (e.g. 'en'). Returns translated values for translatable fields"),
}),
{ readOnlyHint: true, destructiveHint: false },
withAuth(async ({ tableName, page, where, limit, fields, truncateText }, extra) => {
withAuth(async ({ tableName, page, where, limit, fields, truncateText, lang }, extra) => {
try {
// Validate required parameters
const validationError = validateRequired({ tableName }, ['tableName'], 'list_table_records');
@@ -33,6 +34,11 @@ export function registerListTableRecordsTool(server) {
options: {}
};
// Si se pide un idioma, el motor CocoDB aplica la traduccion en lectura.
if (lang) {
payload.options.translates = lang;
}
// Send to CMS API via viewer_functions
const response = await AcaiHttpClient.postCmsApi(
credentials,