@appscreenshotstudio/mcp 0.1.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/LICENSE +21 -0
- package/README.md +121 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +252 -0
- package/package.json +44 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 AppScreenshotStudio
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# @appscreenshotstudio/mcp
|
|
2
|
+
|
|
3
|
+
MCP server for generating App Store screenshots via [AppScreenshotStudio](https://appscreenshotstudio.com).
|
|
4
|
+
|
|
5
|
+
Let your AI agent (Claude Code, Cursor, Windsurf) generate, edit, and export App Store screenshots as a native tool.
|
|
6
|
+
|
|
7
|
+
## Setup
|
|
8
|
+
|
|
9
|
+
### 1. Get an API key
|
|
10
|
+
|
|
11
|
+
Create one at [appscreenshotstudio.com/settings](https://appscreenshotstudio.com/settings) under **API Keys**.
|
|
12
|
+
|
|
13
|
+
### 2. Install
|
|
14
|
+
|
|
15
|
+
**Claude Code:**
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
claude mcp add appscreenshotstudio -- npx -y @appscreenshotstudio/mcp
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Then add to your shell profile (`.bashrc`, `.zshrc`, etc.):
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
export APPSCREENSHOTSTUDIO_API_KEY="sk_live_your_key_here"
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**Cursor / Windsurf / Other MCP clients:**
|
|
28
|
+
|
|
29
|
+
Add to your MCP config (`.cursor/mcp.json`, `settings.json`, etc.):
|
|
30
|
+
|
|
31
|
+
```json
|
|
32
|
+
{
|
|
33
|
+
"mcpServers": {
|
|
34
|
+
"appscreenshotstudio": {
|
|
35
|
+
"command": "npx",
|
|
36
|
+
"args": ["-y", "@appscreenshotstudio/mcp"],
|
|
37
|
+
"env": {
|
|
38
|
+
"APPSCREENSHOTSTUDIO_API_KEY": "sk_live_your_key_here"
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Tools
|
|
46
|
+
|
|
47
|
+
### `generate-screenshots`
|
|
48
|
+
|
|
49
|
+
Create a complete set of App Store screenshots. One tool call = one full project.
|
|
50
|
+
|
|
51
|
+
| Parameter | Type | Required | Description |
|
|
52
|
+
|---|---|---|---|
|
|
53
|
+
| `app_name` | string | Yes | App name |
|
|
54
|
+
| `app_description` | string | Yes | What the app does (1-3 sentences) |
|
|
55
|
+
| `features` | string[] | No | Key features, ordered by importance (max 10) |
|
|
56
|
+
| `brand_colors` | object | No | `{ primary, secondary?, accent? }` as hex |
|
|
57
|
+
| `mood` | string | No | "energetic", "calm", "minimal", "bold", etc. |
|
|
58
|
+
| `device_id` | string | No | Target device (default: `iphone-6.9`) |
|
|
59
|
+
| `count` | number | No | Number of cards, 3-10 (default: 5) |
|
|
60
|
+
| `story_flow` | string | No | Narrative structure (default: `auto`) |
|
|
61
|
+
|
|
62
|
+
**Costs 1 credit.**
|
|
63
|
+
|
|
64
|
+
### `edit-screenshots`
|
|
65
|
+
|
|
66
|
+
Make changes to an existing project with natural language.
|
|
67
|
+
|
|
68
|
+
| Parameter | Type | Required | Description |
|
|
69
|
+
|---|---|---|---|
|
|
70
|
+
| `project_id` | string | Yes | From a previous `generate-screenshots` call |
|
|
71
|
+
| `message` | string | Yes | What to change |
|
|
72
|
+
|
|
73
|
+
**Costs 1 credit.**
|
|
74
|
+
|
|
75
|
+
### `render-screenshots`
|
|
76
|
+
|
|
77
|
+
Export to high-resolution PNGs. Returns download URLs.
|
|
78
|
+
|
|
79
|
+
| Parameter | Type | Required | Description |
|
|
80
|
+
|---|---|---|---|
|
|
81
|
+
| `project_id` | string | Yes | Project to render |
|
|
82
|
+
|
|
83
|
+
**Free.**
|
|
84
|
+
|
|
85
|
+
### `list-devices`
|
|
86
|
+
|
|
87
|
+
Show all supported device specs. No API call needed.
|
|
88
|
+
|
|
89
|
+
**Free.**
|
|
90
|
+
|
|
91
|
+
## Supported Devices
|
|
92
|
+
|
|
93
|
+
| ID | Name | Size | Required |
|
|
94
|
+
|---|---|---|---|
|
|
95
|
+
| `iphone-6.9` | iPhone 16 Pro Max | 1260x2736 | App Store |
|
|
96
|
+
| `ipad-13` | iPad Pro 13" | 2064x2752 | App Store |
|
|
97
|
+
| `android-phone` | Android Phone | 1080x2340 | Play Store |
|
|
98
|
+
| `android-tablet-10` | Android Tablet 10" | 2560x1600 | Play Store |
|
|
99
|
+
| `iphone-6.5` | iPhone 14 Plus | 1284x2778 | Optional |
|
|
100
|
+
| `iphone-6.3` | iPhone 16 Pro | 1179x2556 | Optional |
|
|
101
|
+
| `iphone-6.1` | iPhone 14 | 1170x2532 | Optional |
|
|
102
|
+
|
|
103
|
+
## Workflow
|
|
104
|
+
|
|
105
|
+
1. **Generate** — Agent calls `generate-screenshots` with your app details
|
|
106
|
+
2. **Iterate** — Agent calls `edit-screenshots` to refine
|
|
107
|
+
3. **Upload** — Open the project URL, upload your actual app screenshots into the device mockups
|
|
108
|
+
4. **Export** — Agent calls `render-screenshots` or click "Download All" in the web app
|
|
109
|
+
|
|
110
|
+
## Security
|
|
111
|
+
|
|
112
|
+
- API key stays on your machine (environment variable)
|
|
113
|
+
- All API calls over HTTPS
|
|
114
|
+
- stdio transport — no network ports opened
|
|
115
|
+
- Revoke keys anytime in Settings
|
|
116
|
+
|
|
117
|
+
## Links
|
|
118
|
+
|
|
119
|
+
- [Full docs](https://appscreenshotstudio.com/docs/mcp)
|
|
120
|
+
- [REST API reference](https://appscreenshotstudio.com/docs/api)
|
|
121
|
+
- [Pricing](https://appscreenshotstudio.com/pricing)
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
3
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
const API_BASE = process.env.APPSCREENSHOTSTUDIO_URL || 'https://appscreenshotstudio.com';
|
|
6
|
+
const API_KEY = process.env.APPSCREENSHOTSTUDIO_API_KEY;
|
|
7
|
+
// ─── Devices (mirrors lib/device-specs.ts) ─────────────────────────────────────
|
|
8
|
+
const DEVICES = [
|
|
9
|
+
{ id: 'iphone-6.9', name: 'iPhone 16 Pro Max', width: 1260, height: 2736, category: 'iphone', required: true },
|
|
10
|
+
{ id: 'iphone-6.5', name: 'iPhone 14 Plus', width: 1284, height: 2778, category: 'iphone', required: false },
|
|
11
|
+
{ id: 'iphone-6.3', name: 'iPhone 16 Pro', width: 1179, height: 2556, category: 'iphone', required: false },
|
|
12
|
+
{ id: 'iphone-6.1', name: 'iPhone 14', width: 1170, height: 2532, category: 'iphone', required: false },
|
|
13
|
+
{ id: 'iphone-5.5', name: 'iPhone 8 Plus', width: 1242, height: 2208, category: 'iphone', required: false },
|
|
14
|
+
{ id: 'ipad-13', name: 'iPad Pro 13"', width: 2064, height: 2752, category: 'ipad', required: true },
|
|
15
|
+
{ id: 'ipad-12.9', name: 'iPad Pro 12.9"', width: 2048, height: 2732, category: 'ipad', required: false },
|
|
16
|
+
{ id: 'ipad-11', name: 'iPad Pro 11"', width: 1668, height: 2388, category: 'ipad', required: false },
|
|
17
|
+
{ id: 'android-phone', name: 'Android Phone', width: 1080, height: 2340, category: 'android-phone', required: true },
|
|
18
|
+
{ id: 'android-tablet-10', name: 'Android Tablet 10"', width: 2560, height: 1600, category: 'android-tablet', required: true },
|
|
19
|
+
];
|
|
20
|
+
const VALID_DEVICE_IDS = DEVICES.map(d => d.id);
|
|
21
|
+
// ─── API helper ─────────────────────────────────────────────────────────────────
|
|
22
|
+
async function apiCall(method, path, body) {
|
|
23
|
+
if (!API_KEY) {
|
|
24
|
+
return { ok: false, status: 401, data: { error: 'APPSCREENSHOTSTUDIO_API_KEY not set' } };
|
|
25
|
+
}
|
|
26
|
+
const res = await fetch(`${API_BASE}${path}`, {
|
|
27
|
+
method,
|
|
28
|
+
headers: {
|
|
29
|
+
'Authorization': `Bearer ${API_KEY}`,
|
|
30
|
+
'Content-Type': 'application/json',
|
|
31
|
+
},
|
|
32
|
+
...(body ? { body: JSON.stringify(body) } : {}),
|
|
33
|
+
});
|
|
34
|
+
const data = await res.json();
|
|
35
|
+
return { ok: res.ok, status: res.status, data };
|
|
36
|
+
}
|
|
37
|
+
// ─── Message builder ────────────────────────────────────────────────────────────
|
|
38
|
+
const STORY_FLOW_DESCRIPTIONS = {
|
|
39
|
+
'auto': 'Choose the best narrative structure automatically',
|
|
40
|
+
'standard': 'Standard feature highlights',
|
|
41
|
+
'problem-solution': 'Problem, then solution, then benefit',
|
|
42
|
+
'social-proof': 'Lead with testimonials and reviews',
|
|
43
|
+
'benefit-first': 'Lead with benefits, features later',
|
|
44
|
+
'journey': 'User journey and before/after transformation',
|
|
45
|
+
'hero-intro': 'Hero branding screen first (no device), then features with devices',
|
|
46
|
+
'social-proof-bookend': 'Hero intro, then features, then social proof ending',
|
|
47
|
+
};
|
|
48
|
+
function buildDesignMessage(input) {
|
|
49
|
+
const parts = [];
|
|
50
|
+
parts.push(`Create ${input.count} App Store screenshots for my app.`);
|
|
51
|
+
parts.push(`\nApp name: ${input.app_name}`);
|
|
52
|
+
parts.push(`Description: ${input.app_description}`);
|
|
53
|
+
if (input.features?.length) {
|
|
54
|
+
parts.push(`\nKey features (in order of importance):`);
|
|
55
|
+
for (const f of input.features) {
|
|
56
|
+
parts.push(`- ${f}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
if (input.brand_colors) {
|
|
60
|
+
const colors = [`primary: ${input.brand_colors.primary}`];
|
|
61
|
+
if (input.brand_colors.secondary)
|
|
62
|
+
colors.push(`secondary: ${input.brand_colors.secondary}`);
|
|
63
|
+
if (input.brand_colors.accent)
|
|
64
|
+
colors.push(`accent: ${input.brand_colors.accent}`);
|
|
65
|
+
parts.push(`\nBrand colors: ${colors.join(', ')}`);
|
|
66
|
+
}
|
|
67
|
+
if (input.mood) {
|
|
68
|
+
parts.push(`Mood: ${input.mood}`);
|
|
69
|
+
}
|
|
70
|
+
if (input.story_flow && input.story_flow !== 'auto') {
|
|
71
|
+
parts.push(`\nStory flow: ${input.story_flow} (${STORY_FLOW_DESCRIPTIONS[input.story_flow] || input.story_flow})`);
|
|
72
|
+
}
|
|
73
|
+
parts.push(`\nAll device mockups should have screenshotImage: null — the developer will upload actual app screenshots later.`);
|
|
74
|
+
parts.push(`Please include projectMeta with brand colors, mood, appCategory, and a rich globalVisualTheme description.`);
|
|
75
|
+
return parts.join('\n');
|
|
76
|
+
}
|
|
77
|
+
// ─── MCP Server ─────────────────────────────────────────────────────────────────
|
|
78
|
+
const server = new McpServer({
|
|
79
|
+
name: 'appscreenshotstudio',
|
|
80
|
+
version: '0.1.0',
|
|
81
|
+
});
|
|
82
|
+
// Tool 1: generate-screenshots
|
|
83
|
+
server.registerTool('generate-screenshots', {
|
|
84
|
+
title: 'Generate App Store Screenshots',
|
|
85
|
+
description: 'Create a complete set of App Store screenshot designs for an app. Generates multiple cards with headlines, backgrounds, device mockups, and a cohesive story flow. Returns a project URL where the developer can upload their actual app screenshots into the device frames and export final PNGs.',
|
|
86
|
+
inputSchema: z.object({
|
|
87
|
+
app_name: z.string().describe('Name of the app'),
|
|
88
|
+
app_description: z.string().describe('What the app does — 1-3 sentences'),
|
|
89
|
+
features: z.array(z.string()).max(10).optional()
|
|
90
|
+
.describe('Key features in order of importance. The first 2-3 will be highlighted most prominently.'),
|
|
91
|
+
brand_colors: z.object({
|
|
92
|
+
primary: z.string().describe('Primary brand color as hex (e.g. #7C3AED)'),
|
|
93
|
+
secondary: z.string().optional().describe('Secondary color as hex'),
|
|
94
|
+
accent: z.string().optional().describe('Accent color as hex'),
|
|
95
|
+
}).optional().describe('Brand colors to use in the design'),
|
|
96
|
+
mood: z.string().optional()
|
|
97
|
+
.describe('Design mood — e.g. "energetic", "calm", "minimal", "bold", "professional", "playful"'),
|
|
98
|
+
device_id: z.string().default('iphone-6.9')
|
|
99
|
+
.describe(`Target device. Options: ${VALID_DEVICE_IDS.join(', ')}. Default: iphone-6.9 (iPhone 16 Pro Max)`),
|
|
100
|
+
count: z.number().min(3).max(10).default(5)
|
|
101
|
+
.describe('Number of screenshot cards to generate (3-10). Default: 5'),
|
|
102
|
+
story_flow: z.enum(['auto', 'standard', 'problem-solution', 'social-proof', 'benefit-first', 'journey', 'hero-intro', 'social-proof-bookend']).default('auto')
|
|
103
|
+
.describe('Narrative structure for the screenshots. "auto" lets the AI choose the best flow.'),
|
|
104
|
+
}),
|
|
105
|
+
}, async (input) => {
|
|
106
|
+
// Step 1: Create project
|
|
107
|
+
const projectName = `${input.app_name} Screenshots`;
|
|
108
|
+
const createRes = await apiCall('POST', '/api/v1/projects', {
|
|
109
|
+
device_id: input.device_id,
|
|
110
|
+
name: projectName,
|
|
111
|
+
});
|
|
112
|
+
if (!createRes.ok) {
|
|
113
|
+
return {
|
|
114
|
+
content: [{ type: 'text', text: `Failed to create project: ${JSON.stringify(createRes.data)}` }],
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
const project = createRes.data.data;
|
|
118
|
+
const projectId = project.id;
|
|
119
|
+
// Step 2: Chat to generate all cards
|
|
120
|
+
const message = buildDesignMessage(input);
|
|
121
|
+
const chatRes = await apiCall('POST', `/api/v1/projects/${projectId}/chat`, {
|
|
122
|
+
message,
|
|
123
|
+
selected_card_indices: [],
|
|
124
|
+
});
|
|
125
|
+
if (!chatRes.ok) {
|
|
126
|
+
return {
|
|
127
|
+
content: [{ type: 'text', text: `Project created (${projectId}) but design generation failed: ${JSON.stringify(chatRes.data)}` }],
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
const chatData = chatRes.data.data;
|
|
131
|
+
const creditsRemaining = chatRes.data.credits_remaining;
|
|
132
|
+
const projectUrl = `${API_BASE}/builder/${projectId}`;
|
|
133
|
+
return {
|
|
134
|
+
content: [{
|
|
135
|
+
type: 'text',
|
|
136
|
+
text: [
|
|
137
|
+
`Generated ${chatData.canvas_state?.cards?.length || 0} screenshot cards for "${input.app_name}".`,
|
|
138
|
+
'',
|
|
139
|
+
chatData.message,
|
|
140
|
+
'',
|
|
141
|
+
`Project URL: ${projectUrl}`,
|
|
142
|
+
`Project ID: ${projectId}`,
|
|
143
|
+
`Credits remaining: ${creditsRemaining}`,
|
|
144
|
+
'',
|
|
145
|
+
'Next steps:',
|
|
146
|
+
'1. Open the project URL in a browser',
|
|
147
|
+
'2. Upload app screenshots into the device mockups',
|
|
148
|
+
'3. Click "Download All" to export final PNGs',
|
|
149
|
+
'',
|
|
150
|
+
chatData.suggestions?.length
|
|
151
|
+
? `Suggestions: ${chatData.suggestions.join(', ')}`
|
|
152
|
+
: '',
|
|
153
|
+
].filter(Boolean).join('\n'),
|
|
154
|
+
}],
|
|
155
|
+
};
|
|
156
|
+
});
|
|
157
|
+
// Tool 2: edit-screenshots
|
|
158
|
+
server.registerTool('edit-screenshots', {
|
|
159
|
+
title: 'Edit Screenshot Designs',
|
|
160
|
+
description: 'Make changes to an existing screenshot project. Use natural language to describe what you want to change — e.g. "make the headlines bigger", "change the color scheme to blue", "add a social proof card".',
|
|
161
|
+
inputSchema: z.object({
|
|
162
|
+
project_id: z.string().describe('Project ID from a previous generate-screenshots call'),
|
|
163
|
+
message: z.string().describe('What to change — use natural language'),
|
|
164
|
+
}),
|
|
165
|
+
}, async ({ project_id, message }) => {
|
|
166
|
+
const res = await apiCall('POST', `/api/v1/projects/${project_id}/chat`, {
|
|
167
|
+
message,
|
|
168
|
+
selected_card_indices: [],
|
|
169
|
+
});
|
|
170
|
+
if (!res.ok) {
|
|
171
|
+
return {
|
|
172
|
+
content: [{ type: 'text', text: `Edit failed: ${JSON.stringify(res.data)}` }],
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
const data = res.data.data;
|
|
176
|
+
const creditsRemaining = res.data.credits_remaining;
|
|
177
|
+
return {
|
|
178
|
+
content: [{
|
|
179
|
+
type: 'text',
|
|
180
|
+
text: [
|
|
181
|
+
data.message,
|
|
182
|
+
'',
|
|
183
|
+
`Cards: ${data.canvas_state?.cards?.length || 0}`,
|
|
184
|
+
`Credits remaining: ${creditsRemaining}`,
|
|
185
|
+
`Project URL: ${API_BASE}/builder/${project_id}`,
|
|
186
|
+
'',
|
|
187
|
+
data.suggestions?.length
|
|
188
|
+
? `Suggestions: ${data.suggestions.join(', ')}`
|
|
189
|
+
: '',
|
|
190
|
+
].filter(Boolean).join('\n'),
|
|
191
|
+
}],
|
|
192
|
+
};
|
|
193
|
+
});
|
|
194
|
+
// Tool 3: render-screenshots
|
|
195
|
+
server.registerTool('render-screenshots', {
|
|
196
|
+
title: 'Render Screenshots to PNG',
|
|
197
|
+
description: 'Export a screenshot project to high-resolution PNG files. Returns download URLs for each card. Note: device mockups will be empty unless screenshots have been uploaded via the web app first.',
|
|
198
|
+
inputSchema: z.object({
|
|
199
|
+
project_id: z.string().describe('Project ID to render'),
|
|
200
|
+
}),
|
|
201
|
+
}, async ({ project_id }) => {
|
|
202
|
+
const res = await apiCall('POST', `/api/v1/projects/${project_id}/render`);
|
|
203
|
+
if (!res.ok) {
|
|
204
|
+
return {
|
|
205
|
+
content: [{ type: 'text', text: `Render failed: ${JSON.stringify(res.data)}` }],
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
const data = res.data.data;
|
|
209
|
+
return {
|
|
210
|
+
content: [{
|
|
211
|
+
type: 'text',
|
|
212
|
+
text: [
|
|
213
|
+
`Rendered ${data.images?.length || 0} screenshots:`,
|
|
214
|
+
'',
|
|
215
|
+
...(data.images || []).map((url, i) => `Card ${i + 1}: ${url}`),
|
|
216
|
+
].join('\n'),
|
|
217
|
+
}],
|
|
218
|
+
};
|
|
219
|
+
});
|
|
220
|
+
// Tool 4: list-devices
|
|
221
|
+
server.registerTool('list-devices', {
|
|
222
|
+
title: 'List Supported Devices',
|
|
223
|
+
description: 'Show all supported device specs for App Store and Play Store screenshots. Use the device ID when generating screenshots.',
|
|
224
|
+
inputSchema: z.object({}),
|
|
225
|
+
}, async () => {
|
|
226
|
+
const lines = DEVICES.map(d => `${d.id} — ${d.name} (${d.width}×${d.height}, ${d.category}${d.required ? ', required for store submission' : ''})`);
|
|
227
|
+
return {
|
|
228
|
+
content: [{
|
|
229
|
+
type: 'text',
|
|
230
|
+
text: [
|
|
231
|
+
'Supported devices:',
|
|
232
|
+
'',
|
|
233
|
+
...lines,
|
|
234
|
+
'',
|
|
235
|
+
'Default: iphone-6.9 (iPhone 16 Pro Max, 1260×2736)',
|
|
236
|
+
'For App Store, you need at least: iphone-6.9 + ipad-13',
|
|
237
|
+
].join('\n'),
|
|
238
|
+
}],
|
|
239
|
+
};
|
|
240
|
+
});
|
|
241
|
+
// ─── Start server ───────────────────────────────────────────────────────────────
|
|
242
|
+
async function main() {
|
|
243
|
+
if (!API_KEY) {
|
|
244
|
+
console.error('Warning: APPSCREENSHOTSTUDIO_API_KEY not set. Tools will fail until it is configured.');
|
|
245
|
+
}
|
|
246
|
+
const transport = new StdioServerTransport();
|
|
247
|
+
await server.connect(transport);
|
|
248
|
+
}
|
|
249
|
+
main().catch((err) => {
|
|
250
|
+
console.error('MCP server failed to start:', err);
|
|
251
|
+
process.exit(1);
|
|
252
|
+
});
|
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@appscreenshotstudio/mcp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "MCP server for generating App Store screenshots via AppScreenshotStudio",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"homepage": "https://appscreenshotstudio.com/docs/mcp",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "https://github.com/appscreenshotstudio/mcp-server"
|
|
11
|
+
},
|
|
12
|
+
"keywords": [
|
|
13
|
+
"mcp",
|
|
14
|
+
"model-context-protocol",
|
|
15
|
+
"app-store-screenshots",
|
|
16
|
+
"screenshot-generator",
|
|
17
|
+
"appscreenshotstudio",
|
|
18
|
+
"ai-tools"
|
|
19
|
+
],
|
|
20
|
+
"bin": {
|
|
21
|
+
"appscreenshotstudio-mcp": "dist/index.js"
|
|
22
|
+
},
|
|
23
|
+
"scripts": {
|
|
24
|
+
"build": "tsc",
|
|
25
|
+
"start": "node dist/index.js",
|
|
26
|
+
"dev": "tsc --watch",
|
|
27
|
+
"prepublishOnly": "npm run build"
|
|
28
|
+
},
|
|
29
|
+
"dependencies": {
|
|
30
|
+
"@modelcontextprotocol/sdk": "^1.27.1",
|
|
31
|
+
"zod": "^3.25.67"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"@types/node": "^22.0.0",
|
|
35
|
+
"typescript": "^5.8.0"
|
|
36
|
+
},
|
|
37
|
+
"engines": {
|
|
38
|
+
"node": ">=18"
|
|
39
|
+
},
|
|
40
|
+
"files": [
|
|
41
|
+
"dist",
|
|
42
|
+
"README.md"
|
|
43
|
+
]
|
|
44
|
+
}
|