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,29 @@
1
+ You are senior Nodejs React developer. You write code in well structured, easy to read manner, with self explanatory code.
2
+
3
+ Help me implmenet mcp called appstre-mcp that helps to intereact with App Store itunes api
4
+
5
+ Use typescript to implement, with modern nodejs version. Using 4 spaces. Use kebab-case for file naming
6
+
7
+ Code style and structure whodul be based on /Users/khoa/XcodeProject1/string-catalog-mcp
8
+
9
+ The feature code should be based on /Users/khoa/XcodeProject1/indiegoodies/src/features/tools/appstore-search, it uses app store itunes and rss api
10
+
11
+ Copy concept and use case, refactor to make code differnt
12
+
13
+ so we will have these tools, each tool will be in a folder kinside tools
14
+
15
+ src
16
+ mcp
17
+ tools
18
+
19
+ resources
20
+
21
+ Use pnpm for packcage management, use lates version of mcp sdk typescript, axios and zod
22
+
23
+ Wtih this mcp, yser can ask questiosn like
24
+
25
+ - list grossibga pps
26
+ - get app detail
27
+ - when is this app (name | id) release
28
+ - download screenshots for this app
29
+ - show trending apps in a categpry ina country. if n country then default to US
@@ -0,0 +1,24 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Bash(npm install:*)",
5
+ "Bash(pnpm install)",
6
+ "Bash(pnpm run build:*)",
7
+ "Bash(cat:*)",
8
+ "Bash(timeout 3 node:*)",
9
+ "Bash(pnpm add:*)",
10
+ "Bash(pnpm run typecheck:*)",
11
+ "Bash(pnpm run lint)",
12
+ "Bash(mkdir:*)",
13
+ "Bash(tree:*)",
14
+ "Bash(xargs basename:*)",
15
+ "Bash(ls:*)",
16
+ "Bash(xargs:*)",
17
+ "Bash(lsof:*)",
18
+ "Bash(git tag:*)",
19
+ "Bash(git push:*)",
20
+ "Bash(timeout 3 pnpm run dev:*)",
21
+ "Bash(gtimeout 3 pnpm run dev:*)"
22
+ ]
23
+ }
24
+ }
package/.prettierrc ADDED
@@ -0,0 +1,7 @@
1
+ {
2
+ "semi": true,
3
+ "singleQuote": true,
4
+ "tabWidth": 4,
5
+ "trailingComma": "es5",
6
+ "printWidth": 100
7
+ }
package/README.md ADDED
@@ -0,0 +1,170 @@
1
+ # App Store MCP
2
+
3
+ A Model Context Protocol (MCP) server for interacting with Apple's App Store iTunes API. This tool enables querying app information, searching the App Store, discovering trending apps, and retrieving app metadata through a standardized interface.
4
+
5
+ ## Features
6
+
7
+ ### App Search
8
+ - Search apps by name or keyword
9
+ - Filter by country/region
10
+ - Configurable result limits
11
+
12
+ ### App Details
13
+ - Get comprehensive app information by ID
14
+ - Retrieve app metadata (description, version, ratings)
15
+ - Access pricing and availability info
16
+
17
+ ### Trending Apps
18
+ - Discover top free, paid, and grossing apps
19
+ - Filter by platform (iPhone, iPad, Mac, Apple TV)
20
+ - Filter by category (Games, Productivity, etc.)
21
+ - Region-specific charts
22
+
23
+ ### Screenshots
24
+ - Get iPhone and iPad screenshot URLs
25
+ - Useful for app previews and analysis
26
+
27
+ ### Release Information
28
+ - Original release date
29
+ - Latest version release date
30
+ - Current version number
31
+
32
+ ## Prerequisites
33
+
34
+ - Node.js 18.0.0 or higher
35
+
36
+ ## Installation
37
+
38
+ Add to your MCP config:
39
+
40
+ ```json
41
+ {
42
+ "mcpServers": {
43
+ "appstore-mcp": {
44
+ "command": "pnpm",
45
+ "args": ["dlx", "appstore-mcp"]
46
+ }
47
+ }
48
+ }
49
+ ```
50
+
51
+ Or run locally:
52
+
53
+ ```json
54
+ {
55
+ "mcpServers": {
56
+ "appstore-mcp": {
57
+ "command": "node",
58
+ "args": ["/path/to/appstore-mcp/dist/index.js"]
59
+ }
60
+ }
61
+ }
62
+ ```
63
+
64
+ ## Usage
65
+
66
+ ### Available Tools
67
+
68
+ #### Search
69
+ - `search_apps` - Search for apps by name or keyword
70
+ - `query`: Search term (required)
71
+ - `country`: Country code (default: US)
72
+ - `limit`: Max results (default: 25)
73
+
74
+ #### App Information
75
+ - `get_app_info` - Get information about an app by ID
76
+ - `appId`: App Store ID (required)
77
+ - `country`: Country code (default: US)
78
+ - `include`: What info to return (default: basic)
79
+ - `basic` - Name, artist, icon, price, rating
80
+ - `full` - All details including description
81
+ - `release` - Release dates and version info
82
+ - `screenshots` - iPhone and iPad screenshot URLs
83
+
84
+ #### Trending
85
+ - `get_trending_apps` - Get top/trending apps
86
+ - `platform`: iphone, ipad, mac, or tv (default: iphone)
87
+ - `pricingType`: free, paid, or grossing (default: free)
88
+ - `country`: Country code (default: US)
89
+ - `categoryId`: Category ID to filter (optional)
90
+ - `limit`: Max results (default: 25)
91
+
92
+ ### Available Resources
93
+
94
+ Static reference data accessible via MCP resources:
95
+
96
+ - `appstore://countries` - List of all App Store country codes
97
+ - `appstore://categories` - App Store categories with IDs
98
+ - `appstore://platforms` - Supported platforms
99
+ - `appstore://pricing-types` - Pricing types (free, paid, grossing)
100
+
101
+ ## Example Queries
102
+
103
+ Ask Claude things like:
104
+
105
+ - "Search for weather apps"
106
+ - "Get details for app ID 389801252"
107
+ - "Show top grossing games in Japan"
108
+ - "When was Spotify released?"
109
+ - "Get screenshots for the Twitter app"
110
+ - "List trending productivity apps on iPad"
111
+
112
+ ## Category IDs
113
+
114
+ Common category IDs for filtering trending apps:
115
+
116
+ | ID | Category |
117
+ |----|----------|
118
+ | 6014 | Games |
119
+ | 6007 | Productivity |
120
+ | 6005 | Social Networking |
121
+ | 6016 | Entertainment |
122
+ | 6015 | Finance |
123
+ | 6008 | Photo & Video |
124
+ | 6017 | Education |
125
+ | 6013 | Health & Fitness |
126
+ | 6012 | Lifestyle |
127
+ | 6011 | Music |
128
+
129
+ ## Development
130
+
131
+ ```bash
132
+ # Install dependencies
133
+ pnpm install
134
+
135
+ # Development mode
136
+ pnpm run dev
137
+
138
+ # Build
139
+ pnpm run build
140
+
141
+ # Run MCP inspector
142
+ pnpm run inspect
143
+
144
+ # Type check
145
+ pnpm run typecheck
146
+
147
+ # Lint
148
+ pnpm run lint
149
+ ```
150
+
151
+ ## API Reference
152
+
153
+ This MCP server uses the following Apple APIs:
154
+
155
+ - **iTunes Search API** - App search and lookup
156
+ - **iTunes RSS Feed** - Top charts and trending apps
157
+
158
+ No authentication required - these are public APIs.
159
+
160
+ ## Error Handling
161
+
162
+ The server provides detailed error messages for:
163
+ - App not found
164
+ - Invalid parameters
165
+ - Network errors
166
+ - API rate limits
167
+
168
+ ## License
169
+
170
+ MIT
@@ -0,0 +1,21 @@
1
+ import { App, Platform, PricingType } from './types';
2
+ export declare class AppStoreService {
3
+ private static getFeedName;
4
+ private static buildRssUrl;
5
+ private static parseSearchResult;
6
+ private static parseRssEntry;
7
+ static searchApps(query: string, country?: string, limit?: number): Promise<App[]>;
8
+ static getAppDetails(appId: string, country?: string): Promise<App | null>;
9
+ static lookupMultipleApps(appIds: string[], country?: string): Promise<Map<string, App>>;
10
+ static getTrendingApps(platform?: Platform, pricingType?: PricingType, country?: string, categoryId?: string, limit?: number): Promise<App[]>;
11
+ static getAppReleaseInfo(appId: string, country?: string): Promise<{
12
+ releaseDate?: string;
13
+ currentVersionReleaseDate?: string;
14
+ version?: string;
15
+ } | null>;
16
+ static getAppScreenshots(appId: string, country?: string): Promise<{
17
+ screenshotUrls: string[];
18
+ ipadScreenshotUrls: string[];
19
+ } | null>;
20
+ }
21
+ //# sourceMappingURL=app-store-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-store-service.d.ts","sourceRoot":"","sources":["../src/app-store-service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAyDrD,qBAAa,eAAe;IACxB,OAAO,CAAC,MAAM,CAAC,WAAW;IA2B1B,OAAO,CAAC,MAAM,CAAC,WAAW;IAU1B,OAAO,CAAC,MAAM,CAAC,iBAAiB;IA0BhC,OAAO,CAAC,MAAM,CAAC,aAAa;WAiBf,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,MAAa,EAAE,KAAK,GAAE,MAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;WAarF,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,MAAa,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;WAezE,kBAAkB,CAC3B,MAAM,EAAE,MAAM,EAAE,EAChB,OAAO,GAAE,MAAa,GACvB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;WAiBf,eAAe,CACxB,QAAQ,GAAE,QAAmB,EAC7B,WAAW,GAAE,WAAoB,EACjC,OAAO,GAAE,MAAa,EACtB,UAAU,CAAC,EAAE,MAAM,EACnB,KAAK,GAAE,MAAW,GACnB,OAAO,CAAC,GAAG,EAAE,CAAC;WAUJ,iBAAiB,CAC1B,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,MAAa,GACvB,OAAO,CAAC;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,yBAAyB,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;WAcpF,iBAAiB,CAC1B,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,MAAa,GACvB,OAAO,CAAC;QAAE,cAAc,EAAE,MAAM,EAAE,CAAC;QAAC,kBAAkB,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,IAAI,CAAC;CAYhF"}
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXN0b3JlLXNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvYXBwLXN0b3JlLXNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsa0RBQTBCO0FBRzFCLE1BQU0saUJBQWlCLEdBQUcsaUNBQWlDLENBQUM7QUFDNUQsTUFBTSxpQkFBaUIsR0FBRyxpQ0FBaUMsQ0FBQztBQUM1RCxNQUFNLGVBQWUsR0FBRywwQkFBMEIsQ0FBQztBQXFEbkQsTUFBYSxlQUFlO0lBQ2hCLE1BQU0sQ0FBQyxXQUFXLENBQUMsUUFBa0IsRUFBRSxXQUF3QjtRQUNuRSxNQUFNLE9BQU8sR0FBa0Q7WUFDM0QsTUFBTSxFQUFFO2dCQUNKLElBQUksRUFBRSxxQkFBcUI7Z0JBQzNCLElBQUksRUFBRSxxQkFBcUI7Z0JBQzNCLFFBQVEsRUFBRSx5QkFBeUI7YUFDdEM7WUFDRCxJQUFJLEVBQUU7Z0JBQ0YsSUFBSSxFQUFFLHlCQUF5QjtnQkFDL0IsSUFBSSxFQUFFLHlCQUF5QjtnQkFDL0IsUUFBUSxFQUFFLDZCQUE2QjthQUMxQztZQUNELEdBQUcsRUFBRTtnQkFDRCxJQUFJLEVBQUUsZ0JBQWdCO2dCQUN0QixJQUFJLEVBQUUsZ0JBQWdCO2dCQUN0QixRQUFRLEVBQUUsb0JBQW9CO2FBQ2pDO1lBQ0QsRUFBRSxFQUFFO2dCQUNBLElBQUksRUFBRSxvQkFBb0I7Z0JBQzFCLElBQUksRUFBRSxvQkFBb0I7Z0JBQzFCLFFBQVEsRUFBRSx3QkFBd0I7YUFDckM7U0FDSixDQUFDO1FBRUYsT0FBTyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVPLE1BQU0sQ0FBQyxXQUFXLENBQ3RCLFdBQW1CLEVBQ25CLFFBQWdCLEVBQ2hCLEtBQWEsRUFDYixVQUFtQjtRQUVuQixNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsVUFBVSxFQUFFLENBQUMsQ0FBQyxD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
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
5
+ const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
6
+ const tools_1 = require("./mcp/tools");
7
+ const resources_1 = require("./mcp/resources");
8
+ const server = new mcp_js_1.McpServer({
9
+ name: 'appstore-mcp',
10
+ version: '1.0.0',
11
+ });
12
+ (0, tools_1.registerAllTools)(server);
13
+ (0, resources_1.registerAllResources)(server);
14
+ async function main() {
15
+ const transport = new stdio_js_1.StdioServerTransport();
16
+ await server.connect(transport);
17
+ }
18
+ main().catch((error) => {
19
+ console.error('Failed to start server:', error);
20
+ process.exit(1);
21
+ });
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsb0VBQW9FO0FBQ3BFLHdFQUFpRjtBQUNqRix1Q0FBK0M7QUFDL0MsK0NBQXVEO0FBRXZELE1BQU0sTUFBTSxHQUFHLElBQUksa0JBQVMsQ0FBQztJQUN6QixJQUFJLEVBQUUsY0FBYztJQUNwQixPQUFPLEVBQUUsT0FBTztDQUNuQixDQUFDLENBQUM7QUFFSCxJQUFBLHdCQUFnQixFQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3pCLElBQUEsZ0NBQW9CLEVBQUMsTUFBTSxDQUFDLENBQUM7QUFFN0IsS0FBSyxVQUFVLElBQUk7SUFDZixNQUFNLFNBQVMsR0FBRyxJQUFJLCtCQUFvQixFQUFFLENBQUM7SUFDN0MsTUFBTSxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ3BDLENBQUM7QUFFRCxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtJQUNuQixPQUFPLENBQUMsS0FBSyxDQUFDLHlCQUF5QixFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2hELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEIsQ0FBQyxDQUFDLENBQUMifQ==
@@ -0,0 +1,5 @@
1
+ import { Country } from '../../types';
2
+ export declare const COUNTRIES: Country[];
3
+ export declare function findCountryByCode(code: string): Country | undefined;
4
+ export declare function findCountryByName(name: string): Country | undefined;
5
+ //# sourceMappingURL=countries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"countries.d.ts","sourceRoot":"","sources":["../../../src/mcp/resources/countries.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,eAAO,MAAM,SAAS,EAAE,OAAO,EA8N9B,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAEnE;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAGnE"}