@gmo-internet/conoha-vps-mcp 0.5.1 → 0.5.2
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 +15 -5
- package/dist/index.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
|
|
24
24
|
## 🌟 概要
|
|
25
25
|
|
|
26
|
-
ConoHa VPS MCPは、ConoHa VPSの[公開API](https://doc.conoha.jp/reference/api-vps3/)を日本語で操作できるオープンソースのMCPサーバーです。AIエージェント(Claude、GitHub Copilot、Clineなど)と連携し、自然言語でインフラ操作ができます。
|
|
26
|
+
ConoHa VPS MCPは、ConoHa VPSの[公開API](https://doc.conoha.jp/reference/api-vps3/)を日本語で操作できるオープンソースのMCPサーバーです。AIエージェント(Claude Code、Claude Desktop、GitHub Copilot、Clineなど)と連携し、自然言語でインフラ操作ができます。
|
|
27
27
|
|
|
28
28
|
⚠️ 注意: 本ソフトウェアは現在ベータ版です。機能や動作が予告なく変更される場合があります。本番環境での使用前には十分なテストを行ってください。このベータ版 ConoHa VPS MCP を使用することで、これらの条件に同意したものとみなされます。
|
|
29
29
|
|
|
@@ -32,14 +32,14 @@ ConoHa VPS MCPは、ConoHa VPSの[公開API](https://doc.conoha.jp/reference/api
|
|
|
32
32
|
| 特徴 | 説明 |
|
|
33
33
|
|------|------|
|
|
34
34
|
| 🇯🇵 **日本語対応** | ツール説明・エラーメッセージを含め、すべて日本語で操作可能 |
|
|
35
|
-
| 🤖 **AI エージェント連携** | GitHub Copilot、
|
|
35
|
+
| 🤖 **AI エージェント連携** | Claude Code、Claude Desktop、GitHub Copilot、Cline など主要なAIエージェントに対応 |
|
|
36
36
|
| 🔧 **包括的API** | サーバー・ボリューム・イメージ・セキュリティグループ・オブジェクトストレージを管理 |
|
|
37
37
|
| 🐳 **クロスプラットフォーム** | Node.js / Docker で動作、Windows・Mac・Linuxに対応 |
|
|
38
38
|
| 🛡️ **セキュリティ対策** | OpenStack準拠のセキュリティ機能を搭載 |
|
|
39
39
|
|
|
40
40
|
## ❓ Model Context Protocol (MCP) とは
|
|
41
41
|
|
|
42
|
-
MCPは、AIエージェント(Claude、GitHub Copilot、Clineなど)が外部のサービスやツールと連携するためのプロトコルです。このMCPサーバーを導入すると、AIに日本語で指示するだけでConoHa VPSの操作ができるようになります。
|
|
42
|
+
MCPは、AIエージェント(Claude Code、Claude Desktop、GitHub Copilot、Clineなど)が外部のサービスやツールと連携するためのプロトコルです。このMCPサーバーを導入すると、AIに日本語で指示するだけでConoHa VPSの操作ができるようになります。
|
|
43
43
|
|
|
44
44
|
## 🚀 クイックスタート
|
|
45
45
|
|
|
@@ -50,6 +50,16 @@ MCPは、AIエージェント(Claude、GitHub Copilot、Clineなど)が外
|
|
|
50
50
|
|
|
51
51
|
詳しくは [mcpb ファイルインストール版実行ガイド](docs/mcpb-setup.md) を参照してください。
|
|
52
52
|
|
|
53
|
+
### Claude Codeで利用する場合(プラグイン)
|
|
54
|
+
|
|
55
|
+
Claude Codeのプラグインマーケットプレイスからインストールできます。MCPサーバーに加えて、操作をガイドするスキルも利用可能になります。
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
/plugin marketplace add https://github.com/gmo-internet/conoha_vps_mcp
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
詳しくは [Claude Code プラグインインストール版実行ガイド](docs/plugin-setup.md) を参照してください。
|
|
62
|
+
|
|
53
63
|
### それ以外のAIエージェント (GitHub Copilot等) で利用する場合
|
|
54
64
|
|
|
55
65
|
1. Node.jsをローカル端末にインストール
|
|
@@ -157,9 +167,9 @@ HTTP(80番)とHTTPS(443番)のみを許可してください。
|
|
|
157
167
|
|
|
158
168
|
#### AIエージェント統合
|
|
159
169
|
|
|
160
|
-
- ✅ [Cursor](https://cursor.com/ja/download)
|
|
161
|
-
- ✅ [Claude Desktop](https://claude.ai/download)
|
|
162
170
|
- ✅ [Claude Code](https://docs.anthropic.com/en/docs/claude-code)
|
|
171
|
+
- ✅ [Claude Desktop](https://claude.ai/download)
|
|
172
|
+
- ✅ [Cursor](https://cursor.com/ja/download)
|
|
163
173
|
- ✅ [Cline (VS Code)](https://github.com/cline/cline)
|
|
164
174
|
- ✅ [GitHub Copilot (VS Code)](https://docs.github.com/ja/copilot)
|
|
165
175
|
- ✅ [Codex CLI](https://github.com/openai/codex)
|
package/dist/index.js
CHANGED
|
@@ -409,4 +409,4 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
409
409
|
\u2022 \u30C6\u30CA\u30F3\u30C8ID\u306F\u74B0\u5883\u5909\u6570 OPENSTACK_TENANT_ID \u304B\u3089\u81EA\u52D5\u7684\u306B\u53D6\u5F97\u3055\u308C\u307E\u3059
|
|
410
410
|
|
|
411
411
|
\u2022 \u5951\u7D04\u306B\u7D10\u3065\u304F\u30B5\u30FC\u30D0\u30FC\u7BA1\u7406\u7528\u9014\u306B\u306E\u307F\u4F7F\u7528\u53EF
|
|
412
|
-
`;var sS={name:"@gmo-internet/conoha-vps-mcp",version:"0.5.1",description:"\u65E5\u672C\u8A9E\u5BFE\u5FDC\u306EConoHa VPS Model Context Protocol (MCP) \u30B5\u30FC\u30D0\u30FC",author:"GMO Internet",license:"Apache-2.0",type:"module",main:"dist/index.js",types:"dist/index.d.ts",bin:{"conoha-vps-mcp":"dist/index.js"},exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.js"}},keywords:["conoha","vps","mcp","modelcontextprotocol","openstack"],homepage:"https://github.com/gmo-internet/conoha_vps_mcp",bugs:{url:"https://github.com/gmo-internet/conoha_vps_mcp/issues"},repository:{type:"git",url:"https://github.com/gmo-internet/conoha_vps_mcp.git"},files:["dist","LICENSE","README.md","NOTICE"],publishConfig:{registry:"https://registry.npmjs.org/"},scripts:{build:"node esbuild.config.js","build:types":"tsc --emitDeclarationOnly","build:mcpb":"mcpb pack",start:"node dist/index.js",dev:"tsx src/index.ts",typecheck:"tsc --noEmit","biome:ci":"biome ci .","biome:fix":"biome check --write .",test:"vitest run --coverage","generate:notice":"node scripts/generate-notice.js",inspector:"npx @modelcontextprotocol/inspector","docs:build":"typedoc","docs:watch":"typedoc --watch","docs:serve":"npx serve reports/docs","audit:ci":"npm audit --audit-level=high",knip:"knip",depcruise:"depcruise src --config .dependency-cruiser.cjs",jscpd:"jscpd src/",mutation:"stryker run"},dependencies:{"@modelcontextprotocol/sdk":"^1.27.1",zod:"^4.3.6"},devDependencies:{"@anthropic-ai/mcpb":"2.1.2","@biomejs/biome":"2.4.5","@stryker-mutator/core":"9.6.0","@stryker-mutator/vitest-runner":"9.6.0","@types/node":"^22.0.0","@vitest/coverage-v8":"4.0.18","dependency-cruiser":"17.3.8",esbuild:"0.27.3",jscpd:"4.0.8",knip:"5.86.0",tsx:"4.21.0",typedoc:"0.28.17",typescript:"5.9.3",vitest:"4.0.18"},engines:{node:">=22.0.0"}};var Kl=`conoha-vps-mcp/${sS.version}`,cS="https://identity.c3j1.conoha.io/v3",pn="https://compute.c3j1.conoha.io/v2.1",uS="https://block-storage.c3j1.conoha.io/v3",lS="https://image-service.c3j1.conoha.io",mn="https://networking.c3j1.conoha.io",Rt="https://object-storage.c3j1.conoha.io";async function RR(e){let t=process.env.OPENSTACK_USER_ID,n=process.env.OPENSTACK_PASSWORD,o=process.env.OPENSTACK_TENANT_ID;if(!t||!n||!o)throw new Error("USER_ID, PASSWORD, or TENANT_ID envs are not defined");return(await fetch(`${cS}${e}`,{method:"POST",headers:{Accept:"application/json","User-Agent":Kl},body:JSON.stringify({auth:{identity:{methods:["password"],password:{user:{id:t,password:n}}},scope:{project:{id:o}}}})})).headers}async function at(){return(await RR("/auth/tokens")).get("x-subject-token")}async function we(e,t,n,o){let r=await at(),i=n.startsWith("/")?n:`/${n}`,a=`${t}${i}`;return await fetch(a,{method:e,headers:{Accept:"application/json","User-Agent":Kl,"X-Auth-Token":r,...o?{"Content-Type":"application/json"}:{}},...o?{body:JSON.stringify(o)}:{}})}async function $e(e){let t=await e.text();try{return JSON.stringify({status:e.status,statusText:e.statusText,body:JSON.parse(t)})}catch(n){return console.error("Failed to parse response body as JSON:",n),JSON.stringify({status:e.status,statusText:e.statusText,body:t})}}async function dS(e){let t=e.status,n=e.statusText;try{let o=await e.json();if(!o?.flavors||!Array.isArray(o.flavors))return JSON.stringify({status:t,statusText:n,body:o});let r={flavors:o.flavors.map(i=>({id:i?.id,name:i?.name,ram:i?.ram,vcpus:i?.vcpus,disk:i?.disk}))};return JSON.stringify({status:t,statusText:n,body:r})}catch(o){return console.error("Error formatting response:",o),JSON.stringify({status:t,statusText:n,body:"<error>"})}}async function Wl(e){let t=await we("GET",pn,e);return await $e(t)}async function pS(e){let t=await we("GET",pn,e);return await dS(t)}async function Ia(e,t){let n=await we("GET",pn,`/servers/${t}${e}`);return await $e(n)}async function zg(e,t){let n=await we("POST",pn,e,t);return await $e(n)}async function Xl(e,t,n){let o=await we("POST",pn,`/servers/${t}${e}`,n);return await $e(o)}async function Ig(e,t){let n=await we("DELETE",pn,`${e}/${t}`);return await $e(n)}async function mS(e){let t=e.status,n=e.statusText;try{let o=await e.json();if(!o?.images||!Array.isArray(o.images))return JSON.stringify({status:t,statusText:n,body:o});let r={images:o.images.map(i=>({id:i?.id,name:i?.name,osType:i?.os_type,arch:i?.architecture,tags:i?.tags,minDisk:i?.min_disk,minRam:i?.min_ram}))};return JSON.stringify({status:t,statusText:n,body:r})}catch(o){return console.error("Error formatting response:",o),JSON.stringify({status:t,statusText:n,body:"<error>"})}}async function fS(e){let t=await we("GET",lS,e);return await mS(t)}async function hS(e){let t=e.status,n=e.statusText;try{let o=await e.json();if(!o?.security_groups||!Array.isArray(o?.security_groups))return JSON.stringify({status:t,statusText:n,body:o});let r={security_groups:o.security_groups.map(i=>({id:i?.id,name:i?.name,description:i?.description,security_group_rules:i?.security_group_rules?.map(s=>({ethertype:s?.ethertype,direction:s?.direction,protocol:s?.protocol??null,port_range_min:s?.port_range_min??null,port_range_max:s?.port_range_max??null,remote_ip_prefix:s?.remote_ip_prefix??null,remote_group_id:s?.remote_group_id??null}))}))};return JSON.stringify({status:t,statusText:n,body:r})}catch(o){return console.error("Error formatting response:",o),JSON.stringify({status:t,statusText:n,body:"<error>"})}}async function Pg(e){let t=await we("GET",mn,e);return await $e(t)}async function Tg(e,t){let n=await we("GET",mn,`${e}/${t}`);return await $e(n)}async function gS(e){let t=await we("GET",mn,e);return await hS(t)}async function jg(e,t){let n=await we("POST",mn,e,t);return await $e(n)}async function Eg(e,t,n){let o=await we("PUT",mn,`${e}/${t}`,n);return await $e(o)}async function Og(e,t){let n=await we("DELETE",mn,`${e}/${t}`);return await $e(n)}import{readFile as AR}from"node:fs/promises";import{Buffer as DR}from"node:buffer";function Ng(e){let t={};return e.headers.forEach((n,o)=>{t[o]=n}),JSON.stringify({status:e.status,statusText:e.statusText,headers:t})}function vS(e,t){let n={};e.headers.forEach((a,s)=>{n[s]=a});let o=e.headers.get("content-type")||"",r,i=!o.includes("text/")&&!o.includes("application/json")&&!o.includes("application/xml");return i?r=DR.from(t,"binary").toString("base64"):r=t,JSON.stringify({status:e.status,statusText:e.statusText,headers:n,body:r,encoding:i?"base64":"utf8"})}var yS=process.env.OPENSTACK_TENANT_ID;async function _S(e,t){let n=await at(),o=`${Rt}${e}`,r={Accept:"application/json","X-Auth-Token":n};for(let[a,s]of Object.entries(t))s!==void 0&&(r[a]=s);let i=await fetch(o,{method:"POST",headers:r});return await $e(i)}async function $S(e){let t=await at(),n=`${Rt}${e}`,r=await fetch(n,{method:"PUT",headers:{Accept:"application/json","X-Auth-Token":t}});return await $e(r)}async function bS(e){let t=await at(),n=`${Rt}${e}`,r=await fetch(n,{method:"HEAD",headers:{Accept:"application/json","X-Auth-Token":t}});return Ng(r)}async function xS(e){let t=await at(),n=`${Rt}${e}`,r=await fetch(n,{method:"HEAD",headers:{Accept:"application/json","X-Auth-Token":t}});return Ng(r)}async function kS(e){let t=await at(),n=`${Rt}${e}`,r=await fetch(n,{method:"GET",headers:{Accept:"application/json","X-Auth-Token":t}});return await $e(r)}async function SS(e){let t=await at(),n=`${Rt}${e}`,r=await fetch(n,{method:"GET",headers:{Accept:"application/json","X-Auth-Token":t}});return await $e(r)}async function wS(e){let t=await at(),n=`${Rt}${e}`,r=await fetch(n,{method:"GET",headers:{"X-Auth-Token":t}}),i=await r.text();return vS(r,i)}async function zS(e){let t=await at(),n=yS||"",o=e.replace("{tenantId}",n),r=`${Rt}${o}`,a=await fetch(r,{method:"DELETE",headers:{Accept:"application/json","X-Auth-Token":t}});return await $e(a)}async function IS(e){let t=await at(),n=yS||"",o=e.replace("{tenantId}",n),r=`${Rt}${o}`,a=await fetch(r,{method:"DELETE",headers:{Accept:"application/json","X-Auth-Token":t}});return await $e(a)}async function PS(e,t,n){let o=await at(),r=`${Rt}${e}`,i={Accept:"application/json","X-Auth-Token":o};n&&(i["Content-Type"]=n);let a;try{let c=await AR(t);a=new Uint8Array(c)}catch{try{let c=Buffer.from(t,"base64").toString("binary");a=new Uint8Array(c.length);for(let u=0;u<c.length;u++)a[u]=c.charCodeAt(u)}catch{a=new TextEncoder().encode(t)}}let s=await fetch(r,{method:"PUT",headers:i,body:a});return await $e(s)}var ZR=process.env.OPENSTACK_TENANT_ID,Yl=`${uS}/${ZR}`;async function Rg(e){let t=await we("GET",Yl,e);return await $e(t)}async function TS(e,t){let n=await we("POST",Yl,e,t);return await $e(n)}async function jS(e,t,n){let o=await we("PUT",Yl,`${e}/${t}`,n);return await $e(o)}async function ES(e,t){let n=await we("DELETE",Yl,`${e}/${t}`);return await $e(n)}var OS={"/servers/detail":()=>Wl("/servers/detail"),"/flavors/detail":()=>pS("/flavors/detail"),"/os-keypairs":()=>Wl("/os-keypairs"),"/types":()=>Rg("/types"),"/volumes/detail":()=>Rg("/volumes/detail"),"/v2/images?limit=200":()=>fS("/v2/images?limit=200"),"/v2.0/security-groups":()=>gS("/v2.0/security-groups"),"/v2.0/security-group-rules":()=>Pg("/v2.0/security-group-rules"),"/v2.0/ports":()=>Pg("/v2.0/ports"),"/startup-scripts":()=>Wl("/startup-scripts"),"/v1/AUTH_{tenantId}":e=>kS(e||"/v1/AUTH_{tenantId}"),"/v1/AUTH_{tenantId}/{container}":e=>SS(e||"/v1/AUTH_{tenantId}/{container}"),"/v1/AUTH_{tenantId}/{container}/{object}":e=>wS(e||"/v1/AUTH_{tenantId}/{container}/{object}")},NS={"/ips":e=>Ia("/ips",e),"/os-security-groups":e=>Ia("/os-security-groups",e),"/rrd/cpu":e=>Ia("/rrd/cpu",e),"/rrd/disk":e=>Ia("/rrd/disk",e),"/v2.0/security-groups":e=>Tg("/v2.0/security-groups",e),"/v2.0/security-group-rules":e=>Tg("/v2.0/security-group-rules",e)},RS={"/servers":e=>zg("/servers",e),"/os-keypairs":e=>zg("/os-keypairs",e),"/volumes":e=>TS("/volumes",e),"/v2.0/security-groups":e=>jg("/v2.0/security-groups",e),"/v2.0/security-group-rules":e=>jg("/v2.0/security-group-rules",e)},DS={"/v1/AUTH_{tenantId}/{container}":e=>$S(e),"/v1/AUTH_{tenantId}/{container}/{object}":(e,t,n)=>{if(t===void 0)throw new Error("content is required for object upload");return PS(e,t,n)}},AS={"/action":(e,t)=>Xl("/action",e,t),"/remote-consoles":(e,t)=>Xl("/remote-consoles",e,t),"/os-volume_attachments":(e,t)=>Xl("/os-volume_attachments",e,t),"/v2.0/security-groups":(e,t)=>Eg("/v2.0/security-groups",e,t),"/v2.0/ports":(e,t)=>Eg("/v2.0/ports",e,t),"/volumes":(e,t)=>jS("/volumes",e,t)},ZS={"/v1":(e,t)=>_S(e,t)},CS={"/servers":e=>Ig("/servers",e),"/os-keypairs":e=>Ig("/os-keypairs",e),"/v2.0/security-groups":e=>Og("/v2.0/security-groups",e),"/v2.0/security-group-rules":e=>Og("/v2.0/security-group-rules",e),"/volumes":e=>ES("/volumes",e),"/v1/AUTH_{tenantId}/{container}":e=>IS(e),"/v1/AUTH_{tenantId}/{container}/{object}":e=>zS(e)},US={"/v1":e=>{let t=e.split("/");return t.length>=4&&t[3]?xS(e):bS(e)}};var qR=MR(import.meta.url),MS=qR("../package.json"),LR=`conoha-vps-mcp/${MS.version}`,vt=new Jl({name:"ConoHa VPS MCP",version:MS.version});vt.registerTool("fetch_url",{title:"URL\u53D6\u5F97",description:oS.trim(),inputSchema:{url:h.string().url()},outputSchema:{text:h.string()}},async({url:e})=>{try{let t=await fetch(e,{headers:{"User-Agent":LR}});if(!t.ok)throw new Error(`Failed to fetch: ${t.status} ${t.statusText}`);let o={text:await t.text()};return{content:[{type:"text",text:JSON.stringify(o)}],structuredContent:o}}catch(t){return{content:[{type:"text",text:Nt(t)}],isError:!0}}});vt.registerTool("encode_base64",{title:"Base64\u30A8\u30F3\u30B3\u30FC\u30C9",description:iS.trim(),inputSchema:{text:h.string().min(1).max(1e4)},outputSchema:{encoded:h.string()}},async({text:e})=>{try{let n={encoded:CR.from(e,"utf-8").toString("base64")};return{content:[{type:"text",text:JSON.stringify(n)}],structuredContent:n}}catch(t){return{content:[{type:"text",text:Nt(t)}],isError:!0}}});vt.registerTool("conoha_get",{title:"ConoHa API\u53D6\u5F97",description:Wk.trim(),inputSchema:{path:h.union([h.enum(["/servers/detail","/flavors/detail","/os-keypairs","/types","/volumes/detail","/v2/images?limit=200","/v2.0/security-groups","/v2.0/security-group-rules","/v2.0/ports","/startup-scripts","/v1/AUTH_{tenantId}"]),h.string().regex(/^\/v1\/AUTH_\{tenantId\}\/.+$/)])},outputSchema:{response:h.string()}},async({path:e})=>{try{let t=process.env.OPENSTACK_TENANT_ID;if(!t)throw new Error("OPENSTACK_TENANT_ID is not defined");let n=e,o=e;if(e==="/v1/AUTH_{tenantId}")n=e.replace("{tenantId}",t);else if(e.startsWith("/v1/AUTH_{tenantId}/")){n=e.replace("{tenantId}",t);let s=e.split("/");s.length>=5&&s[4]?o="/v1/AUTH_{tenantId}/{container}/{object}":o="/v1/AUTH_{tenantId}/{container}"}let r=OS[o],a={response:await r(n)};return{content:[{type:"text",text:JSON.stringify(a)}],structuredContent:a}}catch(t){return{content:[{type:"text",text:Nt(t)}],isError:!0}}});vt.registerTool("conoha_get_by_param",{title:"ConoHa API\u53D6\u5F97\uFF08\u30D1\u30E9\u30E1\u30FC\u30BF\u6307\u5B9A\uFF09",description:Xk.trim(),inputSchema:{path:h.enum(["/ips","/os-security-groups","/rrd/cpu","/rrd/disk","/v2.0/security-groups","/v2.0/security-group-rules"]),param:h.string()},outputSchema:{response:h.string()}},async({path:e,param:t})=>{try{let n=NS[e],r={response:await n(t)};return{content:[{type:"text",text:JSON.stringify(r)}],structuredContent:r}}catch(n){return{content:[{type:"text",text:Nt(n)}],isError:!0}}});vt.registerTool("conoha_post",{title:"ConoHa API\u4F5C\u6210",description:Yk.trim(),inputSchema:{input:h.discriminatedUnion("path",[h.object({path:h.literal("/servers"),requestBody:Uk}),h.object({path:h.literal("/os-keypairs"),requestBody:Mk}),h.object({path:h.literal("/volumes"),requestBody:Gk}),h.object({path:h.literal("/v2.0/security-groups"),requestBody:Hk}),h.object({path:h.literal("/v2.0/security-group-rules"),requestBody:Fk})])},outputSchema:{response:h.string()}},async({input:e})=>{try{let{path:t,requestBody:n}=e,o=RS[t],i={response:await o(n)};return{content:[{type:"text",text:JSON.stringify(i)}],structuredContent:i}}catch(t){return{content:[{type:"text",text:Nt(t)}],isError:!0}}});vt.registerTool("conoha_post_put",{title:"ConoHa API\u66F4\u65B0\u30FB\u64CD\u4F5C",description:tS.trim(),inputSchema:{input:h.union([h.object({path:h.string().regex(/^\/v1\/AUTH_\{tenantId\}\/[^/]+$/)}),h.object({path:h.string().regex(/^\/v1\/AUTH_\{tenantId\}\/.+\/.+$/),content:h.string(),contentType:h.string().optional()})])},outputSchema:{response:h.string()}},async({input:e})=>{try{let t=process.env.OPENSTACK_TENANT_ID;if(!t)throw new Error("OPENSTACK_TENANT_ID is not defined");let n=e.path.replace("{tenantId}",t),o=e.path.split("/"),r;o.length>=5&&o[4]?r="/v1/AUTH_{tenantId}/{container}/{object}":r="/v1/AUTH_{tenantId}/{container}";let i=DS[r],a;"content"in e&&e.content&&(a=(await UR(e.content)).toString("base64"));let c={response:await i(n,a,"contentType"in e?e.contentType:void 0)};return{content:[{type:"text",text:JSON.stringify(c)}],structuredContent:c}}catch(t){return{content:[{type:"text",text:Nt(t)}],isError:!0}}});vt.registerTool("conoha_post_put_by_param",{title:"ConoHa API\u66F4\u65B0\u30FB\u64CD\u4F5C",description:Qk.trim(),inputSchema:{input:h.discriminatedUnion("path",[h.object({path:h.literal("/action"),param:h.string(),requestBody:qk}),h.object({path:h.literal("/remote-consoles"),param:h.string(),requestBody:Lk}),h.object({path:h.literal("/os-volume_attachments"),param:h.string(),requestBody:Vk}),h.object({path:h.literal("/v2.0/security-groups"),param:h.string(),requestBody:Jk}),h.object({path:h.literal("/v2.0/ports"),param:h.string(),requestBody:Bk}),h.object({path:h.literal("/volumes"),param:h.string(),requestBody:Kk})])},outputSchema:{response:h.string()}},async({input:e})=>{try{let{path:t,param:n,requestBody:o}=e,r=AS[t],a={response:await r(n,o)};return{content:[{type:"text",text:JSON.stringify(a)}],structuredContent:a}}catch(t){return{content:[{type:"text",text:Nt(t)}],isError:!0}}});vt.registerTool("conoha_post_by_header_param",{title:"ConoHa API\u66F4\u65B0\u30FB\u64CD\u4F5C\uFF08\u30D8\u30C3\u30C0\u30FC\u30D1\u30E9\u30E1\u30FC\u30BF\u6307\u5B9A\uFF09",description:eS.trim(),inputSchema:{input:h.union([h.object({path:h.literal("/v1/AUTH_{tenantId}"),headerparam:h.object({"X-Account-Meta-Quota-Giga-Bytes":h.string()})}),h.object({path:h.string().regex(/^\/v1\/AUTH_\{tenantId\}\/.+$/),headerparam:h.object({"X-Container-Read":h.string()})})])},outputSchema:{response:h.string()}},async({input:e})=>{try{let t=process.env.OPENSTACK_TENANT_ID;if(!t)throw new Error("OPENSTACK_TENANT_ID is not defined");let n=e.path.replace("{tenantId}",t),o=n.startsWith("/v1")?"/v1":"",r=ZS[o],a={response:await r(n,e.headerparam)};return{content:[{type:"text",text:JSON.stringify(a)}],structuredContent:a}}catch(t){return{content:[{type:"text",text:Nt(t)}],isError:!0}}});vt.registerTool("conoha_delete_by_param",{title:"ConoHa API\u524A\u9664",description:rS.trim(),inputSchema:{path:h.enum(["/servers","/os-keypairs","/v2.0/security-groups","/v2.0/security-group-rules","/volumes","/v1/AUTH_{tenantId}/{container}","/v1/AUTH_{tenantId}/{container}/{object}"]),param:h.string()},outputSchema:{response:h.string()}},async({path:e,param:t})=>{try{let n=CS[e],r={response:await n(t)};return{content:[{type:"text",text:JSON.stringify(r)}],structuredContent:r}}catch(n){return{content:[{type:"text",text:Nt(n)}],isError:!0}}});vt.registerTool("conoha_head",{title:"ConoHa \u30A2\u30AB\u30A6\u30F3\u30C8\u60C5\u5831\u30FB\u30B3\u30F3\u30C6\u30CA\u8A73\u7D30\u53D6\u5F97",description:aS.trim(),inputSchema:{path:h.union([h.literal("/v1/AUTH_{tenantId}"),h.string().regex(/^\/v1\/AUTH_\{tenantId\}\/.+$/)])},outputSchema:{response:h.string()}},async({path:e})=>{try{let t=process.env.OPENSTACK_TENANT_ID;if(!t)throw new Error("OPENSTACK_TENANT_ID is not defined");let n=e.replace("{tenantId}",t),o=n.startsWith("/v1")?"/v1":"",r=US[o],a={response:await r(n)};return{content:[{type:"text",text:JSON.stringify(a)}],structuredContent:a}}catch(t){return{content:[{type:"text",text:Nt(t)}],isError:!0}}});vt.registerPrompt("create_server",{title:"\u30B5\u30FC\u30D0\u30FC\u4F5C\u6210",description:nS.trim(),argsSchema:{rootPassword:h.string().regex(/^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[\\^$+\-*/|()[\]{}.,?!_=&@~%#:;'"])[A-Za-z0-9\\^$+\-*/|()[\]{}.,?!_=&@~%#:;'"]{9,70}$/)}},({rootPassword:e})=>({messages:[{role:"user",content:{type:"text",text:`root\u30D1\u30B9\u30EF\u30FC\u30C9\u3092${e}\u3068\u3057\u3066\u3001\u65B0\u3057\u3044\u30B5\u30FC\u30D0\u30FC\u3092\u4F5C\u6210\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u307E\u305F\u3001\u958B\u653E\u3059\u308B\u30DD\u30FC\u30C8\u306A\u3069\u3001\u5FC5\u8981\u306A\u60C5\u5831\u306F\u90FD\u5EA6\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`}}]}));var VR=new Gl;await vt.connect(VR);
|
|
412
|
+
`;var sS={name:"@gmo-internet/conoha-vps-mcp",version:"0.5.2",description:"\u65E5\u672C\u8A9E\u5BFE\u5FDC\u306EConoHa VPS Model Context Protocol (MCP) \u30B5\u30FC\u30D0\u30FC",author:"GMO Internet",license:"Apache-2.0",type:"module",main:"dist/index.js",types:"dist/index.d.ts",bin:{"conoha-vps-mcp":"dist/index.js"},exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.js"}},keywords:["conoha","vps","mcp","modelcontextprotocol","openstack"],homepage:"https://github.com/gmo-internet/conoha_vps_mcp",bugs:{url:"https://github.com/gmo-internet/conoha_vps_mcp/issues"},repository:{type:"git",url:"https://github.com/gmo-internet/conoha_vps_mcp.git"},files:["dist","LICENSE","README.md","NOTICE"],publishConfig:{registry:"https://registry.npmjs.org/"},scripts:{build:"node esbuild.config.js","build:types":"tsc --emitDeclarationOnly","build:mcpb":"mcpb pack",start:"node dist/index.js",dev:"tsx src/index.ts",typecheck:"tsc --noEmit","biome:ci":"biome ci .","biome:fix":"biome check --write .",test:"vitest run --coverage","generate:notice":"node scripts/generate-notice.js",inspector:"npx @modelcontextprotocol/inspector","docs:build":"typedoc","docs:watch":"typedoc --watch","docs:serve":"npx serve reports/docs","audit:ci":"npm audit --audit-level=high",knip:"knip",depcruise:"depcruise src --config .dependency-cruiser.cjs",jscpd:"jscpd src/",mutation:"stryker run"},dependencies:{"@modelcontextprotocol/sdk":"^1.27.1",zod:"^4.3.6"},devDependencies:{"@anthropic-ai/mcpb":"2.1.2","@biomejs/biome":"2.4.5","@stryker-mutator/core":"9.6.0","@stryker-mutator/vitest-runner":"9.6.0","@types/node":"^22.0.0","@vitest/coverage-v8":"4.0.18","dependency-cruiser":"17.3.8",esbuild:"0.27.3",jscpd:"4.0.8",knip:"5.86.0",tsx:"4.21.0",typedoc:"0.28.17",typescript:"5.9.3",vitest:"4.0.18"},engines:{node:">=22.0.0"}};var Kl=`conoha-vps-mcp/${sS.version}`,cS="https://identity.c3j1.conoha.io/v3",pn="https://compute.c3j1.conoha.io/v2.1",uS="https://block-storage.c3j1.conoha.io/v3",lS="https://image-service.c3j1.conoha.io",mn="https://networking.c3j1.conoha.io",Rt="https://object-storage.c3j1.conoha.io";async function RR(e){let t=process.env.OPENSTACK_USER_ID,n=process.env.OPENSTACK_PASSWORD,o=process.env.OPENSTACK_TENANT_ID;if(!t||!n||!o)throw new Error("USER_ID, PASSWORD, or TENANT_ID envs are not defined");return(await fetch(`${cS}${e}`,{method:"POST",headers:{Accept:"application/json","User-Agent":Kl},body:JSON.stringify({auth:{identity:{methods:["password"],password:{user:{id:t,password:n}}},scope:{project:{id:o}}}})})).headers}async function at(){return(await RR("/auth/tokens")).get("x-subject-token")}async function we(e,t,n,o){let r=await at(),i=n.startsWith("/")?n:`/${n}`,a=`${t}${i}`;return await fetch(a,{method:e,headers:{Accept:"application/json","User-Agent":Kl,"X-Auth-Token":r,...o?{"Content-Type":"application/json"}:{}},...o?{body:JSON.stringify(o)}:{}})}async function $e(e){let t=await e.text();try{return JSON.stringify({status:e.status,statusText:e.statusText,body:JSON.parse(t)})}catch(n){return console.error("Failed to parse response body as JSON:",n),JSON.stringify({status:e.status,statusText:e.statusText,body:t})}}async function dS(e){let t=e.status,n=e.statusText;try{let o=await e.json();if(!o?.flavors||!Array.isArray(o.flavors))return JSON.stringify({status:t,statusText:n,body:o});let r={flavors:o.flavors.map(i=>({id:i?.id,name:i?.name,ram:i?.ram,vcpus:i?.vcpus,disk:i?.disk}))};return JSON.stringify({status:t,statusText:n,body:r})}catch(o){return console.error("Error formatting response:",o),JSON.stringify({status:t,statusText:n,body:"<error>"})}}async function Wl(e){let t=await we("GET",pn,e);return await $e(t)}async function pS(e){let t=await we("GET",pn,e);return await dS(t)}async function Ia(e,t){let n=await we("GET",pn,`/servers/${t}${e}`);return await $e(n)}async function zg(e,t){let n=await we("POST",pn,e,t);return await $e(n)}async function Xl(e,t,n){let o=await we("POST",pn,`/servers/${t}${e}`,n);return await $e(o)}async function Ig(e,t){let n=await we("DELETE",pn,`${e}/${t}`);return await $e(n)}async function mS(e){let t=e.status,n=e.statusText;try{let o=await e.json();if(!o?.images||!Array.isArray(o.images))return JSON.stringify({status:t,statusText:n,body:o});let r={images:o.images.map(i=>({id:i?.id,name:i?.name,osType:i?.os_type,arch:i?.architecture,tags:i?.tags,minDisk:i?.min_disk,minRam:i?.min_ram}))};return JSON.stringify({status:t,statusText:n,body:r})}catch(o){return console.error("Error formatting response:",o),JSON.stringify({status:t,statusText:n,body:"<error>"})}}async function fS(e){let t=await we("GET",lS,e);return await mS(t)}async function hS(e){let t=e.status,n=e.statusText;try{let o=await e.json();if(!o?.security_groups||!Array.isArray(o?.security_groups))return JSON.stringify({status:t,statusText:n,body:o});let r={security_groups:o.security_groups.map(i=>({id:i?.id,name:i?.name,description:i?.description,security_group_rules:i?.security_group_rules?.map(s=>({ethertype:s?.ethertype,direction:s?.direction,protocol:s?.protocol??null,port_range_min:s?.port_range_min??null,port_range_max:s?.port_range_max??null,remote_ip_prefix:s?.remote_ip_prefix??null,remote_group_id:s?.remote_group_id??null}))}))};return JSON.stringify({status:t,statusText:n,body:r})}catch(o){return console.error("Error formatting response:",o),JSON.stringify({status:t,statusText:n,body:"<error>"})}}async function Pg(e){let t=await we("GET",mn,e);return await $e(t)}async function Tg(e,t){let n=await we("GET",mn,`${e}/${t}`);return await $e(n)}async function gS(e){let t=await we("GET",mn,e);return await hS(t)}async function jg(e,t){let n=await we("POST",mn,e,t);return await $e(n)}async function Eg(e,t,n){let o=await we("PUT",mn,`${e}/${t}`,n);return await $e(o)}async function Og(e,t){let n=await we("DELETE",mn,`${e}/${t}`);return await $e(n)}import{readFile as AR}from"node:fs/promises";import{Buffer as DR}from"node:buffer";function Ng(e){let t={};return e.headers.forEach((n,o)=>{t[o]=n}),JSON.stringify({status:e.status,statusText:e.statusText,headers:t})}function vS(e,t){let n={};e.headers.forEach((a,s)=>{n[s]=a});let o=e.headers.get("content-type")||"",r,i=!o.includes("text/")&&!o.includes("application/json")&&!o.includes("application/xml");return i?r=DR.from(t,"binary").toString("base64"):r=t,JSON.stringify({status:e.status,statusText:e.statusText,headers:n,body:r,encoding:i?"base64":"utf8"})}var yS=process.env.OPENSTACK_TENANT_ID;async function _S(e,t){let n=await at(),o=`${Rt}${e}`,r={Accept:"application/json","X-Auth-Token":n};for(let[a,s]of Object.entries(t))s!==void 0&&(r[a]=s);let i=await fetch(o,{method:"POST",headers:r});return await $e(i)}async function $S(e){let t=await at(),n=`${Rt}${e}`,r=await fetch(n,{method:"PUT",headers:{Accept:"application/json","X-Auth-Token":t}});return await $e(r)}async function bS(e){let t=await at(),n=`${Rt}${e}`,r=await fetch(n,{method:"HEAD",headers:{Accept:"application/json","X-Auth-Token":t}});return Ng(r)}async function xS(e){let t=await at(),n=`${Rt}${e}`,r=await fetch(n,{method:"HEAD",headers:{Accept:"application/json","X-Auth-Token":t}});return Ng(r)}async function kS(e){let t=await at(),n=`${Rt}${e}`,r=await fetch(n,{method:"GET",headers:{Accept:"application/json","X-Auth-Token":t}});return await $e(r)}async function SS(e){let t=await at(),n=`${Rt}${e}`,r=await fetch(n,{method:"GET",headers:{Accept:"application/json","X-Auth-Token":t}});return await $e(r)}async function wS(e){let t=await at(),n=`${Rt}${e}`,r=await fetch(n,{method:"GET",headers:{"X-Auth-Token":t}}),i=await r.text();return vS(r,i)}async function zS(e){let t=await at(),n=yS||"",o=e.replace("{tenantId}",n),r=`${Rt}${o}`,a=await fetch(r,{method:"DELETE",headers:{Accept:"application/json","X-Auth-Token":t}});return await $e(a)}async function IS(e){let t=await at(),n=yS||"",o=e.replace("{tenantId}",n),r=`${Rt}${o}`,a=await fetch(r,{method:"DELETE",headers:{Accept:"application/json","X-Auth-Token":t}});return await $e(a)}async function PS(e,t,n){let o=await at(),r=`${Rt}${e}`,i={Accept:"application/json","X-Auth-Token":o};n&&(i["Content-Type"]=n);let a;try{let c=await AR(t);a=new Uint8Array(c)}catch{try{let c=Buffer.from(t,"base64").toString("binary");a=new Uint8Array(c.length);for(let u=0;u<c.length;u++)a[u]=c.charCodeAt(u)}catch{a=new TextEncoder().encode(t)}}let s=await fetch(r,{method:"PUT",headers:i,body:a});return await $e(s)}var ZR=process.env.OPENSTACK_TENANT_ID,Yl=`${uS}/${ZR}`;async function Rg(e){let t=await we("GET",Yl,e);return await $e(t)}async function TS(e,t){let n=await we("POST",Yl,e,t);return await $e(n)}async function jS(e,t,n){let o=await we("PUT",Yl,`${e}/${t}`,n);return await $e(o)}async function ES(e,t){let n=await we("DELETE",Yl,`${e}/${t}`);return await $e(n)}var OS={"/servers/detail":()=>Wl("/servers/detail"),"/flavors/detail":()=>pS("/flavors/detail"),"/os-keypairs":()=>Wl("/os-keypairs"),"/types":()=>Rg("/types"),"/volumes/detail":()=>Rg("/volumes/detail"),"/v2/images?limit=200":()=>fS("/v2/images?limit=200"),"/v2.0/security-groups":()=>gS("/v2.0/security-groups"),"/v2.0/security-group-rules":()=>Pg("/v2.0/security-group-rules"),"/v2.0/ports":()=>Pg("/v2.0/ports"),"/startup-scripts":()=>Wl("/startup-scripts"),"/v1/AUTH_{tenantId}":e=>kS(e||"/v1/AUTH_{tenantId}"),"/v1/AUTH_{tenantId}/{container}":e=>SS(e||"/v1/AUTH_{tenantId}/{container}"),"/v1/AUTH_{tenantId}/{container}/{object}":e=>wS(e||"/v1/AUTH_{tenantId}/{container}/{object}")},NS={"/ips":e=>Ia("/ips",e),"/os-security-groups":e=>Ia("/os-security-groups",e),"/rrd/cpu":e=>Ia("/rrd/cpu",e),"/rrd/disk":e=>Ia("/rrd/disk",e),"/v2.0/security-groups":e=>Tg("/v2.0/security-groups",e),"/v2.0/security-group-rules":e=>Tg("/v2.0/security-group-rules",e)},RS={"/servers":e=>zg("/servers",e),"/os-keypairs":e=>zg("/os-keypairs",e),"/volumes":e=>TS("/volumes",e),"/v2.0/security-groups":e=>jg("/v2.0/security-groups",e),"/v2.0/security-group-rules":e=>jg("/v2.0/security-group-rules",e)},DS={"/v1/AUTH_{tenantId}/{container}":e=>$S(e),"/v1/AUTH_{tenantId}/{container}/{object}":(e,t,n)=>{if(t===void 0)throw new Error("content is required for object upload");return PS(e,t,n)}},AS={"/action":(e,t)=>Xl("/action",e,t),"/remote-consoles":(e,t)=>Xl("/remote-consoles",e,t),"/os-volume_attachments":(e,t)=>Xl("/os-volume_attachments",e,t),"/v2.0/security-groups":(e,t)=>Eg("/v2.0/security-groups",e,t),"/v2.0/ports":(e,t)=>Eg("/v2.0/ports",e,t),"/volumes":(e,t)=>jS("/volumes",e,t)},ZS={"/v1":(e,t)=>_S(e,t)},CS={"/servers":e=>Ig("/servers",e),"/os-keypairs":e=>Ig("/os-keypairs",e),"/v2.0/security-groups":e=>Og("/v2.0/security-groups",e),"/v2.0/security-group-rules":e=>Og("/v2.0/security-group-rules",e),"/volumes":e=>ES("/volumes",e),"/v1/AUTH_{tenantId}/{container}":e=>IS(e),"/v1/AUTH_{tenantId}/{container}/{object}":e=>zS(e)},US={"/v1":e=>{let t=e.split("/");return t.length>=4&&t[3]?xS(e):bS(e)}};var qR=MR(import.meta.url),MS=qR("../package.json"),LR=`conoha-vps-mcp/${MS.version}`,vt=new Jl({name:"ConoHa VPS MCP",version:MS.version});vt.registerTool("fetch_url",{title:"URL\u53D6\u5F97",description:oS.trim(),inputSchema:{url:h.string().url()},outputSchema:{text:h.string()}},async({url:e})=>{try{let t=await fetch(e,{headers:{"User-Agent":LR}});if(!t.ok)throw new Error(`Failed to fetch: ${t.status} ${t.statusText}`);let o={text:await t.text()};return{content:[{type:"text",text:JSON.stringify(o)}],structuredContent:o}}catch(t){return{content:[{type:"text",text:Nt(t)}],isError:!0}}});vt.registerTool("encode_base64",{title:"Base64\u30A8\u30F3\u30B3\u30FC\u30C9",description:iS.trim(),inputSchema:{text:h.string().min(1).max(1e4)},outputSchema:{encoded:h.string()}},async({text:e})=>{try{let n={encoded:CR.from(e,"utf-8").toString("base64")};return{content:[{type:"text",text:JSON.stringify(n)}],structuredContent:n}}catch(t){return{content:[{type:"text",text:Nt(t)}],isError:!0}}});vt.registerTool("conoha_get",{title:"ConoHa API\u53D6\u5F97",description:Wk.trim(),inputSchema:{path:h.union([h.enum(["/servers/detail","/flavors/detail","/os-keypairs","/types","/volumes/detail","/v2/images?limit=200","/v2.0/security-groups","/v2.0/security-group-rules","/v2.0/ports","/startup-scripts","/v1/AUTH_{tenantId}"]),h.string().regex(/^\/v1\/AUTH_\{tenantId\}\/.+$/)])},outputSchema:{response:h.string()}},async({path:e})=>{try{let t=process.env.OPENSTACK_TENANT_ID;if(!t)throw new Error("OPENSTACK_TENANT_ID is not defined");let n=e,o=e;if(e==="/v1/AUTH_{tenantId}")n=e.replace("{tenantId}",t);else if(e.startsWith("/v1/AUTH_{tenantId}/")){n=e.replace("{tenantId}",t);let s=e.split("/");s.length>=5&&s[4]?o="/v1/AUTH_{tenantId}/{container}/{object}":o="/v1/AUTH_{tenantId}/{container}"}let r=OS[o],a={response:await r(n)};return{content:[{type:"text",text:JSON.stringify(a)}],structuredContent:a}}catch(t){return{content:[{type:"text",text:Nt(t)}],isError:!0}}});vt.registerTool("conoha_get_by_param",{title:"ConoHa API\u53D6\u5F97\uFF08\u30D1\u30E9\u30E1\u30FC\u30BF\u6307\u5B9A\uFF09",description:Xk.trim(),inputSchema:{path:h.enum(["/ips","/os-security-groups","/rrd/cpu","/rrd/disk","/v2.0/security-groups","/v2.0/security-group-rules"]),param:h.string()},outputSchema:{response:h.string()}},async({path:e,param:t})=>{try{let n=NS[e],r={response:await n(t)};return{content:[{type:"text",text:JSON.stringify(r)}],structuredContent:r}}catch(n){return{content:[{type:"text",text:Nt(n)}],isError:!0}}});vt.registerTool("conoha_post",{title:"ConoHa API\u4F5C\u6210",description:Yk.trim(),inputSchema:{input:h.discriminatedUnion("path",[h.object({path:h.literal("/servers"),requestBody:Uk}),h.object({path:h.literal("/os-keypairs"),requestBody:Mk}),h.object({path:h.literal("/volumes"),requestBody:Gk}),h.object({path:h.literal("/v2.0/security-groups"),requestBody:Hk}),h.object({path:h.literal("/v2.0/security-group-rules"),requestBody:Fk})])},outputSchema:{response:h.string()}},async({input:e})=>{try{let{path:t,requestBody:n}=e,o=RS[t],i={response:await o(n)};return{content:[{type:"text",text:JSON.stringify(i)}],structuredContent:i}}catch(t){return{content:[{type:"text",text:Nt(t)}],isError:!0}}});vt.registerTool("conoha_post_put",{title:"ConoHa API\u66F4\u65B0\u30FB\u64CD\u4F5C",description:tS.trim(),inputSchema:{input:h.union([h.object({path:h.string().regex(/^\/v1\/AUTH_\{tenantId\}\/[^/]+$/)}),h.object({path:h.string().regex(/^\/v1\/AUTH_\{tenantId\}\/.+\/.+$/),content:h.string(),contentType:h.string().optional()})])},outputSchema:{response:h.string()}},async({input:e})=>{try{let t=process.env.OPENSTACK_TENANT_ID;if(!t)throw new Error("OPENSTACK_TENANT_ID is not defined");let n=e.path.replace("{tenantId}",t),o=e.path.split("/"),r;o.length>=5&&o[4]?r="/v1/AUTH_{tenantId}/{container}/{object}":r="/v1/AUTH_{tenantId}/{container}";let i=DS[r],a;"content"in e&&e.content&&(a=(await UR(e.content)).toString("base64"));let c={response:await i(n,a,"contentType"in e?e.contentType:void 0)};return{content:[{type:"text",text:JSON.stringify(c)}],structuredContent:c}}catch(t){return{content:[{type:"text",text:Nt(t)}],isError:!0}}});vt.registerTool("conoha_post_put_by_param",{title:"ConoHa API\u66F4\u65B0\u30FB\u64CD\u4F5C",description:Qk.trim(),inputSchema:{input:h.discriminatedUnion("path",[h.object({path:h.literal("/action"),param:h.string(),requestBody:qk}),h.object({path:h.literal("/remote-consoles"),param:h.string(),requestBody:Lk}),h.object({path:h.literal("/os-volume_attachments"),param:h.string(),requestBody:Vk}),h.object({path:h.literal("/v2.0/security-groups"),param:h.string(),requestBody:Jk}),h.object({path:h.literal("/v2.0/ports"),param:h.string(),requestBody:Bk}),h.object({path:h.literal("/volumes"),param:h.string(),requestBody:Kk})])},outputSchema:{response:h.string()}},async({input:e})=>{try{let{path:t,param:n,requestBody:o}=e,r=AS[t],a={response:await r(n,o)};return{content:[{type:"text",text:JSON.stringify(a)}],structuredContent:a}}catch(t){return{content:[{type:"text",text:Nt(t)}],isError:!0}}});vt.registerTool("conoha_post_by_header_param",{title:"ConoHa API\u66F4\u65B0\u30FB\u64CD\u4F5C\uFF08\u30D8\u30C3\u30C0\u30FC\u30D1\u30E9\u30E1\u30FC\u30BF\u6307\u5B9A\uFF09",description:eS.trim(),inputSchema:{input:h.union([h.object({path:h.literal("/v1/AUTH_{tenantId}"),headerparam:h.object({"X-Account-Meta-Quota-Giga-Bytes":h.string()})}),h.object({path:h.string().regex(/^\/v1\/AUTH_\{tenantId\}\/.+$/),headerparam:h.object({"X-Container-Read":h.string()})})])},outputSchema:{response:h.string()}},async({input:e})=>{try{let t=process.env.OPENSTACK_TENANT_ID;if(!t)throw new Error("OPENSTACK_TENANT_ID is not defined");let n=e.path.replace("{tenantId}",t),o=n.startsWith("/v1")?"/v1":"",r=ZS[o],a={response:await r(n,e.headerparam)};return{content:[{type:"text",text:JSON.stringify(a)}],structuredContent:a}}catch(t){return{content:[{type:"text",text:Nt(t)}],isError:!0}}});vt.registerTool("conoha_delete_by_param",{title:"ConoHa API\u524A\u9664",description:rS.trim(),inputSchema:{path:h.enum(["/servers","/os-keypairs","/v2.0/security-groups","/v2.0/security-group-rules","/volumes","/v1/AUTH_{tenantId}/{container}","/v1/AUTH_{tenantId}/{container}/{object}"]),param:h.string()},outputSchema:{response:h.string()}},async({path:e,param:t})=>{try{let n=CS[e],r={response:await n(t)};return{content:[{type:"text",text:JSON.stringify(r)}],structuredContent:r}}catch(n){return{content:[{type:"text",text:Nt(n)}],isError:!0}}});vt.registerTool("conoha_head",{title:"ConoHa \u30A2\u30AB\u30A6\u30F3\u30C8\u60C5\u5831\u30FB\u30B3\u30F3\u30C6\u30CA\u8A73\u7D30\u53D6\u5F97",description:aS.trim(),inputSchema:{path:h.union([h.literal("/v1/AUTH_{tenantId}"),h.string().regex(/^\/v1\/AUTH_\{tenantId\}\/.+$/)])},outputSchema:{response:h.string()}},async({path:e})=>{try{let t=process.env.OPENSTACK_TENANT_ID;if(!t)throw new Error("OPENSTACK_TENANT_ID is not defined");let n=e.replace("{tenantId}",t),o=n.startsWith("/v1")?"/v1":"",r=US[o],a={response:await r(n)};return{content:[{type:"text",text:JSON.stringify(a)}],structuredContent:a}}catch(t){return{content:[{type:"text",text:Nt(t)}],isError:!0}}});vt.registerPrompt("create_server",{title:"\u30B5\u30FC\u30D0\u30FC\u4F5C\u6210",description:nS.trim(),argsSchema:{rootPassword:h.string().regex(/^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[\\^$+\-*/|()[\]{}.,?!_=&@~%#:;'"])[A-Za-z0-9\\^$+\-*/|()[\]{}.,?!_=&@~%#:;'"]{9,70}$/)}},({rootPassword:e})=>({messages:[{role:"user",content:{type:"text",text:`root\u30D1\u30B9\u30EF\u30FC\u30C9\u3092${e}\u3068\u3057\u3066\u3001\u65B0\u3057\u3044\u30B5\u30FC\u30D0\u30FC\u3092\u4F5C\u6210\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u307E\u305F\u3001\u958B\u653E\u3059\u308B\u30DD\u30FC\u30C8\u306A\u3069\u3001\u5FC5\u8981\u306A\u60C5\u5831\u306F\u90FD\u5EA6\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002`}}]}));var VR=new Gl;await vt.connect(VR);
|