getChangesByUser
Retrieve recent translation changes made by a specific user in Weblate MCP Server, with options to limit results for focused insights.
Instructions
Get recent changes by a specific user
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of changes to return (default: 20) | |
| user | Yes | Username to filter by |
Implementation Reference
- src/tools/changes.tool.ts:191-245 (handler)The primary handler function for the 'getChangesByUser' tool. It invokes the Weblate API service to retrieve user-specific changes, handles empty results, formats the output using a private helper, and constructs a standardized MCP response with error handling.@Tool({ name: 'getChangesByUser', description: 'Get recent changes by a specific user', parameters: z.object({ user: z.string().describe('Username to filter by'), limit: z.number().optional().describe('Number of changes to return (default: 20)').default(20), }), }) async getChangesByUser({ user, limit = 20, }: { user: string; limit?: number; }) { try { const result = await this.weblateApiService.getChangesByUser(user, limit); if (result.results.length === 0) { return { content: [ { type: 'text', text: `No changes found for user "${user}".`, }, ], }; } const changesList = result.results .slice(0, limit) .map(change => this.formatChangeResult(change)) .join('\n\n---\n\n'); return { content: [ { type: 'text', text: `Recent changes by user "${user}" (${result.count} total):\n\n${changesList}`, }, ], }; } catch (error) { this.logger.error(`Failed to get changes by user ${user}`, error); return { content: [ { type: 'text', text: `Error getting changes by user "${user}": ${error.message}`, }, ], isError: true, }; } }
- src/tools/changes.tool.ts:194-197 (schema)Zod schema defining the input parameters for the getChangesByUser tool: required 'user' string and optional 'limit' number (default 20).parameters: z.object({ user: z.string().describe('Username to filter by'), limit: z.number().optional().describe('Number of changes to return (default: 20)').default(20), }),
- src/app.module.ts:74-80 (registration)The providers array in AppModule registers the WeblateChangesTool class, which automatically registers all @Tool-decorated methods including getChangesByUser via MCP-Nest framework.WeblateProjectsTool, WeblateComponentsTool, WeblateLanguagesTool, WeblateTranslationsTool, WeblateChangesTool, WeblateStatisticsTool, ],
- src/tools/changes.tool.ts:247-254 (helper)Private helper method used by the handler to format individual change objects into a readable markdown string.private formatChangeResult(change: Change): string { const timestamp = change.timestamp ? new Date(change.timestamp).toLocaleString() : 'Unknown'; const actionDescription = this.getActionDescription(change.action || 0); const user = change.user || 'Unknown user'; const target = change.target || 'N/A'; return `**${actionDescription}**\n**User:** ${user}\n**Time:** ${timestamp}\n**Target:** ${target}`; }
- Service method delegated by the API service, which filters recent changes by user via the Weblate API client.async getChangesByUser( user: string, limit: number = 50 ): Promise<{ results: Change[]; count: number; next?: string; previous?: string }> { try { return this.listRecentChanges(limit, user); } catch (error) { this.logger.error(`Failed to get changes by user ${user}`, error); throw new Error(`Failed to get changes by user: ${error.message}`); } }