Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ to reach for this MCP, see <https://instanode.dev/agent.html>.
| `create_queue` | `POST /queue/new` — Provision a NATS JetStream queue (scoped subject namespace). Returns `connection_url` + `note`/`upgrade`. `name` required. |
| `create_storage` | `POST /storage/new` — Provision an S3-compatible bucket prefix (DigitalOcean Spaces). Returns endpoint, access keys, prefix + `note`/`upgrade`. `name` required. |
| `create_webhook` | `POST /webhook/new` — Provision an inbound webhook receiver URL. Returns `receive_url` + `note`/`upgrade`. `name` required. |
| `create_deploy` | `POST /deploy/new` — Upload a base64 gzip tarball (with Dockerfile) and deploy a container. Returns `deploy_id`, `status`, `url`, `build_logs_url`. Requires `INSTANODE_TOKEN`. |
| `create_deploy` | `POST /deploy/new` — Upload a base64 gzip tarball (with Dockerfile) and deploy a container. Returns `deploy_id`, `status`, `url`, `build_logs_url`. `name` required. Requires `INSTANODE_TOKEN`. |
| `list_deployments`| `GET /api/v1/deployments` — List all deployments on the caller's team. Requires `INSTANODE_TOKEN`. |
| `get_deployment` | `GET /api/v1/deployments/:id` — Fetch one deployment (poll until `status="running"`). Requires `INSTANODE_TOKEN`. |
| `redeploy` | `POST /deploy/:id/redeploy` — Rebuild + rolling update an existing deployment. Requires `INSTANODE_TOKEN`. |
Expand Down Expand Up @@ -144,7 +144,9 @@ const tarball_base64 = tar.toString("base64");
```

Cap: 50 MB after decode. Honor `.dockerignore` — only ship what
`docker build` needs.
`docker build` needs. The `name` field is required (1–64 chars,
letters/numbers/spaces/dashes) — it's the human-readable label shown
on the dashboard.

**Binding provisioned resources:**

Expand Down
7 changes: 2 additions & 5 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "instanode-mcp",
"version": "0.10.1",
"version": "0.11.0",
"description": "MCP server for instanode.dev \u2014 lets AI coding agents provision ephemeral Postgres, Redis, MongoDB, NATS queues, S3-compatible object storage, webhook receivers, and deploy containerized apps over HTTPS, with optional bearer-token auth for paid users.",
"keywords": [
"mcp",
Expand Down
4 changes: 2 additions & 2 deletions server.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@
"url": "https://github.com/InstaNode-dev/mcp",
"source": "github"
},
"version": "0.10.1",
"version": "0.11.0",
"websiteUrl": "https://instanode.dev",
"packages": [
{
"registryType": "npm",
"identifier": "instanode-mcp",
"version": "0.10.1",
"version": "0.11.0",
"transport": {
"type": "stdio"
},
Expand Down
11 changes: 6 additions & 5 deletions src/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -204,8 +204,8 @@ export interface DeployDeleteResult {
export interface CreateDeployParams {
/** Base64-encoded gzip tarball (with Dockerfile + source). <50 MB after decode. */
tarball_base64: string;
/** Optional friendly name. */
name?: string;
/** Human-readable name shown on the dashboard. Required (1-64 chars). */
name: string;
/** Container HTTP port. Default 8080. */
port?: number;
/** Deploy env scope: production / staging / development. Default "production". */
Expand Down Expand Up @@ -360,7 +360,7 @@ export class InstantClient {
private headers(): Record<string, string> {
const h: Record<string, string> = {
"Content-Type": "application/json",
"User-Agent": "instanode-mcp/0.10.1",
"User-Agent": "instanode-mcp/0.11.0",
};
const tok = this.bearerToken();
if (tok) {
Expand All @@ -375,7 +375,7 @@ export class InstantClient {
*/
private authHeaders(): Record<string, string> {
const h: Record<string, string> = {
"User-Agent": "instanode-mcp/0.10.1",
"User-Agent": "instanode-mcp/0.11.0",
};
const tok = this.bearerToken();
if (tok) {
Expand Down Expand Up @@ -647,7 +647,8 @@ export class InstantClient {
const blob = new Blob([tarball], { type: "application/gzip" });
form.append("tarball", blob, "app.tar.gz");

if (params.name) form.append("name", params.name);
// `name` is a required field on POST /deploy/new — always sent.
form.append("name", params.name);
if (typeof params.port === "number") form.append("port", String(params.port));
if (params.env) form.append("env", params.env);

Expand Down
7 changes: 5 additions & 2 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -710,6 +710,8 @@ vault is per-team, per-env; rotate without redeploying). 'env_vars' and
'resource_bindings' are merged before being sent to the API; on collision,
'resource_bindings' wins.

The 'name' field is required (the human-readable label shown on the dashboard).

Private deploys: set 'private: true' and pass 'allowed_ips' (IPs or CIDR
blocks) to restrict access at the Ingress. Pro tier or higher is required —
hobby tier returns 402 with an agent_action prompting the user to upgrade.
Expand All @@ -726,8 +728,9 @@ Requires INSTANODE_TOKEN (anonymous tier cannot deploy).`,
.string()
.min(1)
.max(64)
.optional()
.describe("Optional friendly label (1–64 chars). Defaults to a server-generated slug."),
.describe(
"Human-readable name for this resource, 1-64 chars, letters/numbers/spaces/dashes — shown in the dashboard. Required."
),
port: z
.number()
.int()
Expand Down
Loading