@better-i18n/mcp-server 0.1.0 → 0.1.1
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.
- package/README.md +3 -1
- package/dist/client.d.ts +3 -2
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +40 -3
- package/dist/client.js.map +1 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +21 -9
- package/dist/context.js.map +1 -1
- package/dist/index.js +26 -15
- package/dist/index.js.map +1 -1
- package/dist/tools/listKeys.d.ts +2 -2
- package/dist/tools/listKeys.d.ts.map +1 -1
- package/dist/tools/listKeys.js +6 -37
- package/dist/tools/listKeys.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -134,7 +134,9 @@ The AI will:
|
|
|
134
134
|
| Variable | Required | Description |
|
|
135
135
|
|----------|----------|-------------|
|
|
136
136
|
| `BETTER_I18N_API_KEY` | Yes | Your API key from better-i18n.com |
|
|
137
|
-
| `BETTER_I18N_API_URL` | No | API URL (default: https://better-i18n.com) |
|
|
137
|
+
| `BETTER_I18N_API_URL` | No | API URL (default: `https://dash.better-i18n.com`). For local dev use `http://localhost:8787` |
|
|
138
|
+
| `BETTER_I18N_ORG_ID` | No | Organization ID (if not using i18n.config.ts) |
|
|
139
|
+
| `BETTER_I18N_DEBUG` | No | Set to `true` to enable request/response logging (for development) |
|
|
138
140
|
|
|
139
141
|
## Development
|
|
140
142
|
|
package/dist/client.d.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* tRPC client for
|
|
2
|
+
* tRPC client for Better i18n API with API key authentication
|
|
3
3
|
*/
|
|
4
4
|
export interface ClientConfig {
|
|
5
5
|
apiUrl: string;
|
|
6
6
|
apiKey: string;
|
|
7
|
+
debug?: boolean;
|
|
7
8
|
}
|
|
8
9
|
/**
|
|
9
10
|
* Create a tRPC client authenticated with API key
|
|
@@ -11,7 +12,7 @@ export interface ClientConfig {
|
|
|
11
12
|
* @param config - API URL, API key, and optional organization ID
|
|
12
13
|
* @returns Configured tRPC client
|
|
13
14
|
*/
|
|
14
|
-
export declare function
|
|
15
|
+
export declare function createBetterI18nClient(config: ClientConfig & {
|
|
15
16
|
organizationId?: string;
|
|
16
17
|
}): import("@trpc/client").TRPCClient<any>;
|
|
17
18
|
//# sourceMappingURL=client.d.ts.map
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,YAAY,GAAG;IAAE,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,0CAgExF"}
|
package/dist/client.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* tRPC client for
|
|
2
|
+
* tRPC client for Better i18n API with API key authentication
|
|
3
3
|
*/
|
|
4
4
|
import { createTRPCClient, httpBatchLink } from "@trpc/client";
|
|
5
5
|
/**
|
|
@@ -8,18 +8,22 @@ import { createTRPCClient, httpBatchLink } from "@trpc/client";
|
|
|
8
8
|
* @param config - API URL, API key, and optional organization ID
|
|
9
9
|
* @returns Configured tRPC client
|
|
10
10
|
*/
|
|
11
|
-
export function
|
|
11
|
+
export function createBetterI18nClient(config) {
|
|
12
12
|
// Ensure URL ends with /api/trpc for tRPC endpoint
|
|
13
13
|
const url = config.apiUrl.endsWith("/api/trpc")
|
|
14
14
|
? config.apiUrl
|
|
15
15
|
: `${config.apiUrl.replace(/\/$/, "")}/api/trpc`;
|
|
16
|
+
if (config.debug) {
|
|
17
|
+
console.error(`[better-i18n] tRPC endpoint: ${url}`);
|
|
18
|
+
}
|
|
19
|
+
// Track logged requests to avoid duplicate logs (tRPC batching can call headers multiple times)
|
|
20
|
+
let lastLoggedUrl = "";
|
|
16
21
|
return createTRPCClient({
|
|
17
22
|
links: [
|
|
18
23
|
httpBatchLink({
|
|
19
24
|
url,
|
|
20
25
|
headers: () => {
|
|
21
26
|
const headers = {
|
|
22
|
-
// Better Auth expects API key in x-api-key header
|
|
23
27
|
"x-api-key": config.apiKey,
|
|
24
28
|
};
|
|
25
29
|
if (config.organizationId) {
|
|
@@ -27,6 +31,39 @@ export function createParisClient(config) {
|
|
|
27
31
|
}
|
|
28
32
|
return headers;
|
|
29
33
|
},
|
|
34
|
+
fetch: async (input, init) => {
|
|
35
|
+
const inputUrl = String(input);
|
|
36
|
+
// Only log if this is a different request (avoid duplicate logs from tRPC batching)
|
|
37
|
+
if (config.debug && inputUrl !== lastLoggedUrl) {
|
|
38
|
+
lastLoggedUrl = inputUrl;
|
|
39
|
+
// Parse the URL to show a cleaner log
|
|
40
|
+
try {
|
|
41
|
+
const parsedUrl = new URL(inputUrl);
|
|
42
|
+
const procedure = parsedUrl.pathname.split("/").pop();
|
|
43
|
+
console.error(`[better-i18n] → ${procedure}`);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
console.error(`[better-i18n] → ${inputUrl}`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const response = await fetch(input, init);
|
|
50
|
+
if (config.debug && inputUrl === lastLoggedUrl) {
|
|
51
|
+
if (response.ok) {
|
|
52
|
+
console.error(`[better-i18n] ← ${response.status} OK`);
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
const clonedResponse = response.clone();
|
|
56
|
+
try {
|
|
57
|
+
const text = await clonedResponse.text();
|
|
58
|
+
console.error(`[better-i18n] ← ${response.status} ERROR: ${text.substring(0, 200)}`);
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
console.error(`[better-i18n] ← ${response.status} ERROR`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return response;
|
|
66
|
+
},
|
|
30
67
|
}),
|
|
31
68
|
],
|
|
32
69
|
});
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAY/D;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAkD;IACvF,mDAAmD;IACnD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC;QAC7C,CAAC,CAAC,MAAM,CAAC,MAAM;QACf,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC;IAEnD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,OAAO,CAAC,KAAK,CAAC,gCAAgC,GAAG,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,gGAAgG;IAChG,IAAI,aAAa,GAAG,EAAE,CAAC;IAEvB,OAAO,gBAAgB,CAAY;QACjC,KAAK,EAAE;YACL,aAAa,CAAC;gBACZ,GAAG;gBACH,OAAO,EAAE,GAAG,EAAE;oBACZ,MAAM,OAAO,GAA2B;wBACtC,WAAW,EAAE,MAAM,CAAC,MAAM;qBAC3B,CAAC;oBACF,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;wBAC1B,OAAO,CAAC,mBAAmB,CAAC,GAAG,MAAM,CAAC,cAAc,CAAC;oBACvD,CAAC;oBACD,OAAO,OAAO,CAAC;gBACjB,CAAC;gBACD,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;oBAC3B,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;oBAE/B,oFAAoF;oBACpF,IAAI,MAAM,CAAC,KAAK,IAAI,QAAQ,KAAK,aAAa,EAAE,CAAC;wBAC/C,aAAa,GAAG,QAAQ,CAAC;wBAEzB,sCAAsC;wBACtC,IAAI,CAAC;4BACH,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;4BACpC,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;4BACtD,OAAO,CAAC,KAAK,CAAC,mBAAmB,SAAS,EAAE,CAAC,CAAC;wBAChD,CAAC;wBAAC,MAAM,CAAC;4BACP,OAAO,CAAC,KAAK,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;wBAC/C,CAAC;oBACH,CAAC;oBAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;oBAE1C,IAAI,MAAM,CAAC,KAAK,IAAI,QAAQ,KAAK,aAAa,EAAE,CAAC;wBAC/C,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;4BAChB,OAAO,CAAC,KAAK,CAAC,mBAAmB,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;wBACzD,CAAC;6BAAM,CAAC;4BACN,MAAM,cAAc,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;4BACxC,IAAI,CAAC;gCACH,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC;gCACzC,OAAO,CAAC,KAAK,CAAC,mBAAmB,QAAQ,CAAC,MAAM,WAAW,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;4BACvF,CAAC;4BAAC,MAAM,CAAC;gCACP,OAAO,CAAC,KAAK,CAAC,mBAAmB,QAAQ,CAAC,MAAM,QAAQ,CAAC,CAAC;4BAC5D,CAAC;wBACH,CAAC;oBACH,CAAC;oBAED,OAAO,QAAQ,CAAC;gBAClB,CAAC;aACF,CAAC;SACH;KACF,CAAC,CAAC;AACL,CAAC"}
|
package/dist/context.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,GAAE,MAAsB,GAC/B,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CA0BhC"}
|
package/dist/context.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Automatically detects Better i18n project configuration by searching for
|
|
5
5
|
* createI18n usage from @better-i18n/next or @better-i18n/core in the workspace.
|
|
6
6
|
*/
|
|
7
|
-
import {
|
|
7
|
+
import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
|
|
8
8
|
import { dirname, join } from "node:path";
|
|
9
9
|
/**
|
|
10
10
|
* Find and parse createI18n configuration in workspace
|
|
@@ -95,7 +95,7 @@ function findCreateI18nFile(workspaceRoot) {
|
|
|
95
95
|
}
|
|
96
96
|
}
|
|
97
97
|
}
|
|
98
|
-
catch
|
|
98
|
+
catch {
|
|
99
99
|
// Ignore permission errors
|
|
100
100
|
}
|
|
101
101
|
}
|
|
@@ -119,22 +119,34 @@ function findCreateI18nFile(workspaceRoot) {
|
|
|
119
119
|
/**
|
|
120
120
|
* Parse file to extract createI18n configuration
|
|
121
121
|
*
|
|
122
|
-
*
|
|
123
|
-
* from the createI18n call.
|
|
122
|
+
* Supports both old format (workspaceId + projectSlug) and new format (project: "org/slug")
|
|
124
123
|
*/
|
|
125
124
|
function parseI18nConfig(filePath) {
|
|
126
125
|
const content = readFileSync(filePath, "utf-8");
|
|
127
|
-
//
|
|
126
|
+
// Try new format first: project: "org/slug"
|
|
127
|
+
const projectMatch = content.match(/project:\s*['"]([^'"]+\/[^'"]+)['"]/);
|
|
128
|
+
if (projectMatch) {
|
|
129
|
+
const [workspaceId, projectSlug] = projectMatch[1].split("/");
|
|
130
|
+
const localeMatch = content.match(/defaultLocale:\s*['"]([^'"]+)['"]/);
|
|
131
|
+
const cdnMatch = content.match(/cdnBaseUrl:\s*['"]([^'"]+)['"]/);
|
|
132
|
+
return {
|
|
133
|
+
workspaceId,
|
|
134
|
+
projectSlug,
|
|
135
|
+
defaultLocale: localeMatch?.[1] || "en",
|
|
136
|
+
cdnBaseUrl: cdnMatch?.[1],
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
// Fall back to old format: workspaceId + projectSlug (for backward compatibility)
|
|
128
140
|
const workspaceMatch = content.match(/workspaceId:\s*['"]([^'"]+)['"]/);
|
|
129
|
-
const
|
|
141
|
+
const projectSlugMatch = content.match(/projectSlug:\s*['"]([^'"]+)['"]/);
|
|
130
142
|
const localeMatch = content.match(/defaultLocale:\s*['"]([^'"]+)['"]/);
|
|
131
143
|
const cdnMatch = content.match(/cdnBaseUrl:\s*['"]([^'"]+)['"]/);
|
|
132
|
-
if (!workspaceMatch || !
|
|
133
|
-
throw new Error(`Invalid createI18n config in ${filePath}: missing
|
|
144
|
+
if (!workspaceMatch || !projectSlugMatch) {
|
|
145
|
+
throw new Error(`Invalid createI18n config in ${filePath}: missing project or workspaceId/projectSlug`);
|
|
134
146
|
}
|
|
135
147
|
return {
|
|
136
148
|
workspaceId: workspaceMatch[1],
|
|
137
|
-
projectSlug:
|
|
149
|
+
projectSlug: projectSlugMatch[1],
|
|
138
150
|
defaultLocale: localeMatch?.[1] || "en",
|
|
139
151
|
cdnBaseUrl: cdnMatch?.[1],
|
|
140
152
|
};
|
package/dist/context.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
10
10
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
11
11
|
import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
|
|
12
|
-
import {
|
|
12
|
+
import { createBetterI18nClient } from "./client.js";
|
|
13
13
|
import { detectProjectContext } from "./context.js";
|
|
14
14
|
import { bulkCreateKeys } from "./tools/bulkCreateKeys.js";
|
|
15
15
|
import { bulkUpdateTranslations } from "./tools/bulkUpdateTranslations.js";
|
|
@@ -17,9 +17,9 @@ import { createTranslationKey } from "./tools/createTranslationKey.js";
|
|
|
17
17
|
import { getProjectInfo } from "./tools/getProjectInfo.js";
|
|
18
18
|
import { listKeys } from "./tools/listKeys.js";
|
|
19
19
|
import { updateTranslation } from "./tools/updateTranslation.js";
|
|
20
|
-
class
|
|
20
|
+
class BetterI18nServer {
|
|
21
21
|
server;
|
|
22
|
-
|
|
22
|
+
apiClient;
|
|
23
23
|
context;
|
|
24
24
|
constructor() {
|
|
25
25
|
this.server = new Server({
|
|
@@ -31,16 +31,27 @@ class ParisI18nServer {
|
|
|
31
31
|
},
|
|
32
32
|
});
|
|
33
33
|
// Will be initialized in init()
|
|
34
|
-
this.
|
|
34
|
+
this.apiClient = null;
|
|
35
35
|
this.context = {
|
|
36
36
|
projectContext: null,
|
|
37
37
|
};
|
|
38
38
|
}
|
|
39
39
|
async init() {
|
|
40
|
-
//
|
|
41
|
-
|
|
40
|
+
// Auto-detect if running from source (local dev) vs npm package (production)
|
|
41
|
+
// If script path contains 'packages/mcp-server/src', we're in local development
|
|
42
|
+
const scriptPath = process.argv[1] || "";
|
|
43
|
+
const isLocalDev = scriptPath.includes("packages/mcp-server/src") ||
|
|
44
|
+
scriptPath.includes("better-i18n/packages/mcp-server");
|
|
45
|
+
// Read configuration from environment, with smart defaults
|
|
46
|
+
const apiUrl = process.env.BETTER_I18N_API_URL ||
|
|
47
|
+
(isLocalDev ? "http://localhost:8787" : "https://dash.better-i18n.com");
|
|
42
48
|
const apiKey = process.env.BETTER_I18N_API_KEY;
|
|
43
49
|
const envOrgId = process.env.BETTER_I18N_ORG_ID;
|
|
50
|
+
const debug = process.env.BETTER_I18N_DEBUG === "true" || isLocalDev;
|
|
51
|
+
console.error(`[better-i18n] Mode: ${isLocalDev ? "LOCAL DEV" : "PRODUCTION"}`);
|
|
52
|
+
console.error(`[better-i18n] API URL: ${apiUrl}`);
|
|
53
|
+
if (debug)
|
|
54
|
+
console.error(`[better-i18n] Debug mode: enabled`);
|
|
44
55
|
if (!apiKey) {
|
|
45
56
|
console.error("[better-i18n] ERROR: BETTER_I18N_API_KEY environment variable is required");
|
|
46
57
|
console.error("[better-i18n] Get your API key from: https://better-i18n.com/settings/api-keys");
|
|
@@ -70,8 +81,8 @@ class ParisI18nServer {
|
|
|
70
81
|
console.error("[better-i18n] Warning: Could not lookup organization ID:", err);
|
|
71
82
|
}
|
|
72
83
|
}
|
|
73
|
-
// Create
|
|
74
|
-
this.
|
|
84
|
+
// Create Better i18n API client with organization context
|
|
85
|
+
this.apiClient = createBetterI18nClient({ apiUrl, apiKey, organizationId, debug });
|
|
75
86
|
if (this.context.projectContext) {
|
|
76
87
|
console.error(`[better-i18n] Detected project: ${this.context.projectContext.workspaceId}/${this.context.projectContext.projectSlug}`);
|
|
77
88
|
}
|
|
@@ -99,22 +110,22 @@ class ParisI18nServer {
|
|
|
99
110
|
let result;
|
|
100
111
|
switch (name) {
|
|
101
112
|
case "getProjectInfo":
|
|
102
|
-
result = await getProjectInfo.execute(this.
|
|
113
|
+
result = await getProjectInfo.execute(this.apiClient, args, this.context);
|
|
103
114
|
break;
|
|
104
115
|
case "createTranslationKey":
|
|
105
|
-
result = await createTranslationKey.execute(this.
|
|
116
|
+
result = await createTranslationKey.execute(this.apiClient, args, this.context);
|
|
106
117
|
break;
|
|
107
118
|
case "updateTranslation":
|
|
108
|
-
result = await updateTranslation.execute(this.
|
|
119
|
+
result = await updateTranslation.execute(this.apiClient, args, this.context);
|
|
109
120
|
break;
|
|
110
121
|
case "listKeys":
|
|
111
|
-
result = await listKeys.execute(this.
|
|
122
|
+
result = await listKeys.execute(this.apiClient, args, this.context);
|
|
112
123
|
break;
|
|
113
124
|
case "bulkCreateKeys":
|
|
114
|
-
result = await bulkCreateKeys.execute(this.
|
|
125
|
+
result = await bulkCreateKeys.execute(this.apiClient, args, this.context);
|
|
115
126
|
break;
|
|
116
127
|
case "bulkUpdateTranslations":
|
|
117
|
-
result = await bulkUpdateTranslations.execute(this.
|
|
128
|
+
result = await bulkUpdateTranslations.execute(this.apiClient, args, this.context);
|
|
118
129
|
break;
|
|
119
130
|
default:
|
|
120
131
|
throw new Error(`Unknown tool: ${name}`);
|
|
@@ -141,7 +152,7 @@ class ParisI18nServer {
|
|
|
141
152
|
}
|
|
142
153
|
}
|
|
143
154
|
// Start the server
|
|
144
|
-
const server = new
|
|
155
|
+
const server = new BetterI18nServer();
|
|
145
156
|
server.init().then(() => server.run()).catch((error) => {
|
|
146
157
|
console.error("[better-i18n] Fatal error:", error);
|
|
147
158
|
process.exit(1);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/listKeys.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* listKeys MCP Tool
|
|
3
3
|
*
|
|
4
|
-
* Lists translation keys in a project with
|
|
5
|
-
* Uses the MCP-specific
|
|
4
|
+
* Lists ALL translation keys in a project with their source text and translations.
|
|
5
|
+
* Uses the MCP-specific getAllTranslations endpoint - no pagination needed.
|
|
6
6
|
*/
|
|
7
7
|
import type { Tool } from "../types/index.js";
|
|
8
8
|
export declare const listKeys: Tool;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"listKeys.d.ts","sourceRoot":"","sources":["../../src/tools/listKeys.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"listKeys.d.ts","sourceRoot":"","sources":["../../src/tools/listKeys.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAQ9C,eAAO,MAAM,QAAQ,EAAE,IA0EtB,CAAC"}
|
package/dist/tools/listKeys.js
CHANGED
|
@@ -1,22 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* listKeys MCP Tool
|
|
3
3
|
*
|
|
4
|
-
* Lists translation keys in a project with
|
|
5
|
-
* Uses the MCP-specific
|
|
4
|
+
* Lists ALL translation keys in a project with their source text and translations.
|
|
5
|
+
* Uses the MCP-specific getAllTranslations endpoint - no pagination needed.
|
|
6
6
|
*/
|
|
7
7
|
import { z } from "zod";
|
|
8
8
|
const inputSchema = z.object({
|
|
9
9
|
projectSlug: z.string().optional(),
|
|
10
10
|
search: z.string().optional(),
|
|
11
11
|
namespaces: z.array(z.string()).optional(),
|
|
12
|
-
missingLanguage: z.string().optional(),
|
|
13
|
-
page: z.number().min(1).default(1),
|
|
14
|
-
limit: z.number().min(1).max(100).default(50),
|
|
15
12
|
});
|
|
16
13
|
export const listKeys = {
|
|
17
14
|
definition: {
|
|
18
15
|
name: "listKeys",
|
|
19
|
-
description: "
|
|
16
|
+
description: "Get all translation keys with their source text and translations. Returns ALL keys in a single response - no pagination. Use 'search' to filter by key name or 'namespaces' to filter by namespace.",
|
|
20
17
|
inputSchema: {
|
|
21
18
|
type: "object",
|
|
22
19
|
properties: {
|
|
@@ -33,18 +30,6 @@ export const listKeys = {
|
|
|
33
30
|
items: { type: "string" },
|
|
34
31
|
description: "Filter by specific namespaces (e.g., ['nav', 'home'])",
|
|
35
32
|
},
|
|
36
|
-
missingLanguage: {
|
|
37
|
-
type: "string",
|
|
38
|
-
description: "Find keys that don't have a translation for this language code (e.g., 'tr' to find keys missing Turkish)",
|
|
39
|
-
},
|
|
40
|
-
page: {
|
|
41
|
-
type: "number",
|
|
42
|
-
description: "Page number (default: 1)",
|
|
43
|
-
},
|
|
44
|
-
limit: {
|
|
45
|
-
type: "number",
|
|
46
|
-
description: "Results per page (default: 50, max: 100)",
|
|
47
|
-
},
|
|
48
33
|
},
|
|
49
34
|
},
|
|
50
35
|
},
|
|
@@ -65,34 +50,18 @@ export const listKeys = {
|
|
|
65
50
|
};
|
|
66
51
|
}
|
|
67
52
|
try {
|
|
68
|
-
// Use
|
|
69
|
-
const result = await client.mcp.
|
|
53
|
+
// Use getAllTranslations endpoint - no pagination, single request
|
|
54
|
+
const result = await client.mcp.getAllTranslations.query({
|
|
70
55
|
orgSlug,
|
|
71
56
|
projectSlug,
|
|
72
57
|
search: input.search,
|
|
73
58
|
namespaces: input.namespaces,
|
|
74
|
-
missingLanguage: input.missingLanguage,
|
|
75
|
-
page: input.page,
|
|
76
|
-
limit: input.limit,
|
|
77
59
|
});
|
|
78
|
-
// Format the response
|
|
79
|
-
const summary = {
|
|
80
|
-
project: `${orgSlug}/${projectSlug}`,
|
|
81
|
-
page: input.page,
|
|
82
|
-
limit: input.limit,
|
|
83
|
-
total: result.total,
|
|
84
|
-
totalPages: Math.ceil(result.total / input.limit),
|
|
85
|
-
keysCount: result.keys.length,
|
|
86
|
-
...(input.missingLanguage && { missingLanguage: input.missingLanguage }),
|
|
87
|
-
};
|
|
88
60
|
return {
|
|
89
61
|
content: [
|
|
90
62
|
{
|
|
91
63
|
type: "text",
|
|
92
|
-
text: JSON.stringify(
|
|
93
|
-
summary,
|
|
94
|
-
keys: result.keys,
|
|
95
|
-
}, null, 2),
|
|
64
|
+
text: JSON.stringify(result, null, 2),
|
|
96
65
|
},
|
|
97
66
|
],
|
|
98
67
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"listKeys.js","sourceRoot":"","sources":["../../src/tools/listKeys.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;
|
|
1
|
+
{"version":3,"file":"listKeys.js","sourceRoot":"","sources":["../../src/tools/listKeys.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CAC3C,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,QAAQ,GAAS;IAC5B,UAAU,EAAE;QACV,IAAI,EAAE,UAAU;QAChB,WAAW,EACT,qMAAqM;QACvM,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,WAAW,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,kDAAkD;iBAChE;gBACD,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,oEAAoE;iBAClF;gBACD,UAAU,EAAE;oBACV,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACzB,WAAW,EAAE,uDAAuD;iBACrE;aACF;SACF;KACF;IAED,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO;QACjC,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAEtC,wCAAwC;QACxC,MAAM,WAAW,GACf,KAAK,CAAC,WAAW,IAAI,OAAO,CAAC,cAAc,EAAE,WAAW,CAAC;QAC3D,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,EAAE,WAAW,CAAC;QAEpD,IAAI,CAAC,WAAW,IAAI,CAAC,OAAO,EAAE,CAAC;YAC7B,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,uEAAuE;qBAC9E;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,kEAAkE;YAClE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,kBAAkB,CAAC,KAAK,CAAC;gBACvD,OAAO;gBACP,WAAW;gBACX,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,UAAU,EAAE,KAAK,CAAC,UAAU;aAC7B,CAAC,CAAC;YAEH,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;qBACtC;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,uBAAuB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;qBACtF;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@better-i18n/mcp-server",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "MCP server for Better i18n translation management - AI-powered translation workflow for Cursor, Claude, and other AI assistants",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|