@better-i18n/mcp 0.15.3 → 0.15.5
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/dist/__tests__/base-tool.test.d.ts +2 -0
- package/dist/__tests__/base-tool.test.d.ts.map +1 -0
- package/dist/__tests__/base-tool.test.js +193 -0
- package/dist/__tests__/base-tool.test.js.map +1 -0
- package/dist/__tests__/contract.test.d.ts +24 -0
- package/dist/__tests__/contract.test.d.ts.map +1 -0
- package/dist/__tests__/contract.test.js +919 -0
- package/dist/__tests__/contract.test.js.map +1 -0
- package/dist/__tests__/fixtures/mock-client.d.ts +11 -0
- package/dist/__tests__/fixtures/mock-client.d.ts.map +1 -0
- package/dist/__tests__/fixtures/mock-client.js +33 -0
- package/dist/__tests__/fixtures/mock-client.js.map +1 -0
- package/dist/__tests__/helpers.d.ts +10 -0
- package/dist/__tests__/helpers.d.ts.map +1 -0
- package/dist/__tests__/helpers.js +27 -0
- package/dist/__tests__/helpers.js.map +1 -0
- package/dist/__tests__/schema-alignment.test.d.ts +15 -0
- package/dist/__tests__/schema-alignment.test.d.ts.map +1 -0
- package/dist/__tests__/schema-alignment.test.js +1011 -0
- package/dist/__tests__/schema-alignment.test.js.map +1 -0
- package/dist/__tests__/server-dispatch.test.d.ts +10 -0
- package/dist/__tests__/server-dispatch.test.d.ts.map +1 -0
- package/dist/__tests__/server-dispatch.test.js +202 -0
- package/dist/__tests__/server-dispatch.test.js.map +1 -0
- package/dist/tools/__tests__/createKeys.test.d.ts +2 -0
- package/dist/tools/__tests__/createKeys.test.d.ts.map +1 -0
- package/dist/tools/__tests__/createKeys.test.js +139 -0
- package/dist/tools/__tests__/createKeys.test.js.map +1 -0
- package/dist/tools/__tests__/deleteKeys.test.d.ts +2 -0
- package/dist/tools/__tests__/deleteKeys.test.d.ts.map +1 -0
- package/dist/tools/__tests__/deleteKeys.test.js +91 -0
- package/dist/tools/__tests__/deleteKeys.test.js.map +1 -0
- package/dist/tools/__tests__/getPendingChanges.test.d.ts +2 -0
- package/dist/tools/__tests__/getPendingChanges.test.d.ts.map +1 -0
- package/dist/tools/__tests__/getPendingChanges.test.js +50 -0
- package/dist/tools/__tests__/getPendingChanges.test.js.map +1 -0
- package/dist/tools/__tests__/getProject.test.d.ts +2 -0
- package/dist/tools/__tests__/getProject.test.d.ts.map +1 -0
- package/dist/tools/__tests__/getProject.test.js +55 -0
- package/dist/tools/__tests__/getProject.test.js.map +1 -0
- package/dist/tools/__tests__/getSync.test.d.ts +2 -0
- package/dist/tools/__tests__/getSync.test.d.ts.map +1 -0
- package/dist/tools/__tests__/getSync.test.js +42 -0
- package/dist/tools/__tests__/getSync.test.js.map +1 -0
- package/dist/tools/__tests__/getSyncs.test.d.ts +2 -0
- package/dist/tools/__tests__/getSyncs.test.d.ts.map +1 -0
- package/dist/tools/__tests__/getSyncs.test.js +66 -0
- package/dist/tools/__tests__/getSyncs.test.js.map +1 -0
- package/dist/tools/__tests__/getTranslations.test.d.ts +2 -0
- package/dist/tools/__tests__/getTranslations.test.d.ts.map +1 -0
- package/dist/tools/__tests__/getTranslations.test.js +114 -0
- package/dist/tools/__tests__/getTranslations.test.js.map +1 -0
- package/dist/tools/__tests__/listKeys.test.d.ts +2 -0
- package/dist/tools/__tests__/listKeys.test.d.ts.map +1 -0
- package/dist/tools/__tests__/listKeys.test.js +98 -0
- package/dist/tools/__tests__/listKeys.test.js.map +1 -0
- package/dist/tools/__tests__/listProjects.test.d.ts +2 -0
- package/dist/tools/__tests__/listProjects.test.d.ts.map +1 -0
- package/dist/tools/__tests__/listProjects.test.js +45 -0
- package/dist/tools/__tests__/listProjects.test.js.map +1 -0
- package/dist/tools/__tests__/proposeLanguageEdits.test.d.ts +2 -0
- package/dist/tools/__tests__/proposeLanguageEdits.test.d.ts.map +1 -0
- package/dist/tools/__tests__/proposeLanguageEdits.test.js +87 -0
- package/dist/tools/__tests__/proposeLanguageEdits.test.js.map +1 -0
- package/dist/tools/__tests__/proposeLanguages.test.d.ts +2 -0
- package/dist/tools/__tests__/proposeLanguages.test.d.ts.map +1 -0
- package/dist/tools/__tests__/proposeLanguages.test.js +109 -0
- package/dist/tools/__tests__/proposeLanguages.test.js.map +1 -0
- package/dist/tools/__tests__/publishTranslations.test.d.ts +2 -0
- package/dist/tools/__tests__/publishTranslations.test.d.ts.map +1 -0
- package/dist/tools/__tests__/publishTranslations.test.js +127 -0
- package/dist/tools/__tests__/publishTranslations.test.js.map +1 -0
- package/dist/tools/__tests__/updateKeys.test.d.ts +2 -0
- package/dist/tools/__tests__/updateKeys.test.d.ts.map +1 -0
- package/dist/tools/__tests__/updateKeys.test.js +122 -0
- package/dist/tools/__tests__/updateKeys.test.js.map +1 -0
- package/dist/tools/createKeys.d.ts.map +1 -1
- package/dist/tools/createKeys.js +19 -7
- package/dist/tools/createKeys.js.map +1 -1
- package/dist/tools/deleteKeys.d.ts.map +1 -1
- package/dist/tools/deleteKeys.js +9 -1
- package/dist/tools/deleteKeys.js.map +1 -1
- package/dist/tools/getProject.d.ts.map +1 -1
- package/dist/tools/getProject.js +2 -1
- package/dist/tools/getProject.js.map +1 -1
- package/dist/tools/getTranslations.d.ts +1 -1
- package/dist/tools/getTranslations.js +4 -4
- package/dist/tools/getTranslations.js.map +1 -1
- package/dist/tools/publishTranslations.d.ts.map +1 -1
- package/dist/tools/publishTranslations.js +12 -3
- package/dist/tools/publishTranslations.js.map +1 -1
- package/dist/tools/updateKeys.d.ts.map +1 -1
- package/dist/tools/updateKeys.js +8 -3
- package/dist/tools/updateKeys.js.map +1 -1
- package/dist/worker.test.d.ts +16 -0
- package/dist/worker.test.d.ts.map +1 -0
- package/dist/worker.test.js +244 -0
- package/dist/worker.test.js.map +1 -0
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getProject.js","sourceRoot":"","sources":["../../src/tools/getProject.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,WAAW,EACX,oBAAoB,EACpB,aAAa,EACb,OAAO,GACR,MAAM,iBAAiB,CAAC;AAGzB,MAAM,WAAW,GAAG,aAAa,CAAC;AAElC,MAAM,CAAC,MAAM,UAAU,GAAS;IAC9B,UAAU,EAAE;QACV,IAAI,EAAE,YAAY;QAClB,WAAW,EACT,4FAA4F;YAC5F,
|
|
1
|
+
{"version":3,"file":"getProject.js","sourceRoot":"","sources":["../../src/tools/getProject.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,WAAW,EACX,oBAAoB,EACpB,aAAa,EACb,OAAO,GACR,MAAM,iBAAiB,CAAC;AAGzB,MAAM,WAAW,GAAG,aAAa,CAAC;AAElC,MAAM,CAAC,MAAM,UAAU,GAAS;IAC9B,UAAU,EAAE;QACV,IAAI,EAAE,YAAY;QAClB,WAAW,EACT,4FAA4F;YAC5F,qFAAqF;YACrF,6EAA6E;YAC7E,6GAA6G;YAC7G,+EAA+E;YAC/E,wEAAwE;YACxE,qEAAqE;QACvE,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,GAAG,oBAAoB;aACxB;YACD,QAAQ,EAAE,CAAC,SAAS,CAAC;SACtB;KACF;IAED,OAAO,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CACxB,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,EAAE;QAC3E,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC;YAC/C,OAAO,EAAE,WAAW;YACpB,WAAW;SACZ,CAAC,CAAC;QACH,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC,CAAC;CACL,CAAC"}
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* SEARCH + FILTER:
|
|
11
11
|
* - search: Text to search for (in source text or specified languages)
|
|
12
12
|
* - languages: Which languages to search in AND return translations for
|
|
13
|
-
* - status: Filter by translation status ("missing", "draft", "
|
|
13
|
+
* - status: Filter by translation status ("missing", "draft", "published", "all")
|
|
14
14
|
* - namespaces: Filter by namespace(s)
|
|
15
15
|
* - keys: Fetch specific keys by exact name
|
|
16
16
|
* - limit: Max keys to return (1–200, default 100)
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* SEARCH + FILTER:
|
|
11
11
|
* - search: Text to search for (in source text or specified languages)
|
|
12
12
|
* - languages: Which languages to search in AND return translations for
|
|
13
|
-
* - status: Filter by translation status ("missing", "draft", "
|
|
13
|
+
* - status: Filter by translation status ("missing", "draft", "published", "all")
|
|
14
14
|
* - namespaces: Filter by namespace(s)
|
|
15
15
|
* - keys: Fetch specific keys by exact name
|
|
16
16
|
* - limit: Max keys to return (1–200, default 100)
|
|
@@ -35,7 +35,7 @@ const inputSchema = projectSchema.extend({
|
|
|
35
35
|
languages: z.array(z.string()).optional(),
|
|
36
36
|
namespaces: z.array(z.string()).optional(),
|
|
37
37
|
keys: z.array(z.string()).optional(),
|
|
38
|
-
status: z.enum(["missing", "draft", "
|
|
38
|
+
status: z.enum(["missing", "draft", "published", "all"]).optional(),
|
|
39
39
|
limit: z.number().min(1).max(200).optional(),
|
|
40
40
|
});
|
|
41
41
|
export const getTranslations = {
|
|
@@ -53,7 +53,7 @@ Always pair: { languages: ["hr"], status: "missing" }
|
|
|
53
53
|
SEARCH + FILTER:
|
|
54
54
|
- search: Text to search for (in source text or specified languages)
|
|
55
55
|
- languages: Languages to search in AND return translations for
|
|
56
|
-
- status: Filter by translation status ("missing", "draft", "
|
|
56
|
+
- status: Filter by translation status ("missing", "draft", "published", "all")
|
|
57
57
|
- namespaces: Filter by namespace(s)
|
|
58
58
|
- keys: Fetch specific keys by exact name
|
|
59
59
|
- limit: Max keys (1–200, default 100)
|
|
@@ -97,7 +97,7 @@ Response includes namespaceDetails: a map of namespace metadata (name, keyCount,
|
|
|
97
97
|
},
|
|
98
98
|
status: {
|
|
99
99
|
type: "string",
|
|
100
|
-
enum: ["missing", "draft", "
|
|
100
|
+
enum: ["missing", "draft", "published", "all"],
|
|
101
101
|
description: "Filter by translation status. WARNING: ignored without languages parameter. Always use with languages: ['hr']. Default: all.",
|
|
102
102
|
},
|
|
103
103
|
limit: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getTranslations.js","sourceRoot":"","sources":["../../src/tools/getTranslations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,WAAW,EACX,oBAAoB,EACpB,aAAa,EACb,OAAO,GACR,MAAM,iBAAiB,CAAC;AAGzB,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC;IACvC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC7D,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACzC,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC1C,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACpC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"getTranslations.js","sourceRoot":"","sources":["../../src/tools/getTranslations.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publishTranslations.d.ts","sourceRoot":"","sources":["../../src/tools/publishTranslations.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAa9C,eAAO,MAAM,mBAAmB,EAAE,
|
|
1
|
+
{"version":3,"file":"publishTranslations.d.ts","sourceRoot":"","sources":["../../src/tools/publishTranslations.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAa9C,eAAO,MAAM,mBAAmB,EAAE,IA4DjC,CAAC"}
|
|
@@ -13,13 +13,22 @@ export const publishTranslations = {
|
|
|
13
13
|
name: "publishTranslations",
|
|
14
14
|
description: `Deploy pending changes to production (CDN or GitHub).
|
|
15
15
|
|
|
16
|
-
⚠️ PRODUCTION IMPACT
|
|
17
|
-
|
|
16
|
+
⚠️ PRODUCTION IMPACT — deploys to live systems.
|
|
17
|
+
|
|
18
|
+
REQUIRED WORKFLOW (follow in order):
|
|
19
|
+
1. Call getPendingChanges FIRST to see what will be deployed.
|
|
20
|
+
2. Check 'cannotPublishReason' — if set, publishing is blocked (fix the issue first).
|
|
21
|
+
3. Review the changes, then call publishTranslations.
|
|
22
|
+
4. Use getSync(syncId) to verify completion.
|
|
23
|
+
|
|
24
|
+
⚠️ COOLDOWN: 30-second per-project cooldown between publishes. Calling too frequently returns TOO_MANY_REQUESTS error. Wait and retry.
|
|
25
|
+
|
|
26
|
+
⚠️ PERMANENT DELETION: Soft-deleted keys (from deleteKeys) become permanently deleted after publish. There is NO way to recover them. Verify with getPendingChanges → deletedKeys before publishing.
|
|
18
27
|
|
|
19
28
|
If translations array is omitted, ALL pending changes are published.
|
|
20
29
|
If translations array is provided, only those specific items are published.
|
|
21
30
|
|
|
22
|
-
Returns syncJobIds
|
|
31
|
+
Returns syncJobIds — use getSync(syncId) to verify deployment completed successfully.`,
|
|
23
32
|
inputSchema: {
|
|
24
33
|
type: "object",
|
|
25
34
|
properties: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publishTranslations.js","sourceRoot":"","sources":["../../src/tools/publishTranslations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,WAAW,EACX,oBAAoB,EACpB,aAAa,EACb,OAAO,GACR,MAAM,iBAAiB,CAAC;AAGzB,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC;IACvC,YAAY,EAAE,CAAC;SACZ,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;QACP,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;KACzB,CAAC,CACH;SACA,QAAQ,EAAE;CACd,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAS;IACvC,UAAU,EAAE;QACV,IAAI,EAAE,qBAAqB;QAC3B,WAAW,EAAE
|
|
1
|
+
{"version":3,"file":"publishTranslations.js","sourceRoot":"","sources":["../../src/tools/publishTranslations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,WAAW,EACX,oBAAoB,EACpB,aAAa,EACb,OAAO,GACR,MAAM,iBAAiB,CAAC;AAGzB,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC;IACvC,YAAY,EAAE,CAAC;SACZ,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;QACP,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;KACzB,CAAC,CACH;SACA,QAAQ,EAAE;CACd,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAS;IACvC,UAAU,EAAE;QACV,IAAI,EAAE,qBAAqB;QAC3B,WAAW,EAAE;;;;;;;;;;;;;;;;;sFAiBqE;QAClF,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,GAAG,oBAAoB;gBACvB,YAAY,EAAE;oBACZ,IAAI,EAAE,OAAO;oBACb,WAAW,EACT,kFAAkF;oBACpF,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sBAAsB,EAAE;4BAC9D,YAAY,EAAE;gCACZ,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,4BAA4B;6BAC1C;yBACF;wBACD,QAAQ,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC;qBACpC;iBACF;aACF;YACD,QAAQ,EAAE,CAAC,SAAS,CAAC;SACtB;KACF;IACD,OAAO,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CACxB,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,EAAE;QAC3E,wCAAwC;QACxC,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACjD,GAAG,CAAC;YACJ,YAAY,EAAE,CAAC,CAAC,YAAY,CAAC,WAAW,EAAE;SAC3C,CAAC,CAAC,CAAC;QAEJ,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC,MAAM,CAAC;YACzD,OAAO,EAAE,WAAW;YACpB,WAAW;YACX,YAAY;SACb,CAAC,CAAC;QACH,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC,CAAC;CACL,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"updateKeys.d.ts","sourceRoot":"","sources":["../../src/tools/updateKeys.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AASH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAc9C,eAAO,MAAM,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"updateKeys.d.ts","sourceRoot":"","sources":["../../src/tools/updateKeys.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AASH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAc9C,eAAO,MAAM,UAAU,EAAE,IA2DxB,CAAC"}
|
package/dist/tools/updateKeys.js
CHANGED
|
@@ -15,7 +15,7 @@ const inputSchema = projectSchema.extend({
|
|
|
15
15
|
l: z.string().describe("Language code (e.g., 'tr', 'de')"),
|
|
16
16
|
t: z.string().describe("Translation text"),
|
|
17
17
|
s: z.boolean().optional().describe("true if updating source language text"),
|
|
18
|
-
st: z.string().optional().describe("Translation status (e.g., '
|
|
18
|
+
st: z.string().optional().describe("Translation status (e.g., 'published')"),
|
|
19
19
|
})).min(1),
|
|
20
20
|
});
|
|
21
21
|
export const updateKeys = {
|
|
@@ -27,7 +27,12 @@ WORKFLOW to add missing translations:
|
|
|
27
27
|
1. listKeys({ missingLanguage: 'hr', fields: ['id'] }) → get UUIDs
|
|
28
28
|
2. updateKeys({ t: [{ id: '<uuid>', l: 'hr', t: '<translation>' }] })
|
|
29
29
|
|
|
30
|
-
Each entry updates ONE language for ONE key. Set s=true to update the source text
|
|
30
|
+
Each entry updates ONE language for ONE key. Set s=true to update the source text.
|
|
31
|
+
|
|
32
|
+
IMPORTANT:
|
|
33
|
+
- 'id' MUST be a UUID (from listKeys/getTranslations id field), NOT a key name.
|
|
34
|
+
- Check 'notFound' in response — lists IDs that didn't match any key.
|
|
35
|
+
- Human-approved translations are silently overwritten with no confirmation.`,
|
|
31
36
|
inputSchema: {
|
|
32
37
|
type: "object",
|
|
33
38
|
properties: {
|
|
@@ -42,7 +47,7 @@ Each entry updates ONE language for ONE key. Set s=true to update the source tex
|
|
|
42
47
|
l: { type: "string", description: "Language code (e.g., 'tr', 'de')" },
|
|
43
48
|
t: { type: "string", description: "Translation text" },
|
|
44
49
|
s: { type: "boolean", description: "true if updating source language text" },
|
|
45
|
-
st: { type: "string", description: "Translation status (e.g., '
|
|
50
|
+
st: { type: "string", description: "Translation status (e.g., 'published')" },
|
|
46
51
|
},
|
|
47
52
|
required: ["id", "l", "t"],
|
|
48
53
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"updateKeys.js","sourceRoot":"","sources":["../../src/tools/updateKeys.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,WAAW,EACX,oBAAoB,EACpB,aAAa,EACb,OAAO,GACR,MAAM,iBAAiB,CAAC;AAGzB,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC;IACvC,CAAC,EAAE,CAAC,CAAC,KAAK,CACR,CAAC,CAAC,MAAM,CAAC;QACP,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oFAAoF,CAAC;QAC7G,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;QAC1D,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;QAC1C,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;QAC3E,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"updateKeys.js","sourceRoot":"","sources":["../../src/tools/updateKeys.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,WAAW,EACX,oBAAoB,EACpB,aAAa,EACb,OAAO,GACR,MAAM,iBAAiB,CAAC;AAGzB,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC;IACvC,CAAC,EAAE,CAAC,CAAC,KAAK,CACR,CAAC,CAAC,MAAM,CAAC;QACP,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oFAAoF,CAAC;QAC7G,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;QAC1D,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;QAC1C,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;QAC3E,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;KAC7E,CAAC,CACH,CAAC,GAAG,CAAC,CAAC,CAAC;CACT,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,UAAU,GAAS;IAC9B,UAAU,EAAE;QACV,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE;;;;;;;;;;;6EAW4D;QACzE,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,GAAG,oBAAoB;gBACvB,CAAC,EAAE;oBACD,IAAI,EAAE,OAAO;oBACb,WAAW,EAAE,4EAA4E;oBACzF,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oFAAoF,EAAE;4BACzH,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kCAAkC,EAAE;4BACtE,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kBAAkB,EAAE;4BACtD,CAAC,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,uCAAuC,EAAE;4BAC5E,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,wCAAwC,EAAE;yBAC9E;wBACD,QAAQ,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC;qBAC3B;iBACF;aACF;YACD,QAAQ,EAAE,CAAC,SAAS,EAAE,GAAG,CAAC;SAC3B;KACF;IAED,OAAO,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CACxB,WAAW,CACT,IAAI,EACJ,WAAW,EACX,KAAK,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,EAAE;QAC5C,wCAAwC;QACxC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC7B,GAAG,IAAI;YACP,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE;SACxB,CAAC,CAAC,CAAC;QAEJ,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC;YAChD,OAAO,EAAE,WAAW;YACpB,WAAW;YACX,CAAC;SACF,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC,CACF;CACJ,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* worker.test.ts
|
|
3
|
+
*
|
|
4
|
+
* Tests for the Cloudflare Worker fetch handler exported from worker.ts.
|
|
5
|
+
*
|
|
6
|
+
* Strategy:
|
|
7
|
+
* - CORS, health, OAuth discovery, and auth-gate paths are pure HTTP
|
|
8
|
+
* logic and can be tested without any external services.
|
|
9
|
+
* - POST /mcp requests that pass auth will attempt to create a real
|
|
10
|
+
* tRPC client and MCP transport. Those calls will fail at the network
|
|
11
|
+
* layer (no live API), so we assert they do NOT return 401 (auth passed)
|
|
12
|
+
* and accept either a 4xx/5xx from the transport error path or a
|
|
13
|
+
* structured error response.
|
|
14
|
+
*/
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=worker.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.test.d.ts","sourceRoot":"","sources":["../src/worker.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG"}
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* worker.test.ts
|
|
3
|
+
*
|
|
4
|
+
* Tests for the Cloudflare Worker fetch handler exported from worker.ts.
|
|
5
|
+
*
|
|
6
|
+
* Strategy:
|
|
7
|
+
* - CORS, health, OAuth discovery, and auth-gate paths are pure HTTP
|
|
8
|
+
* logic and can be tested without any external services.
|
|
9
|
+
* - POST /mcp requests that pass auth will attempt to create a real
|
|
10
|
+
* tRPC client and MCP transport. Those calls will fail at the network
|
|
11
|
+
* layer (no live API), so we assert they do NOT return 401 (auth passed)
|
|
12
|
+
* and accept either a 4xx/5xx from the transport error path or a
|
|
13
|
+
* structured error response.
|
|
14
|
+
*/
|
|
15
|
+
import { describe, it, expect } from "vitest";
|
|
16
|
+
import worker from "./worker.js";
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
// Helpers
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
const BASE_URL = "https://mcp.test";
|
|
21
|
+
function makeRequest(path, method = "GET", headers = {}, body) {
|
|
22
|
+
return new Request(`${BASE_URL}${path}`, {
|
|
23
|
+
method,
|
|
24
|
+
headers,
|
|
25
|
+
body,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
/** Minimal Env with no service bindings */
|
|
29
|
+
const emptyEnv = {};
|
|
30
|
+
/** Env with a fake AUTH_API service binding (for OAuth error path tests) */
|
|
31
|
+
const envWithFakeAuthApi = {
|
|
32
|
+
AUTH_API: {
|
|
33
|
+
fetch: async () => new Response(JSON.stringify({ error: "unauthorized" }), { status: 401 }),
|
|
34
|
+
},
|
|
35
|
+
MCP_SERVICE_SECRET: "test-secret",
|
|
36
|
+
};
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
// CORS
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
describe("Worker — CORS preflight", () => {
|
|
41
|
+
it("OPTIONS returns 204 with CORS headers", async () => {
|
|
42
|
+
const req = makeRequest("/mcp", "OPTIONS");
|
|
43
|
+
const res = await worker.fetch(req, emptyEnv);
|
|
44
|
+
expect(res.status).toBe(204);
|
|
45
|
+
expect(res.headers.get("Access-Control-Allow-Origin")).toBe("*");
|
|
46
|
+
expect(res.headers.get("Access-Control-Allow-Methods")).toContain("POST");
|
|
47
|
+
expect(res.headers.get("Access-Control-Allow-Headers")).toContain("Authorization");
|
|
48
|
+
});
|
|
49
|
+
it("OPTIONS on any path returns 204", async () => {
|
|
50
|
+
const req = makeRequest("/health", "OPTIONS");
|
|
51
|
+
const res = await worker.fetch(req, emptyEnv);
|
|
52
|
+
expect(res.status).toBe(204);
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
// ---------------------------------------------------------------------------
|
|
56
|
+
// Health check
|
|
57
|
+
// ---------------------------------------------------------------------------
|
|
58
|
+
describe("Worker — health endpoint", () => {
|
|
59
|
+
it("GET /health returns 200 with status ok", async () => {
|
|
60
|
+
const req = makeRequest("/health");
|
|
61
|
+
const res = await worker.fetch(req, emptyEnv);
|
|
62
|
+
expect(res.status).toBe(200);
|
|
63
|
+
const body = (await res.json());
|
|
64
|
+
expect(body.status).toBe("ok");
|
|
65
|
+
expect(body.runtime).toBe("cloudflare-workers");
|
|
66
|
+
});
|
|
67
|
+
it("GET /health response has Content-Type application/json", async () => {
|
|
68
|
+
const req = makeRequest("/health");
|
|
69
|
+
const res = await worker.fetch(req, emptyEnv);
|
|
70
|
+
expect(res.headers.get("Content-Type")).toContain("application/json");
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
// ---------------------------------------------------------------------------
|
|
74
|
+
// OAuth discovery — Protected Resource Metadata (RFC 9728)
|
|
75
|
+
// ---------------------------------------------------------------------------
|
|
76
|
+
describe("Worker — OAuth discovery", () => {
|
|
77
|
+
it("GET /.well-known/oauth-protected-resource returns 200 with required fields", async () => {
|
|
78
|
+
const req = makeRequest("/.well-known/oauth-protected-resource");
|
|
79
|
+
const res = await worker.fetch(req, emptyEnv);
|
|
80
|
+
expect(res.status).toBe(200);
|
|
81
|
+
const body = (await res.json());
|
|
82
|
+
expect(body).toHaveProperty("resource");
|
|
83
|
+
expect(body).toHaveProperty("authorization_servers");
|
|
84
|
+
expect(body).toHaveProperty("bearer_methods_supported");
|
|
85
|
+
expect(body.bearer_methods_supported).toContain("header");
|
|
86
|
+
});
|
|
87
|
+
it("GET /.well-known/oauth-protected-resource resource points to request host", async () => {
|
|
88
|
+
const req = makeRequest("/.well-known/oauth-protected-resource");
|
|
89
|
+
const res = await worker.fetch(req, emptyEnv);
|
|
90
|
+
const body = (await res.json());
|
|
91
|
+
expect(body.resource).toBe("https://mcp.test");
|
|
92
|
+
});
|
|
93
|
+
it("GET /.well-known/oauth-authorization-server returns 200 with required fields", async () => {
|
|
94
|
+
const req = makeRequest("/.well-known/oauth-authorization-server");
|
|
95
|
+
const res = await worker.fetch(req, emptyEnv);
|
|
96
|
+
expect(res.status).toBe(200);
|
|
97
|
+
const body = (await res.json());
|
|
98
|
+
expect(body).toHaveProperty("issuer");
|
|
99
|
+
expect(body).toHaveProperty("authorization_endpoint");
|
|
100
|
+
expect(body).toHaveProperty("token_endpoint");
|
|
101
|
+
expect(body).toHaveProperty("code_challenge_methods_supported");
|
|
102
|
+
});
|
|
103
|
+
it("GET /.well-known/oauth-authorization-server supports S256 PKCE", async () => {
|
|
104
|
+
const req = makeRequest("/.well-known/oauth-authorization-server");
|
|
105
|
+
const res = await worker.fetch(req, emptyEnv);
|
|
106
|
+
const body = (await res.json());
|
|
107
|
+
expect(body.code_challenge_methods_supported).toContain("S256");
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
// ---------------------------------------------------------------------------
|
|
111
|
+
// MCP endpoint — authentication gate
|
|
112
|
+
// ---------------------------------------------------------------------------
|
|
113
|
+
describe("Worker — /mcp auth gate", () => {
|
|
114
|
+
it("POST /mcp without Authorization header returns 401", async () => {
|
|
115
|
+
const req = makeRequest("/mcp", "POST", {}, "{}");
|
|
116
|
+
const res = await worker.fetch(req, emptyEnv);
|
|
117
|
+
expect(res.status).toBe(401);
|
|
118
|
+
});
|
|
119
|
+
it("POST /mcp without Authorization header has WWW-Authenticate header", async () => {
|
|
120
|
+
const req = makeRequest("/mcp", "POST", {}, "{}");
|
|
121
|
+
const res = await worker.fetch(req, emptyEnv);
|
|
122
|
+
expect(res.headers.get("WWW-Authenticate")).toBeTruthy();
|
|
123
|
+
expect(res.headers.get("WWW-Authenticate")).toContain("Bearer");
|
|
124
|
+
});
|
|
125
|
+
it("POST /mcp with empty Authorization header returns 401", async () => {
|
|
126
|
+
const req = makeRequest("/mcp", "POST", { Authorization: "" }, "{}");
|
|
127
|
+
const res = await worker.fetch(req, emptyEnv);
|
|
128
|
+
expect(res.status).toBe(401);
|
|
129
|
+
});
|
|
130
|
+
it("POST /mcp with malformed Authorization (no Bearer prefix) returns 401", async () => {
|
|
131
|
+
const req = makeRequest("/mcp", "POST", { Authorization: "Basic abc123" }, "{}");
|
|
132
|
+
const res = await worker.fetch(req, emptyEnv);
|
|
133
|
+
expect(res.status).toBe(401);
|
|
134
|
+
});
|
|
135
|
+
it("GET /mcp without token returns 401", async () => {
|
|
136
|
+
const req = makeRequest("/mcp", "GET");
|
|
137
|
+
const res = await worker.fetch(req, emptyEnv);
|
|
138
|
+
expect(res.status).toBe(401);
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
// ---------------------------------------------------------------------------
|
|
142
|
+
// MCP endpoint — API key auth path (bi- prefix)
|
|
143
|
+
// ---------------------------------------------------------------------------
|
|
144
|
+
describe("Worker — /mcp API key auth (bi- prefix)", () => {
|
|
145
|
+
it("GET /mcp with bi- prefix token returns 200 SSE stream", async () => {
|
|
146
|
+
const req = makeRequest("/mcp", "GET", {
|
|
147
|
+
Authorization: "Bearer bi-test-api-key",
|
|
148
|
+
});
|
|
149
|
+
const res = await worker.fetch(req, emptyEnv);
|
|
150
|
+
// Auth passed — worker returns an SSE stream
|
|
151
|
+
expect(res.status).toBe(200);
|
|
152
|
+
expect(res.headers.get("Content-Type")).toContain("text/event-stream");
|
|
153
|
+
});
|
|
154
|
+
it("GET /mcp SSE response has CORS headers when authenticated", async () => {
|
|
155
|
+
const req = makeRequest("/mcp", "GET", {
|
|
156
|
+
Authorization: "Bearer bi-abc",
|
|
157
|
+
});
|
|
158
|
+
const res = await worker.fetch(req, emptyEnv);
|
|
159
|
+
expect(res.headers.get("Access-Control-Allow-Origin")).toBe("*");
|
|
160
|
+
});
|
|
161
|
+
it("POST /mcp with bi- prefix token does not return 401 (auth passed)", async () => {
|
|
162
|
+
const req = makeRequest("/mcp", "POST", {
|
|
163
|
+
Authorization: "Bearer bi-test-api-key",
|
|
164
|
+
"Content-Type": "application/json",
|
|
165
|
+
}, JSON.stringify({
|
|
166
|
+
jsonrpc: "2.0",
|
|
167
|
+
id: 1,
|
|
168
|
+
method: "tools/list",
|
|
169
|
+
params: {},
|
|
170
|
+
}));
|
|
171
|
+
// The handler will attempt a real tRPC call and likely error at the
|
|
172
|
+
// network layer, but it MUST NOT return 401 — the auth gate was passed.
|
|
173
|
+
const res = await worker.fetch(req, emptyEnv);
|
|
174
|
+
expect(res.status).not.toBe(401);
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
// ---------------------------------------------------------------------------
|
|
178
|
+
// MCP endpoint — OAuth token path (no AUTH_API binding)
|
|
179
|
+
// ---------------------------------------------------------------------------
|
|
180
|
+
describe("Worker — /mcp OAuth token path", () => {
|
|
181
|
+
it("POST /mcp with OAuth token but no AUTH_API returns 500", async () => {
|
|
182
|
+
const req = makeRequest("/mcp", "POST", {
|
|
183
|
+
Authorization: "Bearer oauth-token-without-bi-prefix",
|
|
184
|
+
"Content-Type": "application/json",
|
|
185
|
+
}, "{}");
|
|
186
|
+
// No AUTH_API service binding → explicit 500 error
|
|
187
|
+
const res = await worker.fetch(req, emptyEnv);
|
|
188
|
+
expect(res.status).toBe(500);
|
|
189
|
+
const body = (await res.json());
|
|
190
|
+
expect(typeof body.error).toBe("string");
|
|
191
|
+
expect(body.error.toLowerCase()).toContain("oauth");
|
|
192
|
+
});
|
|
193
|
+
it("POST /mcp with OAuth token but only AUTH_API (no MCP_SERVICE_SECRET) returns 500", async () => {
|
|
194
|
+
const envWithOnlyAuthApi = {
|
|
195
|
+
AUTH_API: {
|
|
196
|
+
fetch: async () => new Response(JSON.stringify({}), { status: 200 }),
|
|
197
|
+
},
|
|
198
|
+
// MCP_SERVICE_SECRET intentionally omitted
|
|
199
|
+
};
|
|
200
|
+
const req = makeRequest("/mcp", "POST", {
|
|
201
|
+
Authorization: "Bearer some-oauth-token",
|
|
202
|
+
"Content-Type": "application/json",
|
|
203
|
+
}, "{}");
|
|
204
|
+
const res = await worker.fetch(req, envWithOnlyAuthApi);
|
|
205
|
+
expect(res.status).toBe(500);
|
|
206
|
+
});
|
|
207
|
+
it("POST /mcp with invalid OAuth token (AUTH_API returns 401) returns 401", async () => {
|
|
208
|
+
const req = makeRequest("/mcp", "POST", {
|
|
209
|
+
Authorization: "Bearer expired-oauth-token",
|
|
210
|
+
"Content-Type": "application/json",
|
|
211
|
+
}, "{}");
|
|
212
|
+
const res = await worker.fetch(req, envWithFakeAuthApi);
|
|
213
|
+
expect(res.status).toBe(401);
|
|
214
|
+
});
|
|
215
|
+
});
|
|
216
|
+
// ---------------------------------------------------------------------------
|
|
217
|
+
// Unknown paths
|
|
218
|
+
// ---------------------------------------------------------------------------
|
|
219
|
+
describe("Worker — unknown routes", () => {
|
|
220
|
+
it("GET /unknown returns 404", async () => {
|
|
221
|
+
const req = makeRequest("/unknown-path");
|
|
222
|
+
const res = await worker.fetch(req, emptyEnv);
|
|
223
|
+
expect(res.status).toBe(404);
|
|
224
|
+
const body = (await res.json());
|
|
225
|
+
expect(body.error).toBeTruthy();
|
|
226
|
+
});
|
|
227
|
+
it("GET / returns 404", async () => {
|
|
228
|
+
const req = makeRequest("/");
|
|
229
|
+
const res = await worker.fetch(req, emptyEnv);
|
|
230
|
+
expect(res.status).toBe(404);
|
|
231
|
+
});
|
|
232
|
+
it("POST /webhook returns 404", async () => {
|
|
233
|
+
const req = makeRequest("/webhook", "POST", {}, "{}");
|
|
234
|
+
const res = await worker.fetch(req, emptyEnv);
|
|
235
|
+
expect(res.status).toBe(404);
|
|
236
|
+
});
|
|
237
|
+
it("404 response has CORS headers", async () => {
|
|
238
|
+
const req = makeRequest("/not-a-real-endpoint");
|
|
239
|
+
const res = await worker.fetch(req, emptyEnv);
|
|
240
|
+
expect(res.status).toBe(404);
|
|
241
|
+
expect(res.headers.get("Access-Control-Allow-Origin")).toBe("*");
|
|
242
|
+
});
|
|
243
|
+
});
|
|
244
|
+
//# sourceMappingURL=worker.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.test.js","sourceRoot":"","sources":["../src/worker.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@better-i18n/mcp",
|
|
3
|
-
"version": "0.15.
|
|
3
|
+
"version": "0.15.5",
|
|
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",
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
"prepublishOnly": "npm run clean && npm run build && chmod +x ./dist/index.js ./dist/http.js"
|
|
51
51
|
},
|
|
52
52
|
"dependencies": {
|
|
53
|
-
"@better-i18n/mcp-types": "
|
|
53
|
+
"@better-i18n/mcp-types": "0.0.0",
|
|
54
54
|
"@modelcontextprotocol/sdk": "^1.25.3",
|
|
55
55
|
"@trpc/client": "^11.0.0",
|
|
56
56
|
"zod": "^3.25.1"
|