appstore-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 (61) hide show
  1. package/.claude/CLAUDE.md +29 -0
  2. package/.claude/settings.local.json +24 -0
  3. package/.prettierrc +7 -0
  4. package/README.md +170 -0
  5. package/dist/app-store-service.d.ts +21 -0
  6. package/dist/app-store-service.d.ts.map +1 -0
  7. package/dist/app-store-service.js +146 -0
  8. package/dist/index.d.ts +3 -0
  9. package/dist/index.d.ts.map +1 -0
  10. package/dist/index.js +22 -0
  11. package/dist/mcp/resources/countries.d.ts +5 -0
  12. package/dist/mcp/resources/countries.d.ts.map +1 -0
  13. package/dist/mcp/resources/countries.js +236 -0
  14. package/dist/mcp/resources/index.d.ts +3 -0
  15. package/dist/mcp/resources/index.d.ts.map +1 -0
  16. package/dist/mcp/resources/index.js +80 -0
  17. package/dist/mcp/tools/get-app-details.d.ts +3 -0
  18. package/dist/mcp/tools/get-app-details.d.ts.map +1 -0
  19. package/dist/mcp/tools/get-app-details.js +84 -0
  20. package/dist/mcp/tools/get-app-info.d.ts +3 -0
  21. package/dist/mcp/tools/get-app-info.d.ts.map +1 -0
  22. package/dist/mcp/tools/get-app-info.js +156 -0
  23. package/dist/mcp/tools/get-app-release-info.d.ts +3 -0
  24. package/dist/mcp/tools/get-app-release-info.d.ts.map +1 -0
  25. package/dist/mcp/tools/get-app-release-info.js +80 -0
  26. package/dist/mcp/tools/get-app-screenshots.d.ts +3 -0
  27. package/dist/mcp/tools/get-app-screenshots.d.ts.map +1 -0
  28. package/dist/mcp/tools/get-app-screenshots.js +71 -0
  29. package/dist/mcp/tools/get-trending-apps.d.ts +3 -0
  30. package/dist/mcp/tools/get-trending-apps.d.ts.map +1 -0
  31. package/dist/mcp/tools/get-trending-apps.js +89 -0
  32. package/dist/mcp/tools/index.d.ts +3 -0
  33. package/dist/mcp/tools/index.d.ts.map +1 -0
  34. package/dist/mcp/tools/index.js +12 -0
  35. package/dist/mcp/tools/list-categories.d.ts +3 -0
  36. package/dist/mcp/tools/list-categories.d.ts.map +1 -0
  37. package/dist/mcp/tools/list-categories.js +38 -0
  38. package/dist/mcp/tools/list-countries.d.ts +3 -0
  39. package/dist/mcp/tools/list-countries.d.ts.map +1 -0
  40. package/dist/mcp/tools/list-countries.js +40 -0
  41. package/dist/mcp/tools/search-apps.d.ts +3 -0
  42. package/dist/mcp/tools/search-apps.d.ts.map +1 -0
  43. package/dist/mcp/tools/search-apps.js +67 -0
  44. package/dist/services/app-store-service.d.ts +21 -0
  45. package/dist/services/app-store-service.d.ts.map +1 -0
  46. package/dist/services/app-store-service.js +146 -0
  47. package/dist/types.d.ts +46 -0
  48. package/dist/types.d.ts.map +1 -0
  49. package/dist/types.js +41 -0
  50. package/eslint.config.js +9 -0
  51. package/package.json +46 -0
  52. package/src/index.ts +24 -0
  53. package/src/mcp/resources/countries.ts +234 -0
  54. package/src/mcp/resources/index.ts +117 -0
  55. package/src/mcp/tools/get-app-info.ts +183 -0
  56. package/src/mcp/tools/get-trending-apps.ts +108 -0
  57. package/src/mcp/tools/index.ts +10 -0
  58. package/src/mcp/tools/search-apps.ts +74 -0
  59. package/src/services/app-store-service.ts +236 -0
  60. package/src/types.ts +77 -0
  61. package/tsconfig.json +21 -0
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.AppStoreService = void 0;
7
+ const axios_1 = __importDefault(require("axios"));
8
+ const ITUNES_SEARCH_URL = 'https://itunes.apple.com/search';
9
+ const ITUNES_LOOKUP_URL = 'https://itunes.apple.com/lookup';
10
+ const ITUNES_RSS_BASE = 'https://itunes.apple.com';
11
+ class AppStoreService {
12
+ static getFeedName(platform, pricingType) {
13
+ const feedMap = {
14
+ iphone: {
15
+ free: 'topfreeapplications',
16
+ paid: 'toppaidapplications',
17
+ grossing: 'topgrossingapplications',
18
+ },
19
+ ipad: {
20
+ free: 'topfreeipadapplications',
21
+ paid: 'toppaidipadapplications',
22
+ grossing: 'topgrossingipadapplications',
23
+ },
24
+ mac: {
25
+ free: 'topfreemacapps',
26
+ paid: 'toppaidmacapps',
27
+ grossing: 'topgrossingmacapps',
28
+ },
29
+ tv: {
30
+ free: 'topfreeappletvapps',
31
+ paid: 'toppaidappletvapps',
32
+ grossing: 'topgrossingappletvapps',
33
+ },
34
+ };
35
+ return feedMap[platform][pricingType];
36
+ }
37
+ static buildRssUrl(countryCode, feedName, limit, categoryId) {
38
+ const genrePart = categoryId ? `/genre=${categoryId}` : '';
39
+ return `${ITUNES_RSS_BASE}/${countryCode}/rss/${feedName}/limit=${limit}${genrePart}/json`;
40
+ }
41
+ static parseSearchResult(item) {
42
+ return {
43
+ id: String(item.trackId),
44
+ name: item.trackName,
45
+ url: item.trackViewUrl,
46
+ iconUrl: item.artworkUrl100,
47
+ artistName: item.artistName,
48
+ averageUserRating: item.averageUserRating,
49
+ userRatingCount: item.userRatingCount,
50
+ releaseDate: item.releaseDate,
51
+ currentVersionReleaseDate: item.currentVersionReleaseDate,
52
+ description: item.description,
53
+ version: item.version,
54
+ price: item.price,
55
+ formattedPrice: item.formattedPrice,
56
+ primaryGenreName: item.primaryGenreName,
57
+ genres: item.genres,
58
+ screenshotUrls: item.screenshotUrls,
59
+ ipadScreenshotUrls: item.ipadScreenshotUrls,
60
+ bundleId: item.bundleId,
61
+ minimumOsVersion: item.minimumOsVersion,
62
+ fileSizeBytes: item.fileSizeBytes,
63
+ contentAdvisoryRating: item.contentAdvisoryRating,
64
+ };
65
+ }
66
+ static parseRssEntry(entry) {
67
+ const images = entry['im:image'] || [];
68
+ const largestImage = images.length > 0 ? images[images.length - 1].label : '';
69
+ return {
70
+ id: entry.id.attributes['im:id'],
71
+ name: entry['im:name'].label,
72
+ url: entry.id.label,
73
+ iconUrl: largestImage,
74
+ artistName: entry['im:artist'].label,
75
+ releaseDate: entry['im:releaseDate']?.label,
76
+ description: entry.summary?.label,
77
+ formattedPrice: entry['im:price']?.label,
78
+ primaryGenreName: entry.category?.attributes.label,
79
+ };
80
+ }
81
+ static async searchApps(query, country = 'US', limit = 25) {
82
+ const params = {
83
+ term: query,
84
+ country: country,
85
+ media: 'software',
86
+ entity: 'software',
87
+ limit: limit,
88
+ };
89
+ const response = await axios_1.default.get(ITUNES_SEARCH_URL, { params });
90
+ return response.data.results.map(this.parseSearchResult);
91
+ }
92
+ static async getAppDetails(appId, country = 'US') {
93
+ const params = {
94
+ id: appId,
95
+ country: country,
96
+ };
97
+ const response = await axios_1.default.get(ITUNES_LOOKUP_URL, { params });
98
+ if (response.data.resultCount === 0) {
99
+ return null;
100
+ }
101
+ return this.parseSearchResult(response.data.results[0]);
102
+ }
103
+ static async lookupMultipleApps(appIds, country = 'US') {
104
+ const params = {
105
+ id: appIds.join(','),
106
+ country: country,
107
+ };
108
+ const response = await axios_1.default.get(ITUNES_LOOKUP_URL, { params });
109
+ const appMap = new Map();
110
+ for (const result of response.data.results) {
111
+ const app = this.parseSearchResult(result);
112
+ appMap.set(app.id, app);
113
+ }
114
+ return appMap;
115
+ }
116
+ static async getTrendingApps(platform = 'iphone', pricingType = 'free', country = 'US', categoryId, limit = 25) {
117
+ const feedName = this.getFeedName(platform, pricingType);
118
+ const url = this.buildRssUrl(country, feedName, limit, categoryId);
119
+ const response = await axios_1.default.get(url);
120
+ const entries = response.data.feed.entry || [];
121
+ return entries.map(this.parseRssEntry);
122
+ }
123
+ static async getAppReleaseInfo(appId, country = 'US') {
124
+ const app = await this.getAppDetails(appId, country);
125
+ if (!app) {
126
+ return null;
127
+ }
128
+ return {
129
+ releaseDate: app.releaseDate,
130
+ currentVersionReleaseDate: app.currentVersionReleaseDate,
131
+ version: app.version,
132
+ };
133
+ }
134
+ static async getAppScreenshots(appId, country = 'US') {
135
+ const app = await this.getAppDetails(appId, country);
136
+ if (!app) {
137
+ return null;
138
+ }
139
+ return {
140
+ screenshotUrls: app.screenshotUrls || [],
141
+ ipadScreenshotUrls: app.ipadScreenshotUrls || [],
142
+ };
143
+ }
144
+ }
145
+ exports.AppStoreService = AppStoreService;
146
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXN0b3JlLXNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvYXBwLXN0b3JlLXNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsa0RBQTBCO0FBRzFCLE1BQU0saUJBQWlCLEdBQUcsaUNBQWlDLENBQUM7QUFDNUQsTUFBTSxpQkFBaUIsR0FBRyxpQ0FBaUMsQ0FBQztBQUM1RCxNQUFNLGVBQWUsR0FBRywwQkFBMEIsQ0FBQztBQXFEbkQsTUFBYSxlQUFlO0lBQ2hCLE1BQU0sQ0FBQyxXQUFXLENBQUMsUUFBa0IsRUFBRSxXQUF3QjtRQUNuRSxNQUFNLE9BQU8sR0FBa0Q7WUFDM0QsTUFBTSxFQUFFO2dCQUNKLElBQUksRUFBRSxxQkFBcUI7Z0JBQzNCLElBQUksRUFBRSxxQkFBcUI7Z0JBQzNCLFFBQVEsRUFBRSx5QkFBeUI7YUFDdEM7WUFDRCxJQUFJLEVBQUU7Z0JBQ0YsSUFBSSxFQUFFLHlCQUF5QjtnQkFDL0IsSUFBSSxFQUFFLHlCQUF5QjtnQkFDL0IsUUFBUSxFQUFFLDZCQUE2QjthQUMxQztZQUNELEdBQUcsRUFBRTtnQkFDRCxJQUFJLEVBQUUsZ0JBQWdCO2dCQUN0QixJQUFJLEVBQUUsZ0JBQWdCO2dCQUN0QixRQUFRLEVBQUUsb0JBQW9CO2FBQ2pDO1lBQ0QsRUFBRSxFQUFFO2dCQUNBLElBQUksRUFBRSxvQkFBb0I7Z0JBQzFCLElBQUksRUFBRSxvQkFBb0I7Z0JBQzFCLFFBQVEsRUFBRSx3QkFBd0I7YUFDckM7U0FDSixDQUFDO1FBRUYsT0FBTyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVPLE1BQU0sQ0FBQyxXQUFXLENBQ3RCLFdBQW1CLEVBQ25CLFFBQWdCLEVBQ2hCLEtBQWEsRUFDYixVQUFtQjtRQUVuQixNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsVUFBVSxFQUFF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
@@ -0,0 +1,46 @@
1
+ export interface App {
2
+ id: string;
3
+ name: string;
4
+ url: string;
5
+ iconUrl: string;
6
+ artistName: string;
7
+ averageUserRating?: number;
8
+ userRatingCount?: number;
9
+ releaseDate?: string;
10
+ currentVersionReleaseDate?: string;
11
+ description?: string;
12
+ version?: string;
13
+ price?: number;
14
+ formattedPrice?: string;
15
+ primaryGenreName?: string;
16
+ genres?: string[];
17
+ screenshotUrls?: string[];
18
+ ipadScreenshotUrls?: string[];
19
+ bundleId?: string;
20
+ minimumOsVersion?: string;
21
+ fileSizeBytes?: string;
22
+ contentAdvisoryRating?: string;
23
+ }
24
+ export interface Category {
25
+ id: string;
26
+ name: string;
27
+ emoji: string;
28
+ }
29
+ export type Platform = 'iphone' | 'ipad' | 'mac' | 'tv';
30
+ export type PricingType = 'free' | 'paid' | 'grossing';
31
+ export interface Country {
32
+ code: string;
33
+ name: string;
34
+ }
35
+ export declare const APP_STORE_CATEGORIES: Category[];
36
+ export declare const PLATFORMS: {
37
+ value: Platform;
38
+ label: string;
39
+ emoji: string;
40
+ }[];
41
+ export declare const PRICING_TYPES: {
42
+ value: PricingType;
43
+ label: string;
44
+ emoji: string;
45
+ }[];
46
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,GAAG;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,QAAQ;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,IAAI,CAAC;AACxD,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;AAEvD,MAAM,WAAW,OAAO;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,oBAAoB,EAAE,QAAQ,EAyB1C,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE;IAAE,KAAK,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAKxE,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAI/E,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PRICING_TYPES = exports.PLATFORMS = exports.APP_STORE_CATEGORIES = void 0;
4
+ exports.APP_STORE_CATEGORIES = [
5
+ { id: '6000', name: 'Business', emoji: '💼' },
6
+ { id: '6001', name: 'Weather', emoji: '🌤️' },
7
+ { id: '6002', name: 'Utilities', emoji: '🔧' },
8
+ { id: '6003', name: 'Travel', emoji: '✈️' },
9
+ { id: '6004', name: 'Sports', emoji: '⚽' },
10
+ { id: '6005', name: 'Social Networking', emoji: '👥' },
11
+ { id: '6006', name: 'Reference', emoji: '📚' },
12
+ { id: '6007', name: 'Productivity', emoji: '📊' },
13
+ { id: '6008', name: 'Photo & Video', emoji: '📷' },
14
+ { id: '6009', name: 'News', emoji: '📰' },
15
+ { id: '6010', name: 'Navigation', emoji: '🧭' },
16
+ { id: '6011', name: 'Music', emoji: '🎵' },
17
+ { id: '6012', name: 'Lifestyle', emoji: '🌟' },
18
+ { id: '6013', name: 'Health & Fitness', emoji: '💪' },
19
+ { id: '6014', name: 'Games', emoji: '🎮' },
20
+ { id: '6015', name: 'Finance', emoji: '💰' },
21
+ { id: '6016', name: 'Entertainment', emoji: '🎬' },
22
+ { id: '6017', name: 'Education', emoji: '🎓' },
23
+ { id: '6018', name: 'Books', emoji: '📖' },
24
+ { id: '6020', name: 'Medical', emoji: '🏥' },
25
+ { id: '6021', name: 'Magazines & Newspapers', emoji: '📰' },
26
+ { id: '6022', name: 'Catalogs', emoji: '📋' },
27
+ { id: '6023', name: 'Food & Drink', emoji: '🍔' },
28
+ { id: '6024', name: 'Shopping', emoji: '🛒' },
29
+ ];
30
+ exports.PLATFORMS = [
31
+ { value: 'iphone', label: 'iPhone', emoji: '📱' },
32
+ { value: 'ipad', label: 'iPad', emoji: '📲' },
33
+ { value: 'mac', label: 'Mac', emoji: '💻' },
34
+ { value: 'tv', label: 'Apple TV', emoji: '📺' },
35
+ ];
36
+ exports.PRICING_TYPES = [
37
+ { value: 'free', label: 'Free', emoji: '🆓' },
38
+ { value: 'paid', label: 'Paid', emoji: '💵' },
39
+ { value: 'grossing', label: 'Top Grossing', emoji: '💰' },
40
+ ];
41
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBc0NhLFFBQUEsb0JBQW9CLEdBQWU7SUFDNUMsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtJQUM3QyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO0lBQzdDLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7SUFDOUMsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtJQUMzQyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFO0lBQzFDLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtJQUN0RCxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO0lBQzlDLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7SUFDakQsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtJQUNsRCxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO0lBQ3pDLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7SUFDL0MsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtJQUMxQyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO0lBQzlDLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtJQUNyRCxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO0lBQzFDLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7SUFDNUMsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtJQUNsRCxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO0lBQzlDLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7SUFDMUMsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtJQUM1QyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLHdCQUF3QixFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7SUFDM0QsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtJQUM3QyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO0lBQ2pELEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7Q0FDaEQsQ0FBQztBQUVXLFFBQUEsU0FBUyxHQUF3RDtJQUMxRSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO0lBQ2pELEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7SUFDN0MsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtJQUMzQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO0NBQ2xELENBQUM7QUFFVyxRQUFBLGFBQWEsR0FBMkQ7SUFDakYsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtJQUM3QyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO0lBQzdDLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7Q0FDNUQsQ0FBQyJ9
@@ -0,0 +1,9 @@
1
+ import eslint from '@eslint/js';
2
+ import tseslint from 'typescript-eslint';
3
+
4
+ export default tseslint.config(eslint.configs.recommended, ...tseslint.configs.recommended, {
5
+ rules: {
6
+ '@typescript-eslint/no-unused-vars': 'warn',
7
+ '@typescript-eslint/no-explicit-any': 'warn',
8
+ },
9
+ });
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "appstore-mcp",
3
+ "version": "1.0.0",
4
+ "type": "module",
5
+ "description": "MCP server for interacting with App Store iTunes API",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "bin": {
9
+ "appstore-mcp": "dist/index.js"
10
+ },
11
+ "scripts": {
12
+ "build": "tsc",
13
+ "start": "node dist/index.js",
14
+ "dev": "tsx src/index.ts",
15
+ "inspect": "pnpm dlx @modelcontextprotocol/inspector tsx src/index.ts",
16
+ "typecheck": "tsc --noEmit",
17
+ "lint": "eslint src/**/*.ts",
18
+ "lint:fix": "eslint src/**/*.ts --fix",
19
+ "format": "prettier --write \"src/**/*.ts\"",
20
+ "format:check": "prettier --check \"src/**/*.ts\""
21
+ },
22
+ "keywords": [
23
+ "mcp",
24
+ "appstore",
25
+ "itunes",
26
+ "api"
27
+ ],
28
+ "author": "",
29
+ "license": "MIT",
30
+ "dependencies": {
31
+ "@modelcontextprotocol/sdk": "^1.25.1",
32
+ "axios": "^1.7.9",
33
+ "zod": "^4.2.1"
34
+ },
35
+ "devDependencies": {
36
+ "@types/node": "^22.10.2",
37
+ "eslint": "^9.17.0",
38
+ "prettier": "^3.4.2",
39
+ "tsx": "^4.19.2",
40
+ "typescript": "^5.7.2",
41
+ "typescript-eslint": "^8.18.2"
42
+ },
43
+ "engines": {
44
+ "node": ">=18.0.0"
45
+ }
46
+ }
package/src/index.ts ADDED
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
4
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
5
+ import { registerAllTools } from './mcp/tools';
6
+ import { registerAllResources } from './mcp/resources';
7
+
8
+ const server = new McpServer({
9
+ name: 'appstore-mcp',
10
+ version: '1.0.0',
11
+ });
12
+
13
+ registerAllTools(server);
14
+ registerAllResources(server);
15
+
16
+ async function main() {
17
+ const transport = new StdioServerTransport();
18
+ await server.connect(transport);
19
+ }
20
+
21
+ main().catch((error) => {
22
+ console.error('Failed to start server:', error);
23
+ process.exit(1);
24
+ });
@@ -0,0 +1,234 @@
1
+ import { Country } from '../../types';
2
+
3
+ export const COUNTRIES: Country[] = [
4
+ { code: 'AF', name: 'Afghanistan' },
5
+ { code: 'AL', name: 'Albania' },
6
+ { code: 'DZ', name: 'Algeria' },
7
+ { code: 'AS', name: 'American Samoa' },
8
+ { code: 'AD', name: 'Andorra' },
9
+ { code: 'AO', name: 'Angola' },
10
+ { code: 'AI', name: 'Anguilla' },
11
+ { code: 'AR', name: 'Argentina' },
12
+ { code: 'AM', name: 'Armenia' },
13
+ { code: 'AW', name: 'Aruba' },
14
+ { code: 'AU', name: 'Australia' },
15
+ { code: 'AT', name: 'Austria' },
16
+ { code: 'AZ', name: 'Azerbaijan' },
17
+ { code: 'BS', name: 'Bahamas' },
18
+ { code: 'BH', name: 'Bahrain' },
19
+ { code: 'BD', name: 'Bangladesh' },
20
+ { code: 'BB', name: 'Barbados' },
21
+ { code: 'BY', name: 'Belarus' },
22
+ { code: 'BE', name: 'Belgium' },
23
+ { code: 'BZ', name: 'Belize' },
24
+ { code: 'BJ', name: 'Benin' },
25
+ { code: 'BM', name: 'Bermuda' },
26
+ { code: 'BT', name: 'Bhutan' },
27
+ { code: 'BO', name: 'Bolivia' },
28
+ { code: 'BA', name: 'Bosnia and Herzegovina' },
29
+ { code: 'BW', name: 'Botswana' },
30
+ { code: 'BR', name: 'Brazil' },
31
+ { code: 'VG', name: 'British Virgin Islands' },
32
+ { code: 'BN', name: 'Brunei' },
33
+ { code: 'BG', name: 'Bulgaria' },
34
+ { code: 'BF', name: 'Burkina Faso' },
35
+ { code: 'BI', name: 'Burundi' },
36
+ { code: 'KH', name: 'Cambodia' },
37
+ { code: 'CM', name: 'Cameroon' },
38
+ { code: 'CA', name: 'Canada' },
39
+ { code: 'CV', name: 'Cape Verde' },
40
+ { code: 'KY', name: 'Cayman Islands' },
41
+ { code: 'CF', name: 'Central African Republic' },
42
+ { code: 'TD', name: 'Chad' },
43
+ { code: 'CL', name: 'Chile' },
44
+ { code: 'CN', name: 'China' },
45
+ { code: 'CO', name: 'Colombia' },
46
+ { code: 'KM', name: 'Comoros' },
47
+ { code: 'CK', name: 'Cook Islands' },
48
+ { code: 'CR', name: 'Costa Rica' },
49
+ { code: 'HR', name: 'Croatia' },
50
+ { code: 'CU', name: 'Cuba' },
51
+ { code: 'CW', name: 'Curacao' },
52
+ { code: 'CY', name: 'Cyprus' },
53
+ { code: 'CZ', name: 'Czech Republic' },
54
+ { code: 'CD', name: 'Democratic Republic of the Congo' },
55
+ { code: 'DK', name: 'Denmark' },
56
+ { code: 'DJ', name: 'Djibouti' },
57
+ { code: 'DM', name: 'Dominica' },
58
+ { code: 'DO', name: 'Dominican Republic' },
59
+ { code: 'TL', name: 'East Timor' },
60
+ { code: 'EC', name: 'Ecuador' },
61
+ { code: 'EG', name: 'Egypt' },
62
+ { code: 'SV', name: 'El Salvador' },
63
+ { code: 'ER', name: 'Eritrea' },
64
+ { code: 'EE', name: 'Estonia' },
65
+ { code: 'ET', name: 'Ethiopia' },
66
+ { code: 'FO', name: 'Faroe Islands' },
67
+ { code: 'FJ', name: 'Fiji' },
68
+ { code: 'FI', name: 'Finland' },
69
+ { code: 'FR', name: 'France' },
70
+ { code: 'PF', name: 'French Polynesia' },
71
+ { code: 'GA', name: 'Gabon' },
72
+ { code: 'GM', name: 'Gambia' },
73
+ { code: 'GE', name: 'Georgia' },
74
+ { code: 'DE', name: 'Germany' },
75
+ { code: 'GH', name: 'Ghana' },
76
+ { code: 'GR', name: 'Greece' },
77
+ { code: 'GL', name: 'Greenland' },
78
+ { code: 'GD', name: 'Grenada' },
79
+ { code: 'GU', name: 'Guam' },
80
+ { code: 'GT', name: 'Guatemala' },
81
+ { code: 'GG', name: 'Guernsey' },
82
+ { code: 'GN', name: 'Guinea' },
83
+ { code: 'GW', name: 'Guinea-Bissau' },
84
+ { code: 'GY', name: 'Guyana' },
85
+ { code: 'HT', name: 'Haiti' },
86
+ { code: 'HN', name: 'Honduras' },
87
+ { code: 'HK', name: 'Hong Kong' },
88
+ { code: 'HU', name: 'Hungary' },
89
+ { code: 'IS', name: 'Iceland' },
90
+ { code: 'IN', name: 'India' },
91
+ { code: 'ID', name: 'Indonesia' },
92
+ { code: 'IR', name: 'Iran' },
93
+ { code: 'IQ', name: 'Iraq' },
94
+ { code: 'IE', name: 'Ireland' },
95
+ { code: 'IM', name: 'Isle of Man' },
96
+ { code: 'IL', name: 'Israel' },
97
+ { code: 'IT', name: 'Italy' },
98
+ { code: 'CI', name: 'Ivory Coast' },
99
+ { code: 'JM', name: 'Jamaica' },
100
+ { code: 'JP', name: 'Japan' },
101
+ { code: 'JE', name: 'Jersey' },
102
+ { code: 'JO', name: 'Jordan' },
103
+ { code: 'KZ', name: 'Kazakhstan' },
104
+ { code: 'KE', name: 'Kenya' },
105
+ { code: 'KI', name: 'Kiribati' },
106
+ { code: 'XK', name: 'Kosovo' },
107
+ { code: 'KW', name: 'Kuwait' },
108
+ { code: 'KG', name: 'Kyrgyzstan' },
109
+ { code: 'LA', name: 'Laos' },
110
+ { code: 'LV', name: 'Latvia' },
111
+ { code: 'LB', name: 'Lebanon' },
112
+ { code: 'LS', name: 'Lesotho' },
113
+ { code: 'LR', name: 'Liberia' },
114
+ { code: 'LY', name: 'Libya' },
115
+ { code: 'LI', name: 'Liechtenstein' },
116
+ { code: 'LT', name: 'Lithuania' },
117
+ { code: 'LU', name: 'Luxembourg' },
118
+ { code: 'MO', name: 'Macau' },
119
+ { code: 'MK', name: 'Macedonia' },
120
+ { code: 'MG', name: 'Madagascar' },
121
+ { code: 'MW', name: 'Malawi' },
122
+ { code: 'MY', name: 'Malaysia' },
123
+ { code: 'MV', name: 'Maldives' },
124
+ { code: 'ML', name: 'Mali' },
125
+ { code: 'MT', name: 'Malta' },
126
+ { code: 'MH', name: 'Marshall Islands' },
127
+ { code: 'MR', name: 'Mauritania' },
128
+ { code: 'MU', name: 'Mauritius' },
129
+ { code: 'YT', name: 'Mayotte' },
130
+ { code: 'MX', name: 'Mexico' },
131
+ { code: 'FM', name: 'Micronesia' },
132
+ { code: 'MD', name: 'Moldova' },
133
+ { code: 'MC', name: 'Monaco' },
134
+ { code: 'MN', name: 'Mongolia' },
135
+ { code: 'ME', name: 'Montenegro' },
136
+ { code: 'MA', name: 'Morocco' },
137
+ { code: 'MZ', name: 'Mozambique' },
138
+ { code: 'MM', name: 'Myanmar' },
139
+ { code: 'NA', name: 'Namibia' },
140
+ { code: 'NP', name: 'Nepal' },
141
+ { code: 'NL', name: 'Netherlands' },
142
+ { code: 'AN', name: 'Netherlands Antilles' },
143
+ { code: 'NC', name: 'New Caledonia' },
144
+ { code: 'NZ', name: 'New Zealand' },
145
+ { code: 'NI', name: 'Nicaragua' },
146
+ { code: 'NE', name: 'Niger' },
147
+ { code: 'NG', name: 'Nigeria' },
148
+ { code: 'KP', name: 'North Korea' },
149
+ { code: 'MP', name: 'Northern Mariana Islands' },
150
+ { code: 'NO', name: 'Norway' },
151
+ { code: 'OM', name: 'Oman' },
152
+ { code: 'PK', name: 'Pakistan' },
153
+ { code: 'PS', name: 'Palestine' },
154
+ { code: 'PA', name: 'Panama' },
155
+ { code: 'PG', name: 'Papua New Guinea' },
156
+ { code: 'PY', name: 'Paraguay' },
157
+ { code: 'PE', name: 'Peru' },
158
+ { code: 'PH', name: 'Philippines' },
159
+ { code: 'PL', name: 'Poland' },
160
+ { code: 'PT', name: 'Portugal' },
161
+ { code: 'PR', name: 'Puerto Rico' },
162
+ { code: 'QA', name: 'Qatar' },
163
+ { code: 'CG', name: 'Republic of the Congo' },
164
+ { code: 'RE', name: 'Reunion' },
165
+ { code: 'RO', name: 'Romania' },
166
+ { code: 'RU', name: 'Russia' },
167
+ { code: 'RW', name: 'Rwanda' },
168
+ { code: 'KN', name: 'Saint Kitts and Nevis' },
169
+ { code: 'LC', name: 'Saint Lucia' },
170
+ { code: 'MF', name: 'Saint Martin' },
171
+ { code: 'PM', name: 'Saint Pierre and Miquelon' },
172
+ { code: 'VC', name: 'Saint Vincent and the Grenadines' },
173
+ { code: 'WS', name: 'Samoa' },
174
+ { code: 'SM', name: 'San Marino' },
175
+ { code: 'ST', name: 'Sao Tome and Principe' },
176
+ { code: 'SA', name: 'Saudi Arabia' },
177
+ { code: 'SN', name: 'Senegal' },
178
+ { code: 'RS', name: 'Serbia' },
179
+ { code: 'SC', name: 'Seychelles' },
180
+ { code: 'SL', name: 'Sierra Leone' },
181
+ { code: 'SG', name: 'Singapore' },
182
+ { code: 'SX', name: 'Sint Maarten' },
183
+ { code: 'SK', name: 'Slovakia' },
184
+ { code: 'SI', name: 'Slovenia' },
185
+ { code: 'SB', name: 'Solomon Islands' },
186
+ { code: 'SO', name: 'Somalia' },
187
+ { code: 'ZA', name: 'South Africa' },
188
+ { code: 'KR', name: 'South Korea' },
189
+ { code: 'SS', name: 'South Sudan' },
190
+ { code: 'ES', name: 'Spain' },
191
+ { code: 'LK', name: 'Sri Lanka' },
192
+ { code: 'SD', name: 'Sudan' },
193
+ { code: 'SR', name: 'Suriname' },
194
+ { code: 'SZ', name: 'Swaziland' },
195
+ { code: 'SE', name: 'Sweden' },
196
+ { code: 'CH', name: 'Switzerland' },
197
+ { code: 'SY', name: 'Syria' },
198
+ { code: 'TW', name: 'Taiwan' },
199
+ { code: 'TJ', name: 'Tajikistan' },
200
+ { code: 'TZ', name: 'Tanzania' },
201
+ { code: 'TH', name: 'Thailand' },
202
+ { code: 'TG', name: 'Togo' },
203
+ { code: 'TO', name: 'Tonga' },
204
+ { code: 'TT', name: 'Trinidad and Tobago' },
205
+ { code: 'TN', name: 'Tunisia' },
206
+ { code: 'TR', name: 'Turkey' },
207
+ { code: 'TM', name: 'Turkmenistan' },
208
+ { code: 'TC', name: 'Turks and Caicos Islands' },
209
+ { code: 'TV', name: 'Tuvalu' },
210
+ { code: 'VI', name: 'U.S. Virgin Islands' },
211
+ { code: 'UG', name: 'Uganda' },
212
+ { code: 'UA', name: 'Ukraine' },
213
+ { code: 'AE', name: 'United Arab Emirates' },
214
+ { code: 'GB', name: 'United Kingdom' },
215
+ { code: 'US', name: 'United States' },
216
+ { code: 'UY', name: 'Uruguay' },
217
+ { code: 'UZ', name: 'Uzbekistan' },
218
+ { code: 'VU', name: 'Vanuatu' },
219
+ { code: 'VE', name: 'Venezuela' },
220
+ { code: 'VN', name: 'Vietnam' },
221
+ { code: 'EH', name: 'Western Sahara' },
222
+ { code: 'YE', name: 'Yemen' },
223
+ { code: 'ZM', name: 'Zambia' },
224
+ { code: 'ZW', name: 'Zimbabwe' },
225
+ ];
226
+
227
+ export function findCountryByCode(code: string): Country | undefined {
228
+ return COUNTRIES.find((country) => country.code.toUpperCase() === code.toUpperCase());
229
+ }
230
+
231
+ export function findCountryByName(name: string): Country | undefined {
232
+ const lowerName = name.toLowerCase();
233
+ return COUNTRIES.find((country) => country.name.toLowerCase().includes(lowerName));
234
+ }