@shipstatic/mcp 0.2.0 → 0.4.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/README.md +32 -12
- package/dist/call.js +2 -2
- package/dist/index.js +2 -15
- package/dist/server.js +19 -16
- package/package.json +17 -14
package/README.md
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
# @shipstatic/mcp
|
|
2
2
|
|
|
3
|
-
MCP server for [ShipStatic](https://shipstatic.com)
|
|
3
|
+
MCP server for [ShipStatic](https://shipstatic.com) — deploy static sites instantly from AI agents. No account required.
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
Works with Claude Code, Cursor, VS Code Copilot, and any MCP-compatible client.
|
|
5
|
+
Works with Claude Code, Cursor, VS Code Copilot, and any MCP-compatible client. Deployments are live immediately — no setup, no credentials needed.
|
|
8
6
|
|
|
9
7
|
<a href="https://glama.ai/mcp/servers/@shipstatic/shipstatic">
|
|
10
8
|
<img width="380" height="200" src="https://glama.ai/mcp/servers/@shipstatic/shipstatic/badge" alt="shipstatic MCP server" />
|
|
@@ -15,28 +13,50 @@ Works with Claude Code, Cursor, VS Code Copilot, and any MCP-compatible client.
|
|
|
15
13
|
### Claude Code
|
|
16
14
|
|
|
17
15
|
```bash
|
|
18
|
-
claude mcp add shipstatic
|
|
16
|
+
claude mcp add shipstatic -- npx @shipstatic/mcp
|
|
19
17
|
```
|
|
20
18
|
|
|
21
|
-
###
|
|
19
|
+
### Cursor
|
|
22
20
|
|
|
23
|
-
Add to
|
|
21
|
+
Add to `~/.cursor/mcp.json`:
|
|
24
22
|
|
|
25
23
|
```json
|
|
26
24
|
{
|
|
27
25
|
"mcpServers": {
|
|
28
26
|
"shipstatic": {
|
|
29
27
|
"command": "npx",
|
|
30
|
-
"args": ["@shipstatic/mcp"]
|
|
31
|
-
"env": {
|
|
32
|
-
"SHIP_API_KEY": "ship-..."
|
|
33
|
-
}
|
|
28
|
+
"args": ["@shipstatic/mcp"]
|
|
34
29
|
}
|
|
35
30
|
}
|
|
36
31
|
}
|
|
37
32
|
```
|
|
38
33
|
|
|
39
|
-
|
|
34
|
+
### Windsurf
|
|
35
|
+
|
|
36
|
+
Add to `~/.codeium/windsurf/mcp_config.json`:
|
|
37
|
+
|
|
38
|
+
```json
|
|
39
|
+
{
|
|
40
|
+
"mcpServers": {
|
|
41
|
+
"shipstatic": {
|
|
42
|
+
"command": "npx",
|
|
43
|
+
"args": ["@shipstatic/mcp"]
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Other MCP clients
|
|
50
|
+
|
|
51
|
+
Same config format — `npx @shipstatic/mcp` via stdio.
|
|
52
|
+
|
|
53
|
+
That's it. Deployments work immediately — sites are live with a claim URL (3-day TTL).
|
|
54
|
+
|
|
55
|
+
For permanent deployments, add a free API key from [my.shipstatic.com/api-key](https://my.shipstatic.com/api-key):
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
claude mcp add shipstatic -e SHIP_API_KEY=ship-... -- npx @shipstatic/mcp
|
|
59
|
+
```
|
|
40
60
|
|
|
41
61
|
## Tools
|
|
42
62
|
|
package/dist/call.js
CHANGED
|
@@ -14,8 +14,8 @@ export async function call(fn) {
|
|
|
14
14
|
function handleError(error) {
|
|
15
15
|
if (isShipError(error)) {
|
|
16
16
|
let message = error.message;
|
|
17
|
-
if (error.isType(ErrorType.Authentication)) {
|
|
18
|
-
message += '\n\nHint: Set
|
|
17
|
+
if (error.isType(ErrorType.Authentication) && !message.includes('Too many requests')) {
|
|
18
|
+
message += '\n\nHint: Set a free SHIP_API_KEY environment variable in your MCP server configuration.';
|
|
19
19
|
}
|
|
20
20
|
if (error.isType(ErrorType.Validation) && error.details) {
|
|
21
21
|
message += `\n\nDetails: ${JSON.stringify(error.details)}`;
|
package/dist/index.js
CHANGED
|
@@ -3,22 +3,9 @@ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'
|
|
|
3
3
|
import Ship from '@shipstatic/ship';
|
|
4
4
|
import { createServer } from './server.js';
|
|
5
5
|
const apiKey = process.env.SHIP_API_KEY;
|
|
6
|
-
if (!apiKey) {
|
|
7
|
-
console.error('SHIP_API_KEY environment variable is required.');
|
|
8
|
-
console.error('Add to your MCP client config:\n');
|
|
9
|
-
console.error(JSON.stringify({
|
|
10
|
-
mcpServers: {
|
|
11
|
-
shipstatic: {
|
|
12
|
-
command: 'npx',
|
|
13
|
-
args: ['@shipstatic/mcp'],
|
|
14
|
-
env: { SHIP_API_KEY: 'ship-...' },
|
|
15
|
-
},
|
|
16
|
-
},
|
|
17
|
-
}, null, 2));
|
|
18
|
-
process.exit(1);
|
|
19
|
-
}
|
|
20
6
|
async function main() {
|
|
21
|
-
const
|
|
7
|
+
const ship = apiKey ? new Ship({ apiKey }) : new Ship({});
|
|
8
|
+
const server = createServer(ship);
|
|
22
9
|
const transport = new StdioServerTransport();
|
|
23
10
|
await server.connect(transport);
|
|
24
11
|
console.error('ShipStatic MCP Server running on stdio');
|
package/dist/server.js
CHANGED
|
@@ -6,15 +6,19 @@ const READ = { readOnlyHint: true, destructiveHint: false, idempotentHint: true,
|
|
|
6
6
|
const CREATE = { destructiveHint: false, ...OPEN_WORLD };
|
|
7
7
|
const WRITE = { destructiveHint: false, idempotentHint: true, ...OPEN_WORLD };
|
|
8
8
|
const DESTRUCTIVE = { destructiveHint: true, idempotentHint: true, ...OPEN_WORLD };
|
|
9
|
-
const INSTRUCTIONS = `ShipStatic
|
|
9
|
+
const INSTRUCTIONS = `ShipStatic deploys static websites instantly. No account required.
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
To deploy: call deployments_upload with the build output directory path. The site is live immediately.
|
|
12
|
+
|
|
13
|
+
Without SHIP_API_KEY, deployments are public and expire in 3 days. The response includes a claim URL — always show the deployment URL and the claim URL to the user so they can keep the site permanently.
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
With SHIP_API_KEY configured, deployments go to the user's account and never expire. Listing, managing, and domain operations also require SHIP_API_KEY.
|
|
16
|
+
|
|
17
|
+
Concepts:
|
|
18
|
+
- Deployment: an immutable set of files with an instant URL (e.g. happy-cat-abc1234.shipstatic.com). No setup needed.
|
|
19
|
+
- Domain: a custom domain (e.g. www.example.com) pointing to a deployment. Optional. Subdomains only — not apex domains.
|
|
16
20
|
|
|
17
|
-
To add a custom domain: domains_validate → domains_set
|
|
21
|
+
To add a custom domain: domains_validate → domains_set → domains_records (show DNS records to user) → user configures DNS → domains_verify.`;
|
|
18
22
|
export function createServer(ship) {
|
|
19
23
|
const server = new McpServer({
|
|
20
24
|
name: 'shipstatic',
|
|
@@ -24,38 +28,37 @@ export function createServer(ship) {
|
|
|
24
28
|
});
|
|
25
29
|
// Deployments
|
|
26
30
|
server.registerTool('deployments_upload', {
|
|
27
|
-
description: 'Deploy a static site
|
|
31
|
+
description: 'Deploy a static site instantly. No account or API key required. Returns the live URL, file count, and size. Without SHIP_API_KEY, the response includes a claim URL (site expires in 3 days) — always show both the deployment URL and claim URL to the user.',
|
|
28
32
|
annotations: CREATE,
|
|
29
33
|
inputSchema: {
|
|
30
34
|
path: z.string().describe('Absolute path to the build output directory to deploy (e.g. "/Users/me/project/dist")'),
|
|
31
|
-
subdomain: z.string().optional().describe('Preferred subdomain for the deployment URL (e.g. "my-site" for my-site.shipstatic.dev). If unavailable or omitted, a random name is assigned.'),
|
|
32
35
|
labels: z.array(z.string()).optional().describe('Labels for organizing deployments (e.g. ["production", "v1.2"]). Lowercase, 3-25 chars, allows . _ - separators.'),
|
|
33
36
|
},
|
|
34
|
-
}, ({ path,
|
|
37
|
+
}, ({ path, labels }) => call(() => ship.deployments.upload(path, { labels, via: 'mcp' })));
|
|
35
38
|
server.registerTool('deployments_list', {
|
|
36
|
-
description: 'List all deployments with their
|
|
39
|
+
description: 'List all deployments with their hostnames, status, and labels.',
|
|
37
40
|
annotations: READ,
|
|
38
41
|
}, () => call(() => ship.deployments.list()));
|
|
39
42
|
server.registerTool('deployments_get', {
|
|
40
|
-
description: 'Get deployment details including
|
|
43
|
+
description: 'Get deployment details including status, file count, size, and labels.',
|
|
41
44
|
annotations: READ,
|
|
42
45
|
inputSchema: {
|
|
43
|
-
deployment: z.string().describe('Deployment
|
|
46
|
+
deployment: z.string().describe('Deployment hostname (e.g. "happy-cat-abc1234.shipstatic.com"). Returned by deployments_upload or deployments_list.'),
|
|
44
47
|
},
|
|
45
48
|
}, ({ deployment }) => call(() => ship.deployments.get(deployment)));
|
|
46
49
|
server.registerTool('deployments_set', {
|
|
47
50
|
description: 'Update deployment labels. Replaces all existing labels.',
|
|
48
51
|
annotations: WRITE,
|
|
49
52
|
inputSchema: {
|
|
50
|
-
deployment: z.string().describe('Deployment
|
|
53
|
+
deployment: z.string().describe('Deployment hostname (e.g. "happy-cat-abc1234.shipstatic.com"). Use deployments_list to find deployments.'),
|
|
51
54
|
labels: z.array(z.string()).describe('Labels to set. Replaces all existing labels. Pass empty array to clear.'),
|
|
52
55
|
},
|
|
53
56
|
}, ({ deployment, labels }) => call(() => ship.deployments.set(deployment, { labels })));
|
|
54
57
|
server.registerTool('deployments_remove', {
|
|
55
|
-
description: 'Permanently delete a deployment and its files. You MUST confirm with the user before calling this tool, referencing the deployment
|
|
58
|
+
description: 'Permanently delete a deployment and its files. You MUST confirm with the user before calling this tool, referencing the deployment.',
|
|
56
59
|
annotations: DESTRUCTIVE,
|
|
57
60
|
inputSchema: {
|
|
58
|
-
deployment: z.string().describe('Deployment
|
|
61
|
+
deployment: z.string().describe('Deployment hostname to delete (e.g. "happy-cat-abc1234.shipstatic.com")'),
|
|
59
62
|
},
|
|
60
63
|
}, ({ deployment }) => call(() => ship.deployments.remove(deployment)));
|
|
61
64
|
// Domains
|
|
@@ -64,7 +67,7 @@ export function createServer(ship) {
|
|
|
64
67
|
annotations: WRITE,
|
|
65
68
|
inputSchema: {
|
|
66
69
|
domain: z.string().describe('Domain name (e.g. "www.example.com" or "blog.example.com")'),
|
|
67
|
-
deployment: z.string().optional().describe('Deployment
|
|
70
|
+
deployment: z.string().optional().describe('Deployment to serve on this domain (e.g. "happy-cat-abc1234.shipstatic.com"). Omit to reserve the domain without linking.'),
|
|
68
71
|
labels: z.array(z.string()).optional().describe('Labels for organizing domains (e.g. ["production"]).'),
|
|
69
72
|
},
|
|
70
73
|
}, ({ domain, deployment, labels }) => call(() => ship.domains.set(domain, { deployment, labels })));
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shipstatic/mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"mcpName": "com.shipstatic/mcp",
|
|
5
|
-
"description": "
|
|
5
|
+
"description": "Deploy static sites instantly from AI agents — no account required",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"main": "./dist/index.js",
|
|
8
8
|
"types": "./dist/index.d.ts",
|
|
@@ -14,18 +14,21 @@
|
|
|
14
14
|
"README.md"
|
|
15
15
|
],
|
|
16
16
|
"keywords": [
|
|
17
|
+
"ai",
|
|
18
|
+
"claude",
|
|
19
|
+
"deploy",
|
|
20
|
+
"hosting",
|
|
21
|
+
"llm",
|
|
17
22
|
"mcp",
|
|
18
23
|
"mcp-server",
|
|
19
24
|
"model-context-protocol",
|
|
20
|
-
"shipstatic",
|
|
21
|
-
"deploy",
|
|
22
|
-
"static-hosting",
|
|
23
|
-
"hosting",
|
|
24
|
-
"static",
|
|
25
|
-
"cloud",
|
|
26
25
|
"ship",
|
|
27
|
-
"
|
|
28
|
-
"
|
|
26
|
+
"static-hosting",
|
|
27
|
+
"static-site",
|
|
28
|
+
"typescript",
|
|
29
|
+
"vibe-coding",
|
|
30
|
+
"web-hosting",
|
|
31
|
+
"website"
|
|
29
32
|
],
|
|
30
33
|
"homepage": "https://github.com/shipstatic/mcp",
|
|
31
34
|
"repository": {
|
|
@@ -41,13 +44,13 @@
|
|
|
41
44
|
"author": "ShipStatic",
|
|
42
45
|
"license": "MIT",
|
|
43
46
|
"dependencies": {
|
|
44
|
-
"@modelcontextprotocol/sdk": "^1.
|
|
45
|
-
"@shipstatic/ship": "^0.
|
|
47
|
+
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
48
|
+
"@shipstatic/ship": "^0.8.6",
|
|
46
49
|
"zod": "^4.3.6"
|
|
47
50
|
},
|
|
48
51
|
"devDependencies": {
|
|
49
|
-
"@shipstatic/types": "^0.
|
|
50
|
-
"@types/node": "^20.
|
|
52
|
+
"@shipstatic/types": "^0.8.2",
|
|
53
|
+
"@types/node": "^20.19.37",
|
|
51
54
|
"husky": "^9.1.7",
|
|
52
55
|
"typescript": "^5.9.3",
|
|
53
56
|
"vitest": "^3.2.4"
|