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,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
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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
|
package/dist/index.d.ts
ADDED
|
@@ -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"}
|