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.
- package/.claude/CLAUDE.md +29 -0
- package/.claude/settings.local.json +24 -0
- package/.prettierrc +7 -0
- package/README.md +170 -0
- package/dist/app-store-service.d.ts +21 -0
- package/dist/app-store-service.d.ts.map +1 -0
- package/dist/app-store-service.js +146 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/mcp/resources/countries.d.ts +5 -0
- package/dist/mcp/resources/countries.d.ts.map +1 -0
- package/dist/mcp/resources/countries.js +236 -0
- package/dist/mcp/resources/index.d.ts +3 -0
- package/dist/mcp/resources/index.d.ts.map +1 -0
- package/dist/mcp/resources/index.js +80 -0
- package/dist/mcp/tools/get-app-details.d.ts +3 -0
- package/dist/mcp/tools/get-app-details.d.ts.map +1 -0
- package/dist/mcp/tools/get-app-details.js +84 -0
- package/dist/mcp/tools/get-app-info.d.ts +3 -0
- package/dist/mcp/tools/get-app-info.d.ts.map +1 -0
- package/dist/mcp/tools/get-app-info.js +156 -0
- package/dist/mcp/tools/get-app-release-info.d.ts +3 -0
- package/dist/mcp/tools/get-app-release-info.d.ts.map +1 -0
- package/dist/mcp/tools/get-app-release-info.js +80 -0
- package/dist/mcp/tools/get-app-screenshots.d.ts +3 -0
- package/dist/mcp/tools/get-app-screenshots.d.ts.map +1 -0
- package/dist/mcp/tools/get-app-screenshots.js +71 -0
- package/dist/mcp/tools/get-trending-apps.d.ts +3 -0
- package/dist/mcp/tools/get-trending-apps.d.ts.map +1 -0
- package/dist/mcp/tools/get-trending-apps.js +89 -0
- package/dist/mcp/tools/index.d.ts +3 -0
- package/dist/mcp/tools/index.d.ts.map +1 -0
- package/dist/mcp/tools/index.js +12 -0
- package/dist/mcp/tools/list-categories.d.ts +3 -0
- package/dist/mcp/tools/list-categories.d.ts.map +1 -0
- package/dist/mcp/tools/list-categories.js +38 -0
- package/dist/mcp/tools/list-countries.d.ts +3 -0
- package/dist/mcp/tools/list-countries.d.ts.map +1 -0
- package/dist/mcp/tools/list-countries.js +40 -0
- package/dist/mcp/tools/search-apps.d.ts +3 -0
- package/dist/mcp/tools/search-apps.d.ts.map +1 -0
- package/dist/mcp/tools/search-apps.js +67 -0
- package/dist/services/app-store-service.d.ts +21 -0
- package/dist/services/app-store-service.d.ts.map +1 -0
- package/dist/services/app-store-service.js +146 -0
- package/dist/types.d.ts +46 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +41 -0
- package/eslint.config.js +9 -0
- package/package.json +46 -0
- package/src/index.ts +24 -0
- package/src/mcp/resources/countries.ts +234 -0
- package/src/mcp/resources/index.ts +117 -0
- package/src/mcp/tools/get-app-info.ts +183 -0
- package/src/mcp/tools/get-trending-apps.ts +108 -0
- package/src/mcp/tools/index.ts +10 -0
- package/src/mcp/tools/search-apps.ts +74 -0
- package/src/services/app-store-service.ts +236 -0
- package/src/types.ts +77 -0
- 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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
|
package/dist/types.d.ts
ADDED
|
@@ -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
|
package/eslint.config.js
ADDED
|
@@ -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
|
+
}
|