{"_id":"@byteder/mcp","_rev":"5-09a06c461261d3ad6a7c8d9a1e308fe8","name":"@byteder/mcp","dist-tags":{"latest":"0.5.0"},"versions":{"0.1.0":{"name":"@byteder/mcp","version":"0.1.0","keywords":["mcp","model-context-protocol","byteder","cloud","vps","claude"],"license":"MIT","_id":"@byteder/mcp@0.1.0","maintainers":[{"name":"raykoshima","email":"ray@raykoshima.xyz"}],"bin":{"byteder-mcp":"dist/index.js"},"dist":{"shasum":"5a8cf5ad189483f6dbef4144fd029fc76786dce6","tarball":"https://registry.npmjs.org/@byteder/mcp/-/mcp-0.1.0.tgz","fileCount":38,"integrity":"sha512-cAT+JZK0oRL8ZL7ylEASFUPUaJNnMQgxuZMPiTY36quPAIcb9A6wO3UOmJ9X0p3i7+HDm+gfr+k9gAbEnR3btw==","signatures":[{"sig":"MEQCIG0YzGh3hdvjuk+nLrGxT6RZV3NuhCFa124URWAWK0GeAiA6tZBY5nyeUbM4dAd0KcPlXlFVmpHXfpgQLOwQaEPDmA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":33859},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18"},"gitHead":"b80a4a8088ed750039ff653cca28a11c2127f1b3","scripts":{"dev":"tsc -p tsconfig.json --watch","lint":"biome check .","build":"tsc -p tsconfig.json","lint:fix":"biome check . --write","prepublishOnly":"npm run build"},"_npmUser":{"name":"raykoshima","email":"ray@raykoshima.xyz"},"_npmVersion":"11.9.0","description":"Byteder Cloud MCP server — connect Claude Desktop, Cursor, and other MCP clients to the Byteder API","directories":{},"_nodeVersion":"24.14.0","dependencies":{"zod":"4.3.6","@modelcontextprotocol/sdk":"1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"5.9.3","@types/node":"20.19.39","@biomejs/biome":"2.2.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.1.0_1777988926851_0.4810792796104266","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@byteder/mcp","version":"0.2.0","keywords":["mcp","model-context-protocol","byteder","cloud","vps","claude"],"license":"MIT","_id":"@byteder/mcp@0.2.0","maintainers":[{"name":"raykoshima","email":"ray@raykoshima.xyz"}],"bin":{"byteder-mcp":"dist/index.js"},"dist":{"shasum":"02fb986b50caf4cb2520a4e46926334c1807ae46","tarball":"https://registry.npmjs.org/@byteder/mcp/-/mcp-0.2.0.tgz","fileCount":38,"integrity":"sha512-IRifKwi+fyL5hTcw5rX6fbuQkKjMa0VNW+WZMTOHvohtmM34Ly0t/Vsm6/2M5BRnLfFwrfDOOhKjNsgpkDcb/g==","signatures":[{"sig":"MEQCIE3a1ELQhdbeW4CAi2H4NEviFUoC49j/WHXWrpZB8CA0AiB0VqdHLTAFY9z4UQWD84qmJX4Tm0dn3dThUbwMrGNfcw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":67610},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18"},"gitHead":"b80a4a8088ed750039ff653cca28a11c2127f1b3","scripts":{"dev":"tsc -p tsconfig.json --watch","lint":"biome check .","build":"tsc -p tsconfig.json","lint:fix":"biome check . --write","prepublishOnly":"npm run build"},"_npmUser":{"name":"raykoshima","email":"ray@raykoshima.xyz"},"_npmVersion":"11.9.0","description":"Byteder Cloud MCP server — connect Claude Desktop, Cursor, and other MCP clients to the Byteder API","directories":{},"_nodeVersion":"24.14.0","dependencies":{"zod":"4.3.6","@modelcontextprotocol/sdk":"1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"5.9.3","@types/node":"20.19.39","@biomejs/biome":"2.2.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.2.0_1777990493809_0.05269220019733689","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@byteder/mcp","version":"0.3.0","keywords":["mcp","model-context-protocol","byteder","cloud","vps","claude"],"license":"MIT","_id":"@byteder/mcp@0.3.0","maintainers":[{"name":"raykoshima","email":"ray@raykoshima.xyz"}],"bin":{"byteder-mcp":"dist/index.js"},"dist":{"shasum":"cb9ec670a596b965491f13eb33508d7e62bc8d76","tarball":"https://registry.npmjs.org/@byteder/mcp/-/mcp-0.3.0.tgz","fileCount":38,"integrity":"sha512-EYg0N33/gizLVS4DnyIbETjAJhUnm11yFzdGcA8aghWSB8gAqMSEbKJPDCpy5e4DMuuYsX9KWvoLCisoT2p5HQ==","signatures":[{"sig":"MEUCIQDlf9PL0Nk1rpEUGUME2+OAblG1gGZdNs9fF7Mpj5P4bwIgaSKe58CMkLi1KE5SRtsVR0+GMahBHlQxQklt0HhP/mM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":69422},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18"},"gitHead":"dacea5cf3e0340153378e9c9ece018e48c8026b6","scripts":{"dev":"tsc -p tsconfig.json --watch","lint":"biome check .","build":"tsc -p tsconfig.json","lint:fix":"biome check . --write","prepublishOnly":"npm run build"},"_npmUser":{"name":"raykoshima","email":"ray@raykoshima.xyz"},"_npmVersion":"11.9.0","description":"Byteder Cloud MCP server — connect Claude Desktop, Cursor, and other MCP clients to the Byteder API","directories":{},"_nodeVersion":"24.14.0","dependencies":{"zod":"4.3.6","@modelcontextprotocol/sdk":"1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"5.9.3","@types/node":"20.19.39","@biomejs/biome":"2.2.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.3.0_1779376577153_0.34154589745364183","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@byteder/mcp","version":"0.4.0","keywords":["mcp","model-context-protocol","byteder","cloud","vps","claude"],"license":"MIT","_id":"@byteder/mcp@0.4.0","maintainers":[{"name":"raykoshima","email":"ray@raykoshima.xyz"}],"bin":{"byteder-mcp":"dist/index.js"},"dist":{"shasum":"17b93533fdffe649b48881f74422008c37630e5e","tarball":"https://registry.npmjs.org/@byteder/mcp/-/mcp-0.4.0.tgz","fileCount":42,"integrity":"sha512-cT34du3wdV+M++rsQTIy2GIDCqFjh+d4Ojmn/3mn0hwlRFkTM07ug5I5rColIDziP+9KoMmqW09ddW/ETY547Q==","signatures":[{"sig":"MEUCIQCYklLmkb9FzS7bW4TGuewLLIbRiLxQaJ956S6B/tvJAAIgbsuqCxUMSkACN7k73+efs6moKBOH2BRe6+VAloQLmR4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":94452},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18"},"gitHead":"69c0901495981585205c1f36e29dffe7fcf5cc34","scripts":{"dev":"tsc -p tsconfig.json --watch","lint":"biome check .","build":"tsc -p tsconfig.json","lint:fix":"biome check . --write","prepublishOnly":"npm run build"},"_npmUser":{"name":"raykoshima","email":"ray@raykoshima.xyz"},"_npmVersion":"11.9.0","description":"Byteder Cloud MCP server — connect Claude Desktop, Cursor, and other MCP clients to the Byteder API","directories":{},"_nodeVersion":"24.14.0","dependencies":{"zod":"4.3.6","@modelcontextprotocol/sdk":"1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"5.9.3","@types/node":"20.19.39","@biomejs/biome":"2.2.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.4.0_1781765297573_0.16302251149291913","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@byteder/mcp","version":"0.5.0","description":"Byteder Cloud MCP server — connect Claude Desktop, Cursor, and other MCP clients to the Byteder API","license":"MIT","type":"module","main":"dist/index.js","types":"dist/index.d.ts","bin":{"byteder-mcp":"dist/index.js"},"engines":{"node":">=18"},"scripts":{"build":"tsc -p tsconfig.json","dev":"tsc -p tsconfig.json --watch","lint":"biome check .","lint:fix":"biome check . --write","prepublishOnly":"npm run build"},"keywords":["mcp","model-context-protocol","byteder","cloud","vps","claude"],"publishConfig":{"access":"public"},"dependencies":{"@modelcontextprotocol/sdk":"1.29.0","zod":"4.3.6"},"devDependencies":{"@biomejs/biome":"2.2.0","@types/node":"20.19.39","typescript":"5.9.3"},"gitHead":"6ce5dc1914d7bdcb463d675a71c0c48fa837a4a0","_id":"@byteder/mcp@0.5.0","_nodeVersion":"24.14.0","_npmVersion":"11.9.0","dist":{"integrity":"sha512-i6ZhZpVSHWjFY3IbjpIzoULa+PMjSyhJ30jj/MhDGujY6SbpGH8PLnicSrPsNgYnIdMO0KkHTcj1xcL41PPzeQ==","shasum":"4a528ff45eb4be9d0293c3594997dae13ba8c567","tarball":"https://registry.npmjs.org/@byteder/mcp/-/mcp-0.5.0.tgz","fileCount":42,"unpackedSize":107208,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCmCEJdGavA/9TM5imRrHaLoRw84ZHgDfFl/hnejgzVHgIhAJqxBcghJU+reR7KzshAsCBeS6BtBKg8ztHqRO6AdfRa"}]},"_npmUser":{"name":"raykoshima","email":"ray@raykoshima.xyz"},"directories":{},"maintainers":[{"name":"raykoshima","email":"ray@raykoshima.xyz"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mcp_0.5.0_1787250805448_0.8197003328640209"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-05T13:48:46.759Z","modified":"2026-08-20T18:33:25.732Z","0.1.0":"2026-05-05T13:48:46.978Z","0.2.0":"2026-05-05T14:14:53.938Z","0.3.0":"2026-05-21T15:16:17.329Z","0.4.0":"2026-06-18T06:48:17.714Z","0.5.0":"2026-08-20T18:33:25.572Z"},"license":"MIT","keywords":["mcp","model-context-protocol","byteder","cloud","vps","claude"],"description":"Byteder Cloud MCP server — connect Claude Desktop, Cursor, and other MCP clients to the Byteder API","maintainers":[{"name":"raykoshima","email":"ray@raykoshima.xyz"}],"readme":"# @byteder/mcp\r\n\r\nModel Context Protocol server for the [Byteder Cloud](https://byteder.com) API. Lets Claude Desktop, Cursor, and other MCP clients manage your projects, instances, SSH keys, activity logs, billing, and product catalog over a single API key. Full feature parity with the REST API.\r\n\r\n## Install\r\n\r\nNo install needed — point your MCP client at `npx`:\r\n\r\n```bash\r\nnpx -y @byteder/mcp\r\n```\r\n\r\nOr install globally:\r\n\r\n```bash\r\nnpm install -g @byteder/mcp\r\nbyteder-mcp\r\n```\r\n\r\nRequires Node.js 18+.\r\n\r\n## Configure\r\n\r\nThe server reads two environment variables:\r\n\r\n| Variable | Required | Default | Notes |\r\n|---|---|---|---|\r\n| `BYTEDER_API_KEY` | yes | — | Your `bdr_live_…` API key from [dash.byteder.com](https://dash.byteder.com) → Settings → API Keys |\r\n| `BYTEDER_API_URL` | no | `https://developer.byteder.com` | Override for staging or self-hosted |\r\n\r\n### Claude Desktop\r\n\r\nEdit `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or `%AppData%\\Claude\\claude_desktop_config.json` (Windows):\r\n\r\n```json\r\n{\r\n  \"mcpServers\": {\r\n    \"byteder\": {\r\n      \"command\": \"npx\",\r\n      \"args\": [\"-y\", \"@byteder/mcp\"],\r\n      \"env\": {\r\n        \"BYTEDER_API_KEY\": \"bdr_live_...\"\r\n      }\r\n    }\r\n  }\r\n}\r\n```\r\n\r\nRestart Claude Desktop. The Byteder tools will appear in the tool picker.\r\n\r\n### Cursor\r\n\r\nAdd to `~/.cursor/mcp.json`:\r\n\r\n```json\r\n{\r\n  \"mcpServers\": {\r\n    \"byteder\": {\r\n      \"command\": \"npx\",\r\n      \"args\": [\"-y\", \"@byteder/mcp\"],\r\n      \"env\": { \"BYTEDER_API_KEY\": \"bdr_live_...\" }\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n### MCP Inspector (debugging)\r\n\r\n```bash\r\nBYTEDER_API_KEY=bdr_live_... npx @modelcontextprotocol/inspector npx -y @byteder/mcp\r\n```\r\n\r\n## Tools\r\n\r\n43 tools covering the full REST surface. Tools marked **🔒 confirm** require a literal `confirm: true` argument — Claude will ask you to approve before sending.\r\n\r\n### Projects\r\n| Tool | Purpose |\r\n|---|---|\r\n| `list_projects` | Every project this key can access |\r\n| `get_project` | One project by ID |\r\n| `create_project` | Create a PERSONAL or ORGANIZATION project |\r\n| `update_project` | Rename or edit organization details |\r\n| `delete_project` 🔒 | Soft-delete (fails if active instances remain) |\r\n\r\n### Instances — read & metadata\r\n| Tool | Purpose |\r\n|---|---|\r\n| `list_instances` | All VMs in a project |\r\n| `get_instance` | One VM (incl. credentials) |\r\n| `update_instance` | Rename / re-describe (no VM impact) |\r\n\r\n### Instances — lifecycle\r\n| Tool | Purpose |\r\n|---|---|\r\n| `create_instance` 🔒 | Provision a new VM (charges credits) |\r\n| `start_instance` | Power on |\r\n| `stop_instance` | Graceful ACPI shutdown |\r\n| `restart_instance` | Reboot |\r\n| `force_stop_instance` 🔒 | Hard kill — risk of FS corruption |\r\n| `rebuild_instance` 🔒 | Reinstall OS — wipes disk |\r\n| `delete_instance` 🔒 | Tear down |\r\n| `upgrade_instance_plan` 🔒 | Resize to a larger plan (charges + restart) |\r\n\r\n### Instances — VPC networking\r\n| Tool | Purpose |\r\n|---|---|\r\n| `attach_instance_vpc` | Attach the instance to a VPC subnet (adds a private NIC + private IP). Pass `reboot: true` to apply now — 🔒 confirm required only when `reboot: true` |\r\n| `detach_instance_vpc` | Remove the instance's VPC private NIC. 🔒 confirm required only when `reboot: true` |\r\n\r\n### Instances — billing & credentials\r\n| Tool | Purpose |\r\n|---|---|\r\n| `change_billing_period` | Schedule period change (next cycle) |\r\n| `cancel_pending_billing_period` | Revert a scheduled change |\r\n| `update_instance_ssh_key` | Replace SSH key (restarts VM) |\r\n| `update_instance_password` | Reset root password (restarts VM) |\r\n\r\n### SSH keys (account-scoped)\r\n| Tool | Purpose |\r\n|---|---|\r\n| `list_ssh_keys` | All saved keys |\r\n| `add_ssh_key` | Save a new public key |\r\n| `delete_ssh_key` | Remove a saved key (does not affect deployed VMs) |\r\n\r\n### VPC (private networking)\r\n| Tool | Purpose |\r\n|---|---|\r\n| `list_vpcs` | All VPCs in a project |\r\n| `get_vpc` | One VPC (subnets, attached instances, peerings) |\r\n| `create_vpc` 🔒 | Provision a VPC (SDN VLAN + VNet + subnet) |\r\n| `delete_vpc` 🔒 | Delete a VPC (fails if instances attached) |\r\n| `list_vpc_subnets` | Subnets in a VPC |\r\n| `create_vpc_subnet` | Add a subnet (CIDR within the VPC range) |\r\n| `delete_vpc_subnet` 🔒 | Delete a subnet (fails if instances attached) |\r\n| `list_vpc_peerings` | Peerings for a VPC |\r\n| `request_vpc_peering` | Request peering with another VPC |\r\n| `accept_vpc_peering` | Accept an incoming peering request |\r\n| `reject_vpc_peering` | Reject an incoming peering request |\r\n| `delete_vpc_peering` 🔒 | Remove a peering |\r\n\r\nTo connect an **existing** instance to a VPC, use `attach_instance_vpc` (above). VPC selection at creation time is also available via the `vpc_id` / `subnet_id` fields on `create_instance`.\r\n\r\n### Catalog (no API key required for read)\r\n| Tool | Purpose |\r\n|---|---|\r\n| `list_catalog_regions` | Available deploy regions |\r\n| `list_catalog_tiers` | Service tiers |\r\n| `list_catalog_datacenters` | Datacenters in a region (codenames for `create_instance`) |\r\n| `list_catalog_plans` | Server plans + pricing per period |\r\n| `list_catalog_os` | OS images |\r\n\r\n### Audit\r\n| Tool | Purpose |\r\n|---|---|\r\n| `get_recent_logs` | Activity log (cursor-paginated) |\r\n\r\n## After creating an instance\r\n\r\nProvisioning is asynchronous. `create_instance` returns immediately with status\r\n`CREATING`; the instance becomes `RUNNING` roughly a minute later, once the\r\nsync job observes it. Lifecycle calls — `upgrade_instance_plan`,\r\n`resize_instance`, `convert_to_custom` — are **rejected while it is still\r\n`CREATING`**, so poll `get_instance` until the status flips rather than acting\r\nstraight after create.\r\n\r\n**If it reports `RUNNING` but you cannot reach it** — SSH refused, no ping —\r\nthe guest occasionally boots without working networking. Call\r\n`restart_instance` **once** and wait for it to come back; that clears it.\r\n\r\nIf it is still unreachable after that single restart, the problem is not the\r\nboot. Stop and report it instead of restarting in a loop — repeated reboots\r\nwill not fix a networking or placement fault, and each one costs the customer\r\nmore downtime on a VM they are already being billed for.\r\n\r\n## Safety: the `confirm: true` gate\r\n\r\nDestructive tools (delete, rebuild, force-stop, create-instance, upgrade-plan, create/delete-VPC, delete-subnet/peering) require a literal `confirm: true` field. A few tools (`attach_instance_vpc`, `detach_instance_vpc`) require it **only when `reboot: true`**, since the reboot causes downtime. The model can't satisfy this from a vague natural-language request — it has to explicitly include `confirm: true` in the tool call, which Claude Desktop surfaces in its approval prompt. This protects against:\r\n\r\n- Accidental destructive calls from ambiguous prompts\r\n- Prompt injection attacks asking the agent to \"delete all my VMs\"\r\n- Tool-call retries on transient failures double-firing\r\n\r\nIf a destructive call fails with `Refusing to … : 'confirm' must be exactly true`, that's the gate working as designed.\r\n\r\n## Permissions\r\n\r\nThe server uses your API key's existing scopes. If a tool returns \"API key requires scope X\", grant the missing scope to the key in the dashboard.\r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md"}