aso-mcp 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 (119) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +227 -0
  3. package/build/cache/sqlite-cache.d.ts +10 -0
  4. package/build/cache/sqlite-cache.d.ts.map +1 -0
  5. package/build/cache/sqlite-cache.js +51 -0
  6. package/build/cache/sqlite-cache.js.map +1 -0
  7. package/build/data-sources/app-store-connect.d.ts +12 -0
  8. package/build/data-sources/app-store-connect.d.ts.map +1 -0
  9. package/build/data-sources/app-store-connect.js +415 -0
  10. package/build/data-sources/app-store-connect.js.map +1 -0
  11. package/build/data-sources/app-store.d.ts +7 -0
  12. package/build/data-sources/app-store.d.ts.map +1 -0
  13. package/build/data-sources/app-store.js +28 -0
  14. package/build/data-sources/app-store.js.map +1 -0
  15. package/build/data-sources/aso-scoring.d.ts +15 -0
  16. package/build/data-sources/aso-scoring.d.ts.map +1 -0
  17. package/build/data-sources/aso-scoring.js +140 -0
  18. package/build/data-sources/aso-scoring.js.map +1 -0
  19. package/build/data-sources/custom-scoring.d.ts +52 -0
  20. package/build/data-sources/custom-scoring.d.ts.map +1 -0
  21. package/build/data-sources/custom-scoring.js +83 -0
  22. package/build/data-sources/custom-scoring.js.map +1 -0
  23. package/build/server.d.ts +3 -0
  24. package/build/server.d.ts.map +1 -0
  25. package/build/server.js +69 -0
  26. package/build/server.js.map +1 -0
  27. package/build/tools/analyze-competitors.d.ts +3 -0
  28. package/build/tools/analyze-competitors.d.ts.map +1 -0
  29. package/build/tools/analyze-competitors.js +112 -0
  30. package/build/tools/analyze-competitors.js.map +1 -0
  31. package/build/tools/analyze-reviews.d.ts +3 -0
  32. package/build/tools/analyze-reviews.d.ts.map +1 -0
  33. package/build/tools/analyze-reviews.js +188 -0
  34. package/build/tools/analyze-reviews.js.map +1 -0
  35. package/build/tools/clear-cache.d.ts +3 -0
  36. package/build/tools/clear-cache.d.ts.map +1 -0
  37. package/build/tools/clear-cache.js +32 -0
  38. package/build/tools/clear-cache.js.map +1 -0
  39. package/build/tools/connect-get-app.d.ts +3 -0
  40. package/build/tools/connect-get-app.d.ts.map +1 -0
  41. package/build/tools/connect-get-app.js +56 -0
  42. package/build/tools/connect-get-app.js.map +1 -0
  43. package/build/tools/connect-get-metadata.d.ts +3 -0
  44. package/build/tools/connect-get-metadata.d.ts.map +1 -0
  45. package/build/tools/connect-get-metadata.js +73 -0
  46. package/build/tools/connect-get-metadata.js.map +1 -0
  47. package/build/tools/connect-list-localizations.d.ts +3 -0
  48. package/build/tools/connect-list-localizations.d.ts.map +1 -0
  49. package/build/tools/connect-list-localizations.js +55 -0
  50. package/build/tools/connect-list-localizations.js.map +1 -0
  51. package/build/tools/connect-setup.d.ts +3 -0
  52. package/build/tools/connect-setup.d.ts.map +1 -0
  53. package/build/tools/connect-setup.js +47 -0
  54. package/build/tools/connect-setup.js.map +1 -0
  55. package/build/tools/connect-update-metadata.d.ts +3 -0
  56. package/build/tools/connect-update-metadata.d.ts.map +1 -0
  57. package/build/tools/connect-update-metadata.js +176 -0
  58. package/build/tools/connect-update-metadata.js.map +1 -0
  59. package/build/tools/discover-keywords.d.ts +3 -0
  60. package/build/tools/discover-keywords.d.ts.map +1 -0
  61. package/build/tools/discover-keywords.js +195 -0
  62. package/build/tools/discover-keywords.js.map +1 -0
  63. package/build/tools/generate-aso-brief.d.ts +3 -0
  64. package/build/tools/generate-aso-brief.d.ts.map +1 -0
  65. package/build/tools/generate-aso-brief.js +295 -0
  66. package/build/tools/generate-aso-brief.js.map +1 -0
  67. package/build/tools/get-app-details.d.ts +3 -0
  68. package/build/tools/get-app-details.d.ts.map +1 -0
  69. package/build/tools/get-app-details.js +89 -0
  70. package/build/tools/get-app-details.js.map +1 -0
  71. package/build/tools/get-aso-report.d.ts +3 -0
  72. package/build/tools/get-aso-report.d.ts.map +1 -0
  73. package/build/tools/get-aso-report.js +168 -0
  74. package/build/tools/get-aso-report.js.map +1 -0
  75. package/build/tools/keyword-gap.d.ts +3 -0
  76. package/build/tools/keyword-gap.d.ts.map +1 -0
  77. package/build/tools/keyword-gap.js +116 -0
  78. package/build/tools/keyword-gap.js.map +1 -0
  79. package/build/tools/localized-keywords.d.ts +3 -0
  80. package/build/tools/localized-keywords.d.ts.map +1 -0
  81. package/build/tools/localized-keywords.js +107 -0
  82. package/build/tools/localized-keywords.js.map +1 -0
  83. package/build/tools/optimize-metadata.d.ts +3 -0
  84. package/build/tools/optimize-metadata.d.ts.map +1 -0
  85. package/build/tools/optimize-metadata.js +156 -0
  86. package/build/tools/optimize-metadata.js.map +1 -0
  87. package/build/tools/search-keywords.d.ts +3 -0
  88. package/build/tools/search-keywords.d.ts.map +1 -0
  89. package/build/tools/search-keywords.js +65 -0
  90. package/build/tools/search-keywords.js.map +1 -0
  91. package/build/tools/suggest-keywords.d.ts +3 -0
  92. package/build/tools/suggest-keywords.d.ts.map +1 -0
  93. package/build/tools/suggest-keywords.js +71 -0
  94. package/build/tools/suggest-keywords.js.map +1 -0
  95. package/build/tools/track-ranking.d.ts +3 -0
  96. package/build/tools/track-ranking.d.ts.map +1 -0
  97. package/build/tools/track-ranking.js +94 -0
  98. package/build/tools/track-ranking.js.map +1 -0
  99. package/build/types/index.d.ts +151 -0
  100. package/build/types/index.d.ts.map +1 -0
  101. package/build/types/index.js +2 -0
  102. package/build/types/index.js.map +1 -0
  103. package/build/utils/constants.d.ts +40 -0
  104. package/build/utils/constants.d.ts.map +1 -0
  105. package/build/utils/constants.js +35 -0
  106. package/build/utils/constants.js.map +1 -0
  107. package/build/utils/formatters.d.ts +9 -0
  108. package/build/utils/formatters.d.ts.map +1 -0
  109. package/build/utils/formatters.js +37 -0
  110. package/build/utils/formatters.js.map +1 -0
  111. package/build/utils/localization.d.ts +7 -0
  112. package/build/utils/localization.d.ts.map +1 -0
  113. package/build/utils/localization.js +63 -0
  114. package/build/utils/localization.js.map +1 -0
  115. package/build/utils/rate-limiter.d.ts +7 -0
  116. package/build/utils/rate-limiter.d.ts.map +1 -0
  117. package/build/utils/rate-limiter.js +23 -0
  118. package/build/utils/rate-limiter.js.map +1 -0
  119. package/package.json +60 -0
@@ -0,0 +1,56 @@
1
+ import { z } from "zod";
2
+ import { loadConfig, getApp } from "../data-sources/app-store-connect.js";
3
+ import { getFromCache, setCache } from "../cache/sqlite-cache.js";
4
+ import { CACHE_TTL } from "../utils/constants.js";
5
+ export function registerConnectGetApp(server) {
6
+ server.tool("connect_get_app", "Bundle ID ile uygulama bul, ASC ID ve versiyon durumunu göster", {
7
+ bundleId: z
8
+ .string()
9
+ .describe("App bundle ID (e.g. 'com.spotify.client')"),
10
+ }, async ({ bundleId }) => {
11
+ const cacheKey = `connect-app:${bundleId}`;
12
+ const cached = getFromCache(cacheKey);
13
+ if (cached) {
14
+ return { content: [{ type: "text", text: cached }] };
15
+ }
16
+ try {
17
+ const config = loadConfig();
18
+ if (!config) {
19
+ return {
20
+ content: [
21
+ {
22
+ type: "text",
23
+ text: "Error: App Store Connect credentials not configured. Use connect_setup tool first.",
24
+ },
25
+ ],
26
+ isError: true,
27
+ };
28
+ }
29
+ const appInfo = await getApp(config, bundleId);
30
+ const result = {
31
+ app: appInfo,
32
+ editableVersion: appInfo.versionId
33
+ ? {
34
+ id: appInfo.versionId,
35
+ state: appInfo.versionState,
36
+ }
37
+ : null,
38
+ note: appInfo.versionId
39
+ ? "Editable version found (PREPARE_FOR_SUBMISSION)."
40
+ : "No editable version found. Create a new version in App Store Connect to update metadata.",
41
+ };
42
+ const resultText = JSON.stringify(result, null, 2);
43
+ setCache(cacheKey, resultText, CACHE_TTL.CONNECT_APP);
44
+ return { content: [{ type: "text", text: resultText }] };
45
+ }
46
+ catch (error) {
47
+ return {
48
+ content: [
49
+ { type: "text", text: `Error: ${error.message}` },
50
+ ],
51
+ isError: true,
52
+ };
53
+ }
54
+ });
55
+ }
56
+ //# sourceMappingURL=connect-get-app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect-get-app.js","sourceRoot":"","sources":["../../src/tools/connect-get-app.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,sCAAsC,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,MAAM,UAAU,qBAAqB,CAAC,MAAiB;IACrD,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,gEAAgE,EAChE;QACE,QAAQ,EAAE,CAAC;aACR,MAAM,EAAE;aACR,QAAQ,CAAC,2CAA2C,CAAC;KACzD,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QACrB,MAAM,QAAQ,GAAG,eAAe,QAAQ,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QAChE,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;YAC5B,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,oFAAoF;yBAC3F;qBACF;oBACD,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YAE/C,MAAM,MAAM,GAAG;gBACb,GAAG,EAAE,OAAO;gBACZ,eAAe,EAAE,OAAO,CAAC,SAAS;oBAChC,CAAC,CAAC;wBACE,EAAE,EAAE,OAAO,CAAC,SAAS;wBACrB,KAAK,EAAE,OAAO,CAAC,YAAY;qBAC5B;oBACH,CAAC,CAAC,IAAI;gBACR,IAAI,EAAE,OAAO,CAAC,SAAS;oBACrB,CAAC,CAAC,kDAAkD;oBACpD,CAAC,CAAC,0FAA0F;aAC/F,CAAC;YAEF,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YACnD,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC;YAEtD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;QACpE,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO;gBACL,OAAO,EAAE;oBACP,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,KAAK,CAAC,OAAO,EAAE,EAAE;iBAC3D;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerConnectGetMetadata(server: McpServer): void;
3
+ //# sourceMappingURL=connect-get-metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect-get-metadata.d.ts","sourceRoot":"","sources":["../../src/tools/connect-get-metadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMpE,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,QA6E3D"}
@@ -0,0 +1,73 @@
1
+ import { z } from "zod";
2
+ import { loadConfig, getMetadata } from "../data-sources/app-store-connect.js";
3
+ import { getFromCache, setCache } from "../cache/sqlite-cache.js";
4
+ import { CACHE_TTL, CHAR_LIMITS } from "../utils/constants.js";
5
+ export function registerConnectGetMetadata(server) {
6
+ server.tool("connect_get_metadata", "Belirli bir locale için mevcut ASO metadata'sını getir", {
7
+ appId: z
8
+ .string()
9
+ .describe("App Store Connect app ID (from connect_get_app)"),
10
+ locale: z
11
+ .string()
12
+ .default("tr")
13
+ .describe("Locale code — accepts both Apple format ('en-US') and country code ('us')"),
14
+ }, async ({ appId, locale }) => {
15
+ const cacheKey = `connect-metadata:${appId}:${locale}`;
16
+ const cached = getFromCache(cacheKey);
17
+ if (cached) {
18
+ return { content: [{ type: "text", text: cached }] };
19
+ }
20
+ try {
21
+ const config = loadConfig();
22
+ if (!config) {
23
+ return {
24
+ content: [
25
+ {
26
+ type: "text",
27
+ text: "Error: App Store Connect credentials not configured. Use connect_setup tool first.",
28
+ },
29
+ ],
30
+ isError: true,
31
+ };
32
+ }
33
+ const metadata = await getMetadata(config, appId, locale);
34
+ const result = {
35
+ metadata,
36
+ characterLimits: {
37
+ subtitle: {
38
+ used: metadata.subtitleLength,
39
+ max: CHAR_LIMITS.SUBTITLE,
40
+ remaining: CHAR_LIMITS.SUBTITLE - metadata.subtitleLength,
41
+ },
42
+ keywords: {
43
+ used: metadata.keywordsLength,
44
+ max: CHAR_LIMITS.KEYWORD_FIELD,
45
+ remaining: CHAR_LIMITS.KEYWORD_FIELD - metadata.keywordsLength,
46
+ },
47
+ description: {
48
+ used: metadata.descriptionLength,
49
+ max: CHAR_LIMITS.DESCRIPTION,
50
+ remaining: CHAR_LIMITS.DESCRIPTION - metadata.descriptionLength,
51
+ },
52
+ promotionalText: {
53
+ used: metadata.promotionalTextLength,
54
+ max: CHAR_LIMITS.PROMOTIONAL_TEXT,
55
+ remaining: CHAR_LIMITS.PROMOTIONAL_TEXT - metadata.promotionalTextLength,
56
+ },
57
+ },
58
+ };
59
+ const resultText = JSON.stringify(result, null, 2);
60
+ setCache(cacheKey, resultText, CACHE_TTL.CONNECT_METADATA);
61
+ return { content: [{ type: "text", text: resultText }] };
62
+ }
63
+ catch (error) {
64
+ return {
65
+ content: [
66
+ { type: "text", text: `Error: ${error.message}` },
67
+ ],
68
+ isError: true,
69
+ };
70
+ }
71
+ });
72
+ }
73
+ //# sourceMappingURL=connect-get-metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect-get-metadata.js","sourceRoot":"","sources":["../../src/tools/connect-get-metadata.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerConnectListLocalizations(server: McpServer): void;
3
+ //# sourceMappingURL=connect-list-localizations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect-list-localizations.d.ts","sourceRoot":"","sources":["../../src/tools/connect-list-localizations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AASpE,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,SAAS,QA4DjE"}
@@ -0,0 +1,55 @@
1
+ import { z } from "zod";
2
+ import { loadConfig, listLocalizations, } from "../data-sources/app-store-connect.js";
3
+ import { getFromCache, setCache } from "../cache/sqlite-cache.js";
4
+ import { CACHE_TTL } from "../utils/constants.js";
5
+ export function registerConnectListLocalizations(server) {
6
+ server.tool("connect_list_localizations", "Bir uygulamanın tüm locale'lerini ve metadata durumlarını listele", {
7
+ appId: z
8
+ .string()
9
+ .describe("App Store Connect app ID"),
10
+ }, async ({ appId }) => {
11
+ const cacheKey = `connect-localizations:${appId}`;
12
+ const cached = getFromCache(cacheKey);
13
+ if (cached) {
14
+ return { content: [{ type: "text", text: cached }] };
15
+ }
16
+ try {
17
+ const config = loadConfig();
18
+ if (!config) {
19
+ return {
20
+ content: [
21
+ {
22
+ type: "text",
23
+ text: "Error: App Store Connect credentials not configured. Use connect_setup tool first.",
24
+ },
25
+ ],
26
+ isError: true,
27
+ };
28
+ }
29
+ const localizations = await listLocalizations(config, appId);
30
+ const result = {
31
+ appId,
32
+ totalLocales: localizations.length,
33
+ localizations,
34
+ summary: {
35
+ withSubtitle: localizations.filter((l) => l.hasSubtitle).length,
36
+ withKeywords: localizations.filter((l) => l.hasKeywords).length,
37
+ withDescription: localizations.filter((l) => l.hasDescription).length,
38
+ withPromotionalText: localizations.filter((l) => l.hasPromotionalText).length,
39
+ },
40
+ };
41
+ const resultText = JSON.stringify(result, null, 2);
42
+ setCache(cacheKey, resultText, CACHE_TTL.CONNECT_LOCALIZATIONS);
43
+ return { content: [{ type: "text", text: resultText }] };
44
+ }
45
+ catch (error) {
46
+ return {
47
+ content: [
48
+ { type: "text", text: `Error: ${error.message}` },
49
+ ],
50
+ isError: true,
51
+ };
52
+ }
53
+ });
54
+ }
55
+ //# sourceMappingURL=connect-list-localizations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect-list-localizations.js","sourceRoot":"","sources":["../../src/tools/connect-list-localizations.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,UAAU,EACV,iBAAiB,GAClB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,MAAM,UAAU,gCAAgC,CAAC,MAAiB;IAChE,MAAM,CAAC,IAAI,CACT,4BAA4B,EAC5B,mEAAmE,EACnE;QACE,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,QAAQ,CAAC,0BAA0B,CAAC;KACxC,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;QAClB,MAAM,QAAQ,GAAG,yBAAyB,KAAK,EAAE,CAAC;QAClD,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QAChE,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;YAC5B,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,oFAAoF;yBAC3F;qBACF;oBACD,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YAED,MAAM,aAAa,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAE7D,MAAM,MAAM,GAAG;gBACb,KAAK;gBACL,YAAY,EAAE,aAAa,CAAC,MAAM;gBAClC,aAAa;gBACb,OAAO,EAAE;oBACP,YAAY,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,MAAM;oBAC/D,YAAY,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,MAAM;oBAC/D,eAAe,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,MAAM;oBACrE,mBAAmB,EAAE,aAAa,CAAC,MAAM,CACvC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,kBAAkB,CAC5B,CAAC,MAAM;iBACT;aACF,CAAC;YAEF,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YACnD,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,SAAS,CAAC,qBAAqB,CAAC,CAAC;YAEhE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;QACpE,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO;gBACL,OAAO,EAAE;oBACP,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,KAAK,CAAC,OAAO,EAAE,EAAE;iBAC3D;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerConnectSetup(server: McpServer): void;
3
+ //# sourceMappingURL=connect-setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect-setup.d.ts","sourceRoot":"","sources":["../../src/tools/connect-setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAQpE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,QAmDrD"}
@@ -0,0 +1,47 @@
1
+ import { z } from "zod";
2
+ import { saveConfig, validateCredentials, } from "../data-sources/app-store-connect.js";
3
+ export function registerConnectSetup(server) {
4
+ server.tool("connect_setup", "App Store Connect kimlik bilgilerini yapılandır ve doğrula", {
5
+ issuerId: z
6
+ .string()
7
+ .describe("App Store Connect Issuer ID"),
8
+ apiKeyId: z
9
+ .string()
10
+ .describe("App Store Connect API Key ID"),
11
+ privateKeyPath: z
12
+ .string()
13
+ .describe("Path to .p8 private key file"),
14
+ }, async ({ issuerId, apiKeyId, privateKeyPath }) => {
15
+ try {
16
+ const config = { issuerId, apiKeyId, privateKeyPath };
17
+ // Validate credentials with a test API call
18
+ await validateCredentials(config);
19
+ // Save config for future use
20
+ saveConfig(config);
21
+ const result = {
22
+ status: "success",
23
+ message: "App Store Connect credentials validated and saved.",
24
+ config: {
25
+ issuerId,
26
+ apiKeyId,
27
+ privateKeyPath,
28
+ configPath: "~/.aso-mcp/connect-config.json",
29
+ },
30
+ };
31
+ return {
32
+ content: [
33
+ { type: "text", text: JSON.stringify(result, null, 2) },
34
+ ],
35
+ };
36
+ }
37
+ catch (error) {
38
+ return {
39
+ content: [
40
+ { type: "text", text: `Error: ${error.message}` },
41
+ ],
42
+ isError: true,
43
+ };
44
+ }
45
+ });
46
+ }
47
+ //# sourceMappingURL=connect-setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect-setup.js","sourceRoot":"","sources":["../../src/tools/connect-setup.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAEL,UAAU,EACV,mBAAmB,GACpB,MAAM,sCAAsC,CAAC;AAE9C,MAAM,UAAU,oBAAoB,CAAC,MAAiB;IACpD,MAAM,CAAC,IAAI,CACT,eAAe,EACf,4DAA4D,EAC5D;QACE,QAAQ,EAAE,CAAC;aACR,MAAM,EAAE;aACR,QAAQ,CAAC,6BAA6B,CAAC;QAC1C,QAAQ,EAAE,CAAC;aACR,MAAM,EAAE;aACR,QAAQ,CAAC,8BAA8B,CAAC;QAC3C,cAAc,EAAE,CAAC;aACd,MAAM,EAAE;aACR,QAAQ,CAAC,8BAA8B,CAAC;KAC5C,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAE,EAAE;QAC/C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;YAEtD,4CAA4C;YAC5C,MAAM,mBAAmB,CAAC,MAAM,CAAC,CAAC;YAElC,6BAA6B;YAC7B,UAAU,CAAC,MAAM,CAAC,CAAC;YAEnB,MAAM,MAAM,GAAG;gBACb,MAAM,EAAE,SAAS;gBACjB,OAAO,EAAE,oDAAoD;gBAC7D,MAAM,EAAE;oBACN,QAAQ;oBACR,QAAQ;oBACR,cAAc;oBACd,UAAU,EAAE,gCAAgC;iBAC7C;aACF,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE;oBACP,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;iBACjE;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO;gBACL,OAAO,EAAE;oBACP,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,KAAK,CAAC,OAAO,EAAE,EAAE;iBAC3D;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerConnectUpdateMetadata(server: McpServer): void;
3
+ //# sourceMappingURL=connect-update-metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect-update-metadata.d.ts","sourceRoot":"","sources":["../../src/tools/connect-update-metadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAQpE,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,SAAS,QAkN9D"}
@@ -0,0 +1,176 @@
1
+ import { z } from "zod";
2
+ import { loadConfig, updateMetadata, } from "../data-sources/app-store-connect.js";
3
+ import { CHAR_LIMITS } from "../utils/constants.js";
4
+ export function registerConnectUpdateMetadata(server) {
5
+ server.tool("connect_update_metadata", "ASO metadata alanlarını App Store Connect'te güncelle", {
6
+ appId: z
7
+ .string()
8
+ .describe("App Store Connect app ID"),
9
+ locale: z
10
+ .string()
11
+ .default("tr")
12
+ .describe("Locale code — accepts both Apple format ('en-US') and country code ('us')"),
13
+ name: z
14
+ .string()
15
+ .optional()
16
+ .describe("App name / title for this locale (max 30 chars)"),
17
+ subtitle: z
18
+ .string()
19
+ .optional()
20
+ .describe("New subtitle (max 30 chars)"),
21
+ keywords: z
22
+ .string()
23
+ .optional()
24
+ .describe("New keywords (max 100 chars, comma-separated, no spaces)"),
25
+ description: z
26
+ .string()
27
+ .optional()
28
+ .describe("New description (max 4000 chars)"),
29
+ promotionalText: z
30
+ .string()
31
+ .optional()
32
+ .describe("New promotional text (max 170 chars)"),
33
+ whatsNew: z
34
+ .string()
35
+ .optional()
36
+ .describe("New what's new text (max 4000 chars)"),
37
+ supportUrl: z
38
+ .string()
39
+ .optional()
40
+ .describe("Support URL for this locale"),
41
+ marketingUrl: z
42
+ .string()
43
+ .optional()
44
+ .describe("Marketing URL for this locale"),
45
+ }, async ({ appId, locale, name, subtitle, keywords, description, promotionalText, whatsNew, supportUrl, marketingUrl }) => {
46
+ try {
47
+ const config = loadConfig();
48
+ if (!config) {
49
+ return {
50
+ content: [
51
+ {
52
+ type: "text",
53
+ text: "Error: App Store Connect credentials not configured. Use connect_setup tool first.",
54
+ },
55
+ ],
56
+ isError: true,
57
+ };
58
+ }
59
+ // Validate character limits before making any API calls
60
+ const warnings = [];
61
+ const errors = [];
62
+ if (name !== undefined && name.length > CHAR_LIMITS.SUBTITLE) {
63
+ errors.push(`Name exceeds ${CHAR_LIMITS.SUBTITLE} char limit (${name.length} chars)`);
64
+ }
65
+ if (subtitle !== undefined && subtitle.length > CHAR_LIMITS.SUBTITLE) {
66
+ errors.push(`Subtitle exceeds ${CHAR_LIMITS.SUBTITLE} char limit (${subtitle.length} chars)`);
67
+ }
68
+ if (keywords !== undefined) {
69
+ if (keywords.length > CHAR_LIMITS.KEYWORD_FIELD) {
70
+ errors.push(`Keywords exceed ${CHAR_LIMITS.KEYWORD_FIELD} char limit (${keywords.length} chars)`);
71
+ }
72
+ if (keywords.includes(", ")) {
73
+ warnings.push("Keywords contain spaces after commas. App Store keywords should be comma-separated without spaces.");
74
+ }
75
+ }
76
+ if (description !== undefined &&
77
+ description.length > CHAR_LIMITS.DESCRIPTION) {
78
+ errors.push(`Description exceeds ${CHAR_LIMITS.DESCRIPTION} char limit (${description.length} chars)`);
79
+ }
80
+ if (promotionalText !== undefined &&
81
+ promotionalText.length > CHAR_LIMITS.PROMOTIONAL_TEXT) {
82
+ errors.push(`Promotional text exceeds ${CHAR_LIMITS.PROMOTIONAL_TEXT} char limit (${promotionalText.length} chars)`);
83
+ }
84
+ if (whatsNew !== undefined && whatsNew.length > CHAR_LIMITS.WHATS_NEW) {
85
+ errors.push(`What's New exceeds ${CHAR_LIMITS.WHATS_NEW} char limit (${whatsNew.length} chars)`);
86
+ }
87
+ if (errors.length > 0) {
88
+ return {
89
+ content: [
90
+ {
91
+ type: "text",
92
+ text: JSON.stringify({
93
+ status: "validation_failed",
94
+ errors,
95
+ warnings,
96
+ message: "Fix character limit violations before updating.",
97
+ }, null, 2),
98
+ },
99
+ ],
100
+ isError: true,
101
+ };
102
+ }
103
+ // Check if any fields are provided
104
+ const updates = { name, subtitle, keywords, description, promotionalText, whatsNew, supportUrl, marketingUrl };
105
+ const hasUpdates = Object.values(updates).some((v) => v !== undefined);
106
+ if (!hasUpdates) {
107
+ return {
108
+ content: [
109
+ {
110
+ type: "text",
111
+ text: "Error: No metadata fields provided to update. Specify at least one of: name, subtitle, keywords, description, promotionalText, whatsNew, supportUrl, marketingUrl.",
112
+ },
113
+ ],
114
+ isError: true,
115
+ };
116
+ }
117
+ const { before, after } = await updateMetadata(config, appId, locale, updates);
118
+ // Build diff
119
+ const diff = {};
120
+ if (subtitle !== undefined) {
121
+ diff.subtitle = { before: before.subtitle, after: after.subtitle };
122
+ }
123
+ if (keywords !== undefined) {
124
+ diff.keywords = { before: before.keywords, after: after.keywords };
125
+ }
126
+ if (description !== undefined) {
127
+ diff.description = {
128
+ before: before.description,
129
+ after: after.description,
130
+ };
131
+ }
132
+ if (promotionalText !== undefined) {
133
+ diff.promotionalText = {
134
+ before: before.promotionalText,
135
+ after: after.promotionalText,
136
+ };
137
+ }
138
+ if (whatsNew !== undefined) {
139
+ diff.whatsNew = { before: before.whatsNew, after: after.whatsNew };
140
+ }
141
+ if (supportUrl !== undefined) {
142
+ diff.supportUrl = { before: before.supportUrl, after: after.supportUrl };
143
+ }
144
+ if (marketingUrl !== undefined) {
145
+ diff.marketingUrl = { before: before.marketingUrl, after: after.marketingUrl };
146
+ }
147
+ const result = {
148
+ status: "success",
149
+ locale: after.locale,
150
+ diff,
151
+ warnings: warnings.length > 0 ? warnings : undefined,
152
+ characterLimits: {
153
+ subtitle: { used: after.subtitleLength, max: CHAR_LIMITS.SUBTITLE },
154
+ keywords: {
155
+ used: after.keywordsLength,
156
+ max: CHAR_LIMITS.KEYWORD_FIELD,
157
+ },
158
+ },
159
+ };
160
+ return {
161
+ content: [
162
+ { type: "text", text: JSON.stringify(result, null, 2) },
163
+ ],
164
+ };
165
+ }
166
+ catch (error) {
167
+ return {
168
+ content: [
169
+ { type: "text", text: `Error: ${error.message}` },
170
+ ],
171
+ isError: true,
172
+ };
173
+ }
174
+ });
175
+ }
176
+ //# sourceMappingURL=connect-update-metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect-update-metadata.js","sourceRoot":"","sources":["../../src/tools/connect-update-metadata.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerDiscoverKeywords(server: McpServer): void;
3
+ //# sourceMappingURL=discover-keywords.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover-keywords.d.ts","sourceRoot":"","sources":["../../src/tools/discover-keywords.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAWpE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,QAiOzD"}