localization-mcp-server 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/.env.example +9 -0
  2. package/AGENT_GUIDE.md +556 -0
  3. package/AUDIT_REPORT.md +244 -0
  4. package/PROJECT_OVERVIEW.md +140 -0
  5. package/dist/api-client.d.ts +11 -0
  6. package/dist/api-client.d.ts.map +1 -0
  7. package/dist/api-client.js +67 -0
  8. package/dist/api-client.js.map +1 -0
  9. package/dist/index.d.ts +3 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +21 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/locale-aliases.d.ts +46 -0
  14. package/dist/locale-aliases.d.ts.map +1 -0
  15. package/dist/locale-aliases.js +71 -0
  16. package/dist/locale-aliases.js.map +1 -0
  17. package/dist/logger.d.ts +8 -0
  18. package/dist/logger.d.ts.map +1 -0
  19. package/dist/logger.js +19 -0
  20. package/dist/logger.js.map +1 -0
  21. package/dist/permissions.d.ts +127 -0
  22. package/dist/permissions.d.ts.map +1 -0
  23. package/dist/permissions.js +75 -0
  24. package/dist/permissions.js.map +1 -0
  25. package/dist/prompts.d.ts +3 -0
  26. package/dist/prompts.d.ts.map +1 -0
  27. package/dist/prompts.js +129 -0
  28. package/dist/prompts.js.map +1 -0
  29. package/dist/server.d.ts +3 -0
  30. package/dist/server.d.ts.map +1 -0
  31. package/dist/server.js +25 -0
  32. package/dist/server.js.map +1 -0
  33. package/dist/tools/diff.d.ts +3 -0
  34. package/dist/tools/diff.d.ts.map +1 -0
  35. package/dist/tools/diff.js +166 -0
  36. package/dist/tools/diff.js.map +1 -0
  37. package/dist/tools/environment.d.ts +3 -0
  38. package/dist/tools/environment.d.ts.map +1 -0
  39. package/dist/tools/environment.js +113 -0
  40. package/dist/tools/environment.js.map +1 -0
  41. package/dist/tools/production.d.ts +3 -0
  42. package/dist/tools/production.d.ts.map +1 -0
  43. package/dist/tools/production.js +145 -0
  44. package/dist/tools/production.js.map +1 -0
  45. package/dist/tools/project-management.d.ts +3 -0
  46. package/dist/tools/project-management.d.ts.map +1 -0
  47. package/dist/tools/project-management.js +416 -0
  48. package/dist/tools/project-management.js.map +1 -0
  49. package/dist/tools/sandbox-writes.d.ts +3 -0
  50. package/dist/tools/sandbox-writes.d.ts.map +1 -0
  51. package/dist/tools/sandbox-writes.js +260 -0
  52. package/dist/tools/sandbox-writes.js.map +1 -0
  53. package/dist/tools/snapshots.d.ts +3 -0
  54. package/dist/tools/snapshots.d.ts.map +1 -0
  55. package/dist/tools/snapshots.js +50 -0
  56. package/dist/tools/snapshots.js.map +1 -0
  57. package/dist/tools/translations.d.ts +3 -0
  58. package/dist/tools/translations.d.ts.map +1 -0
  59. package/dist/tools/translations.js +135 -0
  60. package/dist/tools/translations.js.map +1 -0
  61. package/migrate-expenses.cjs +120 -0
  62. package/package.json +26 -0
  63. package/src/api-client.ts +68 -0
  64. package/src/index.ts +29 -0
  65. package/src/logger.ts +31 -0
  66. package/src/permissions.ts +89 -0
  67. package/src/prompts.ts +159 -0
  68. package/src/server.ts +27 -0
  69. package/src/tools/diff.ts +225 -0
  70. package/src/tools/environment.ts +175 -0
  71. package/src/tools/production.ts +196 -0
  72. package/src/tools/project-management.ts +517 -0
  73. package/src/tools/sandbox-writes.ts +321 -0
  74. package/src/tools/snapshots.ts +68 -0
  75. package/src/tools/translations.ts +167 -0
  76. package/tsconfig.json +17 -0
@@ -0,0 +1,113 @@
1
+ import { z } from "zod";
2
+ import { apiGet } from "../api-client.js";
3
+ import { ApiError } from "../api-client.js";
4
+ export function registerEnvironmentTools(server) {
5
+ server.tool("list_projects", "List all translation projects accessible to the service account. Returns slugs, names, and sandbox state.", {}, async () => {
6
+ try {
7
+ const data = await apiGet("/translations/projects", { page: 1, limit: 100 });
8
+ const rows = data.data.map((p) => {
9
+ const sandboxState = p.sandboxInitializedAt
10
+ ? p.sandboxHasChanges
11
+ ? "initialized, HAS PENDING CHANGES"
12
+ : "initialized, no changes"
13
+ : "not initialized";
14
+ return `• ${p.slug}${p.name ? ` (${p.name})` : ""} — sandbox: ${sandboxState}`;
15
+ });
16
+ return {
17
+ content: [
18
+ {
19
+ type: "text",
20
+ text: `Found ${data.meta.total} project(s):\n\n${rows.join("\n")}`,
21
+ },
22
+ ],
23
+ };
24
+ }
25
+ catch (error) {
26
+ return errorContent(error);
27
+ }
28
+ });
29
+ server.tool("get_project_details", [
30
+ "Get full details of a translation project: namespaces, locales, and sandbox state.",
31
+ "ALWAYS call this before writing to a project — you need the exact locale codes and namespace list.",
32
+ "Locale codes returned here are the only valid codes for set_translation, bulk_import, bulk_set_locale, and create_locale.",
33
+ "Use the namespace list to decide whether to reuse an existing namespace or justify creating a new one.",
34
+ ].join(" "), { projectSlug: z.string().describe("Project slug (e.g. 'my-app')") }, async ({ projectSlug }) => {
35
+ try {
36
+ // Fetch project details and sandbox status in parallel.
37
+ const [project, sandboxStatus] = await Promise.all([
38
+ apiGet(`/translations/projects/${projectSlug}`),
39
+ apiGet(`/translations/projects/${projectSlug}/sandbox/status`).catch(() => null),
40
+ ]);
41
+ const locales = project.locales;
42
+ const namespaces = project.namespaces;
43
+ const localeLines = locales.map((l) => l.isDefault ? `${l.code} (default)` : l.code);
44
+ const sandboxLine = sandboxStatus
45
+ ? sandboxStatus.initialized
46
+ ? sandboxStatus.hasChanges
47
+ ? `initialized — HAS PENDING CHANGES (${sandboxStatus.snapshotCount} snapshot(s) available)`
48
+ : `initialized — no pending changes`
49
+ : `NOT initialized — call init_sandbox before writing`
50
+ : `(sandbox status unavailable)`;
51
+ const lines = [
52
+ `Project: ${project.slug}${project.name ? ` — "${project.name}"` : ""}`,
53
+ ``,
54
+ `Locales (${locales.length}): ${localeLines.join(", ")}`,
55
+ ``,
56
+ namespaces.length === 0
57
+ ? `Namespaces: none — project has no namespaces yet`
58
+ : `Namespaces (${namespaces.length}): ${namespaces.join(", ")}`,
59
+ ``,
60
+ `Sandbox: ${sandboxLine}`,
61
+ ];
62
+ return {
63
+ content: [
64
+ {
65
+ type: "text",
66
+ text: lines.join("\n"),
67
+ },
68
+ ],
69
+ };
70
+ }
71
+ catch (error) {
72
+ return errorContent(error);
73
+ }
74
+ });
75
+ server.tool("get_environment_status", "Get the current sandbox/production status for a project: whether the sandbox is initialized, has pending changes, and how many snapshots are available.", { projectSlug: z.string().describe("Project slug") }, async ({ projectSlug }) => {
76
+ try {
77
+ const status = await apiGet(`/translations/projects/${projectSlug}/sandbox/status`);
78
+ const lines = [
79
+ `Project: ${projectSlug}`,
80
+ `Sandbox initialized: ${status.initialized ? `yes (since ${status.initializedAt})` : "NO"}`,
81
+ `Has pending changes: ${status.hasChanges ? "YES — changes are waiting to be pushed to production" : "no"}`,
82
+ `Available snapshots for revert: ${status.snapshotCount}`,
83
+ ];
84
+ return {
85
+ content: [{ type: "text", text: lines.join("\n") }],
86
+ };
87
+ }
88
+ catch (error) {
89
+ return errorContent(error);
90
+ }
91
+ });
92
+ }
93
+ function errorContent(error) {
94
+ if (error instanceof ApiError) {
95
+ return {
96
+ content: [
97
+ {
98
+ type: "text",
99
+ text: `Error ${error.status}: ${error.message}`,
100
+ },
101
+ ],
102
+ };
103
+ }
104
+ return {
105
+ content: [
106
+ {
107
+ type: "text",
108
+ text: `Unexpected error: ${String(error)}`,
109
+ },
110
+ ],
111
+ };
112
+ }
113
+ //# sourceMappingURL=environment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment.js","sourceRoot":"","sources":["../../src/tools/environment.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerProductionTools(server: McpServer): void;
3
+ //# sourceMappingURL=production.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"production.d.ts","sourceRoot":"","sources":["../../src/tools/production.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAwBpE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA+I/D"}
@@ -0,0 +1,145 @@
1
+ import { z } from "zod";
2
+ import { apiGet, apiPost, ApiError } from "../api-client.js";
3
+ import { logWrite } from "../logger.js";
4
+ export function registerProductionTools(server) {
5
+ server.tool("init_sandbox", "Initialize the sandbox for a project by copying the current production state into it. Safe to call if already initialized (will return early unless force=true).", {
6
+ projectSlug: z.string().describe("Project slug"),
7
+ force: z
8
+ .boolean()
9
+ .default(false)
10
+ .describe("If true, wipe existing sandbox and re-copy from production (owner/admin only)"),
11
+ }, async ({ projectSlug, force }) => {
12
+ try {
13
+ const result = await apiPost(`/translations/projects/${projectSlug}/sandbox/init`, { force });
14
+ if (!result.initialized) {
15
+ return {
16
+ content: [
17
+ {
18
+ type: "text",
19
+ text: `Sandbox for "${projectSlug}" is already initialized. Use force: true to re-initialize.`,
20
+ },
21
+ ],
22
+ };
23
+ }
24
+ logWrite("init_sandbox", { projectSlug, force }, result);
25
+ return {
26
+ content: [
27
+ {
28
+ type: "text",
29
+ text: `Sandbox initialized for "${projectSlug}". Copied ${result.copiedRows} translation values from production.`,
30
+ },
31
+ ],
32
+ };
33
+ }
34
+ catch (error) {
35
+ return errorContent(error);
36
+ }
37
+ });
38
+ server.tool("reset_sandbox", "Discard all sandbox changes and re-copy from current production state. This destroys all pending sandbox edits. Requires confirmed: true.", {
39
+ projectSlug: z.string().describe("Project slug"),
40
+ confirmed: z
41
+ .boolean()
42
+ .default(false)
43
+ .describe("Must be true to execute. Without confirmation, returns a warning instead."),
44
+ }, async ({ projectSlug, confirmed }) => {
45
+ if (!confirmed) {
46
+ return {
47
+ content: [
48
+ {
49
+ type: "text",
50
+ text: [
51
+ `This will DISCARD all sandbox changes for "${projectSlug}" and re-copy from production.`,
52
+ `All pending edits in sandbox will be lost permanently.`,
53
+ ``,
54
+ `To execute, call this tool again with confirmed: true.`,
55
+ ].join("\n"),
56
+ },
57
+ ],
58
+ };
59
+ }
60
+ try {
61
+ const result = await apiPost(`/translations/projects/${projectSlug}/sandbox/reset`);
62
+ logWrite("reset_sandbox", { projectSlug }, result);
63
+ return {
64
+ content: [
65
+ {
66
+ type: "text",
67
+ text: `Sandbox reset for "${projectSlug}". Re-copied ${result.copiedRows} values from current production.`,
68
+ },
69
+ ],
70
+ };
71
+ }
72
+ catch (error) {
73
+ return errorContent(error);
74
+ }
75
+ });
76
+ server.tool("preview_push_to_production", "Show a full diff of what sandbox changes would replace production if promoted. Read-only — does NOT push anything. Pushing to production must be done manually via the Admin UI.", {
77
+ projectSlug: z.string().describe("Project slug"),
78
+ }, async ({ projectSlug }) => {
79
+ try {
80
+ const diff = await apiGet(`/translations/projects/${projectSlug}/sandbox/diff`);
81
+ if (diff.total === 0) {
82
+ return {
83
+ content: [
84
+ {
85
+ type: "text",
86
+ text: `No pending changes in sandbox for "${projectSlug}". Nothing to push to production.`,
87
+ },
88
+ ],
89
+ };
90
+ }
91
+ const grouped = groupByNamespace(diff.entries);
92
+ const sections = Object.entries(grouped).map(([ns, entries]) => {
93
+ const lines = entries.slice(0, 20).map(formatDiffEntry);
94
+ const truncated = entries.length > 20 ? `\n ... and ${entries.length - 20} more` : "";
95
+ return `[${ns}]\n${lines.join("\n")}${truncated}`;
96
+ });
97
+ const summary = [
98
+ `=== PUSH PREVIEW for "${projectSlug}" ===`,
99
+ `Total changes: ${diff.total}`,
100
+ ` + Added: ${diff.added}`,
101
+ ` ~ Changed: ${diff.changed}`,
102
+ ` - Deleted: ${diff.deleted}`,
103
+ "",
104
+ "NOTE: Pushing to production must be done manually via the Admin UI.",
105
+ "",
106
+ ...sections,
107
+ ];
108
+ return {
109
+ content: [{ type: "text", text: summary.join("\n") }],
110
+ };
111
+ }
112
+ catch (error) {
113
+ return errorContent(error);
114
+ }
115
+ });
116
+ }
117
+ function groupByNamespace(entries) {
118
+ const result = {};
119
+ for (const entry of entries) {
120
+ if (!result[entry.namespace])
121
+ result[entry.namespace] = [];
122
+ result[entry.namespace].push(entry);
123
+ }
124
+ return result;
125
+ }
126
+ function formatDiffEntry(e) {
127
+ const symbol = e.status === "added" ? "+" : e.status === "deleted" ? "-" : "~";
128
+ const label = ` ${symbol} ${e.key} [${e.locale}]`;
129
+ if (e.status === "added")
130
+ return `${label}\n → "${e.sandboxValue}"`;
131
+ if (e.status === "deleted")
132
+ return `${label}\n was: "${e.productionValue}"`;
133
+ return `${label}\n before: "${e.productionValue}"\n after: "${e.sandboxValue}"`;
134
+ }
135
+ function errorContent(error) {
136
+ if (error instanceof ApiError) {
137
+ return {
138
+ content: [{ type: "text", text: `Error ${error.status}: ${error.message}` }],
139
+ };
140
+ }
141
+ return {
142
+ content: [{ type: "text", text: `Unexpected error: ${String(error)}` }],
143
+ };
144
+ }
145
+ //# sourceMappingURL=production.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"production.js","sourceRoot":"","sources":["../../src/tools/production.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerProjectManagementTools(server: McpServer): void;
3
+ //# sourceMappingURL=project-management.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-management.d.ts","sourceRoot":"","sources":["../../src/tools/project-management.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA2BpE,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA8dtE"}