@gcnv/gcnv-mcp-server 1.1.5 → 1.1.6
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/GEMINI.md +35 -3
- package/build/tools/active-directory-tools.js +5 -2
- package/build/tools/backup-policy-tools.js +5 -2
- package/build/tools/backup-tools.js +5 -2
- package/build/tools/backup-vault-tools.js +5 -2
- package/build/tools/handlers/active-directory-handler.js +2 -1
- package/build/tools/handlers/backup-handler.js +3 -2
- package/build/tools/handlers/backup-policy-handler.js +3 -2
- package/build/tools/handlers/backup-vault-handler.js +3 -2
- package/build/tools/handlers/host-group-handler.js +2 -2
- package/build/tools/handlers/kms-config-handler.js +2 -1
- package/build/tools/handlers/operation-handler.js +3 -2
- package/build/tools/handlers/quota-rule-handler.js +2 -1
- package/build/tools/handlers/replication-handler.js +3 -2
- package/build/tools/handlers/snapshot-handler.js +3 -2
- package/build/tools/handlers/storage-pool-handler.js +3 -2
- package/build/tools/handlers/volume-handler.js +3 -2
- package/build/tools/host-group-tools.js +5 -2
- package/build/tools/kms-config-tools.js +5 -2
- package/build/tools/operation-tools.js +5 -2
- package/build/tools/quota-rule-tools.js +5 -2
- package/build/tools/replication-tools.js +5 -2
- package/build/tools/snapshot-tools.js +5 -2
- package/build/tools/storage-pool-tools.js +5 -2
- package/build/tools/volume-tools.js +5 -2
- package/gemini-extension.json +1 -1
- package/package.json +1 -1
package/GEMINI.md
CHANGED
|
@@ -34,9 +34,9 @@ Use this link to explain billing and estimate pricing (pair with the Google Clou
|
|
|
34
34
|
- Never guess resource identifiers. Always collect `projectId`, `location`, and resource-specific IDs explicitly.
|
|
35
35
|
- Validate numeric fields (e.g., `capacityGib`) and repeat key parameters back to the user before running a tool.
|
|
36
36
|
- Validate `location` format:
|
|
37
|
-
-
|
|
38
|
-
- For **FLEX storage pool creation
|
|
39
|
-
- If
|
|
37
|
+
- **Region or zone are both valid.** The API accepts either a **region** (e.g., `us-central1`, `us-west1`) or a **zone** (e.g., `us-central1-a`, `us-west1-b`). Use whichever the user specified—e.g. if they say "list my volumes in us-west1-b", pass `location: "us-west1-b"`; do not correct or reject zones.
|
|
38
|
+
- For **FLEX storage pool creation** only: if `location` is a **zone** (e.g., `us-central1-a`), that satisfies "zone in location" and you can omit `zone`/`replicaZone`. If `location` is a **region** (e.g., `us-central1`), the user must provide both `zone` and `replicaZone`.
|
|
39
|
+
- **For list tools (`gcnv_*_list`), `location` is optional.** If the user does not specify a location (e.g. "list my storage pools", "list all volumes"), omit the `location` parameter or pass `-`; the API will return resources from all locations. Do not ask for a location when the user only wants a full list.
|
|
40
40
|
|
|
41
41
|
### Request construction
|
|
42
42
|
|
|
@@ -58,6 +58,37 @@ Use this link to explain billing and estimate pricing (pair with the Google Clou
|
|
|
58
58
|
- Prefer asking clarifying questions over assuming intent.
|
|
59
59
|
- Summaries should be concise but mention important next steps (mount targets, replication follow-ups, etc.).
|
|
60
60
|
|
|
61
|
+
### List response formatting
|
|
62
|
+
|
|
63
|
+
- **Always beautify list tool responses in a tabular format.** When you receive results from any `gcnv_*_list` tool (e.g. `gcnv_storage_pool_list`, `gcnv_volume_list`, `gcnv_backup_vault_list`, `gcnv_host_group_list`, etc.), present the data to the user as a **markdown table** instead of raw JSON.
|
|
64
|
+
- **Table structure:**
|
|
65
|
+
- Use a header row with column names derived from the list item fields (e.g. Name, ID, State, Location, Capacity, Service Level, Create Time—pick the most relevant fields for that resource type).
|
|
66
|
+
- **Include details that vary between resources.** Add columns for fields that differ across items (e.g. state, capacity, service level, location, protocol, backup state) so the table is informative and each row is distinguishable. Avoid a one-size-fits-all set of columns—tailor columns to the resource type and to what actually varies in the response.
|
|
67
|
+
- **Include these bare-minimum columns when present in the response** (so the table is always useful). Add any additional columns that vary and are relevant.
|
|
68
|
+
- **Storage pools:** name/ID, state, serviceLevel, capacityGib, **volumeCapacityGib**, **volumeCount** (or volumecount), **encryptionType**, **allowAutoTiering**, **totalThroughputMibps**, qosType, zone, replicaZone, createTime.
|
|
69
|
+
- **Volumes:** name/volumeId, state, capacityGib, usedGib, protocols, serviceLevel, **encryptionType**, **throughputMibps** (or availableThroughputMibps), **coldTierSizeGib**, **hotTierSizeUsedGib** (or hotTierSizeGib), tieringPolicy, createTime, storagePool.
|
|
70
|
+
- **Snapshots:** name/snapshotId, volumeId, state, createTime, description.
|
|
71
|
+
- **Backups:** backupId, backupVaultId, state, sourceVolume, backupType, volumeUsagebytes, chainStoragebytes, createTime, retentionDays.
|
|
72
|
+
- **Backup vaults:** backupVaultId, state, backupVaultType, sourceRegion, backupRegion, createTime.
|
|
73
|
+
- **Backup policies:** backupPolicyId, state, enabled, dailyBackupLimit, weeklyBackupLimit, monthlyBackupLimit, assignedVolumeCount, createTime.
|
|
74
|
+
- **Host groups:** hostGroupId, type, state, hosts (count or summary), osType, createTime.
|
|
75
|
+
- **KMS configs:** kmsConfigId, state, cryptoKeyName, stateDetails, createTime.
|
|
76
|
+
- **Replications:** replicationId, sourceVolume, destinationVolume, state, healthy, lastReplicationTime, createTime.
|
|
77
|
+
- **Quota rules:** quotaRuleId, target, quotaType, diskLimitMib, state, createTime.
|
|
78
|
+
- **Operations:** name (or operationId), done, success, target, verb, createTime, statusMessage.
|
|
79
|
+
- **Active directories:** activeDirectoryId, domain, site, state, createTime.
|
|
80
|
+
- One row per item; keep cells concise (e.g. short IDs, not full resource names unless needed).
|
|
81
|
+
- If the list is empty, say so clearly (e.g. "No storage pools found.") instead of showing an empty table.
|
|
82
|
+
- **State column: mark states with icons.** In the State (or equivalent) column, prefix or replace raw state values with a short, clear icon so status is scannable at a glance. Examples:
|
|
83
|
+
- **Ready / READY / Healthy / Active:** ✅ or 🟢
|
|
84
|
+
- **Creating / Updating / Pending / In progress:** ⏳ or 🔄
|
|
85
|
+
- **Error / Failed / Unhealthy:** ❌ or 🔴
|
|
86
|
+
- **Deleting / Stopping:** 🗑️ or ⏹️
|
|
87
|
+
- **Unknown / Unspecified:** ⚪ or ❓
|
|
88
|
+
Use one style consistently (e.g. always emoji) and keep the actual state text next to the icon when helpful (e.g. `✅ READY` or `🟢 Healthy`).
|
|
89
|
+
- **Pagination:** If the response includes `nextPageToken`, mention it below the table (e.g. "More results are available; provide this token to fetch the next page.") and show the token.
|
|
90
|
+
- **Do not** dump the raw tool output unless the user explicitly asks for JSON or full details.
|
|
91
|
+
|
|
61
92
|
---
|
|
62
93
|
|
|
63
94
|
# Tool Overview
|
|
@@ -250,4 +281,5 @@ Notes:
|
|
|
250
281
|
- Ask follow-up questions instead of assuming missing parameters.
|
|
251
282
|
- Keep answers short unless the user asks for details.
|
|
252
283
|
- When returning tool results, highlight only key fields unless the user requests full JSON.
|
|
284
|
+
- **For list tool results:** Always present the items in a **tabular (markdown table) format**—do not show raw JSON by default.
|
|
253
285
|
- Maintain safety-first decision making for all operations.
|
|
@@ -74,10 +74,13 @@ export const getActiveDirectoryTool = {
|
|
|
74
74
|
export const listActiveDirectoriesTool = {
|
|
75
75
|
name: 'gcnv_active_directory_list',
|
|
76
76
|
title: 'List Active Directories',
|
|
77
|
-
description: 'Lists all active directories in the specified location',
|
|
77
|
+
description: 'Lists all active directories in the specified location (omit location for all locations)',
|
|
78
78
|
inputSchema: {
|
|
79
79
|
projectId: z.string().describe('The ID of the Google Cloud project'),
|
|
80
|
-
location: z
|
|
80
|
+
location: z
|
|
81
|
+
.string()
|
|
82
|
+
.optional()
|
|
83
|
+
.describe('The location to list active directories from; omit or use "-" for all locations'),
|
|
81
84
|
filter: z.string().optional().describe('Filter expression'),
|
|
82
85
|
pageSize: z.number().optional().describe('Maximum number of items to return'),
|
|
83
86
|
pageToken: z.string().optional().describe('Page token from previous request'),
|
|
@@ -75,10 +75,13 @@ export const getBackupPolicyTool = {
|
|
|
75
75
|
export const listBackupPoliciesTool = {
|
|
76
76
|
name: 'gcnv_backup_policy_list',
|
|
77
77
|
title: 'List Backup Policies',
|
|
78
|
-
description: 'Lists backup policies in a specific project and location',
|
|
78
|
+
description: 'Lists backup policies in a specific project and location (omit location for all locations)',
|
|
79
79
|
inputSchema: {
|
|
80
80
|
projectId: z.string().describe('The ID of the Google Cloud project'),
|
|
81
|
-
location: z
|
|
81
|
+
location: z
|
|
82
|
+
.string()
|
|
83
|
+
.optional()
|
|
84
|
+
.describe('The location to list backup policies from; omit or use "-" for all locations'),
|
|
82
85
|
filter: z.string().optional().describe('Filter expression for filtering results'),
|
|
83
86
|
pageSize: z
|
|
84
87
|
.number()
|
|
@@ -85,10 +85,13 @@ export const getBackupTool = {
|
|
|
85
85
|
export const listBackupsTool = {
|
|
86
86
|
name: 'gcnv_backup_list',
|
|
87
87
|
title: 'List Backups',
|
|
88
|
-
description: 'Lists backups in a specific backup vault',
|
|
88
|
+
description: 'Lists backups in a specific backup vault (omit location for all locations)',
|
|
89
89
|
inputSchema: {
|
|
90
90
|
projectId: z.string().describe('The ID of the Google Cloud project'),
|
|
91
|
-
location: z
|
|
91
|
+
location: z
|
|
92
|
+
.string()
|
|
93
|
+
.optional()
|
|
94
|
+
.describe('The location to list backups from; omit or use "-" for all locations'),
|
|
92
95
|
backupVaultId: z.string().describe('The ID of the backup vault containing the backups'),
|
|
93
96
|
filter: z.string().optional().describe('Filter expression for filtering results'),
|
|
94
97
|
pageSize: z.number().optional().describe('Maximum number of backups to return per page'),
|
|
@@ -108,10 +108,13 @@ export const getBackupVaultTool = {
|
|
|
108
108
|
export const listBackupVaultsTool = {
|
|
109
109
|
name: 'gcnv_backup_vault_list',
|
|
110
110
|
title: 'List Backup Vaults',
|
|
111
|
-
description: 'Lists backup vaults in a specific project and location',
|
|
111
|
+
description: 'Lists backup vaults in a specific project and location (omit location for all locations)',
|
|
112
112
|
inputSchema: {
|
|
113
113
|
projectId: z.string().describe('The ID of the Google Cloud project'),
|
|
114
|
-
location: z
|
|
114
|
+
location: z
|
|
115
|
+
.string()
|
|
116
|
+
.optional()
|
|
117
|
+
.describe('The location to list backup vaults from; omit or use "-" for all locations'),
|
|
115
118
|
filter: z.string().optional().describe('Filter expression for filtering results'),
|
|
116
119
|
pageSize: z.number().optional().describe('Maximum number of backup vaults to return per page'),
|
|
117
120
|
pageToken: z.string().optional().describe('Page token from a previous list request'),
|
|
@@ -180,7 +180,8 @@ export const getActiveDirectoryHandler = async (args) => {
|
|
|
180
180
|
// List Active Directories Handler
|
|
181
181
|
export const listActiveDirectoriesHandler = async (args) => {
|
|
182
182
|
try {
|
|
183
|
-
const { projectId,
|
|
183
|
+
const { projectId, filter, pageSize, pageToken } = args;
|
|
184
|
+
const location = args.location ?? '-';
|
|
184
185
|
const netAppClient = NetAppClientFactory.createClient();
|
|
185
186
|
const parent = `projects/${projectId}/locations/${location}`;
|
|
186
187
|
const request = { parent };
|
|
@@ -242,10 +242,11 @@ export const getBackupHandler = async (args) => {
|
|
|
242
242
|
// List Backups Handler
|
|
243
243
|
export const listBackupsHandler = async (args) => {
|
|
244
244
|
try {
|
|
245
|
-
const { projectId,
|
|
245
|
+
const { projectId, backupVaultId, filter, pageSize, pageToken } = args;
|
|
246
|
+
const location = args.location ?? '-';
|
|
246
247
|
// Create a new NetApp client using the factory
|
|
247
248
|
const netAppClient = NetAppClientFactory.createClient();
|
|
248
|
-
// Format the parent path for listing backups
|
|
249
|
+
// Format the parent path for listing backups (use "-" for all locations)
|
|
249
250
|
const parent = `projects/${projectId}/locations/${location}/backupVaults/${backupVaultId}`;
|
|
250
251
|
// List the backups
|
|
251
252
|
const options = {
|
|
@@ -147,9 +147,10 @@ export const getBackupPolicyHandler = async (args) => {
|
|
|
147
147
|
*/
|
|
148
148
|
export const listBackupPoliciesHandler = async (args) => {
|
|
149
149
|
try {
|
|
150
|
-
const { projectId,
|
|
150
|
+
const { projectId, filter, pageSize, pageToken } = args;
|
|
151
|
+
const location = args.location ?? '-';
|
|
151
152
|
const client = NetAppClientFactory.createClient();
|
|
152
|
-
// Format resource name
|
|
153
|
+
// Format resource name (use "-" for all locations)
|
|
153
154
|
const parent = `projects/${projectId}/locations/${location}`;
|
|
154
155
|
// Call the API to list backup policies
|
|
155
156
|
const [response] = await client.listBackupPolicies({
|
|
@@ -229,10 +229,11 @@ export const getBackupVaultHandler = async (args) => {
|
|
|
229
229
|
// List Backup Vaults Handler
|
|
230
230
|
export const listBackupVaultsHandler = async (args) => {
|
|
231
231
|
try {
|
|
232
|
-
const { projectId,
|
|
232
|
+
const { projectId, filter, pageSize, pageToken } = args;
|
|
233
|
+
const location = args.location ?? '-';
|
|
233
234
|
// Create a new NetApp client using the factory
|
|
234
235
|
const netAppClient = NetAppClientFactory.createClient();
|
|
235
|
-
// Format the parent path for listing backup vaults
|
|
236
|
+
// Format the parent path for listing backup vaults (use "-" for all locations)
|
|
236
237
|
const parent = `projects/${projectId}/locations/${location}`;
|
|
237
238
|
// List the backup vaults
|
|
238
239
|
const options = {
|
|
@@ -237,10 +237,10 @@ export const getHostGroupHandler = async (args) => {
|
|
|
237
237
|
// List Host Groups Handler
|
|
238
238
|
export const listHostGroupsHandler = async (args) => {
|
|
239
239
|
try {
|
|
240
|
-
const { projectId,
|
|
240
|
+
const { projectId, filter, orderBy, pageSize, pageToken } = args;
|
|
241
|
+
const location = args.location ?? '-';
|
|
241
242
|
const errors = [];
|
|
242
243
|
validateRequiredString(projectId, 'projectId', errors);
|
|
243
|
-
validateRequiredString(location, 'location', errors);
|
|
244
244
|
if (errors.length > 0) {
|
|
245
245
|
return {
|
|
246
246
|
isError: true,
|
|
@@ -155,7 +155,8 @@ export const getKmsConfigHandler = async (args) => {
|
|
|
155
155
|
// List KMS Configs Handler
|
|
156
156
|
export const listKmsConfigsHandler = async (args) => {
|
|
157
157
|
try {
|
|
158
|
-
const { projectId,
|
|
158
|
+
const { projectId, filter, pageSize, pageToken, orderBy } = args;
|
|
159
|
+
const location = args.location ?? '-';
|
|
159
160
|
const netAppClient = NetAppClientFactory.createClient();
|
|
160
161
|
const parent = `projects/${projectId}/locations/${location}`;
|
|
161
162
|
const request = { parent };
|
|
@@ -171,7 +171,8 @@ export const cancelOperationHandler = async (args) => {
|
|
|
171
171
|
// List Operations Handler
|
|
172
172
|
export const listOperationsHandler = async (args) => {
|
|
173
173
|
try {
|
|
174
|
-
const { projectId,
|
|
174
|
+
const { projectId, filter, pageSize, pageToken } = args;
|
|
175
|
+
const location = args.location ?? '-';
|
|
175
176
|
// Create a new NetApp client using the factory
|
|
176
177
|
const netAppClient = NetAppClientFactory.createClient();
|
|
177
178
|
// Make a direct API call using the client's auth credentials
|
|
@@ -184,7 +185,7 @@ export const listOperationsHandler = async (args) => {
|
|
|
184
185
|
params.pageSize = pageSize;
|
|
185
186
|
if (pageToken)
|
|
186
187
|
params.pageToken = pageToken;
|
|
187
|
-
// Make the API request
|
|
188
|
+
// Make the API request (use "-" for all locations)
|
|
188
189
|
const response = await axios.request({
|
|
189
190
|
url: `https://netapp.googleapis.com/v1/projects/${projectId}/locations/${location}/operations`,
|
|
190
191
|
method: 'GET',
|
|
@@ -268,7 +268,8 @@ export const getQuotaRuleHandler = async (args) => {
|
|
|
268
268
|
// List Quota Rules Handler
|
|
269
269
|
export const listQuotaRulesHandler = async (args) => {
|
|
270
270
|
try {
|
|
271
|
-
const { projectId,
|
|
271
|
+
const { projectId, volumeId, filter, pageSize, pageToken, orderBy } = args;
|
|
272
|
+
const location = args.location ?? '-';
|
|
272
273
|
const errors = validatePathArgs({ projectId, location, volumeId }, false);
|
|
273
274
|
const { value: parsedPageSize, error: pageSizeError } = parseOptionalNumber(pageSize, 'pageSize');
|
|
274
275
|
if (pageSizeError)
|
|
@@ -186,10 +186,11 @@ export const getReplicationHandler = async (args) => {
|
|
|
186
186
|
// List Replications Handler
|
|
187
187
|
export const listReplicationsHandler = async (args) => {
|
|
188
188
|
try {
|
|
189
|
-
const { projectId,
|
|
189
|
+
const { projectId, volumeId, filter, pageSize, pageToken } = args;
|
|
190
|
+
const location = args.location ?? '-';
|
|
190
191
|
// Create a new NetApp client using the factory
|
|
191
192
|
const netAppClient = NetAppClientFactory.createClient();
|
|
192
|
-
// Format the parent path
|
|
193
|
+
// Format the parent path (use "-" for all locations)
|
|
193
194
|
const parent = `projects/${projectId}/locations/${location}/volumes/${volumeId}`;
|
|
194
195
|
// Create the list request
|
|
195
196
|
const request = { parent };
|
|
@@ -163,10 +163,11 @@ export const getSnapshotHandler = async (args) => {
|
|
|
163
163
|
// List Snapshots Handler
|
|
164
164
|
export const listSnapshotsHandler = async (args) => {
|
|
165
165
|
try {
|
|
166
|
-
const { projectId,
|
|
166
|
+
const { projectId, volumeId, filter, pageSize, pageToken } = args;
|
|
167
|
+
const location = args.location ?? '-';
|
|
167
168
|
// Create a new NetApp client using the factory
|
|
168
169
|
const netAppClient = NetAppClientFactory.createClient();
|
|
169
|
-
// Format the parent path
|
|
170
|
+
// Format the parent path (use "-" for all locations)
|
|
170
171
|
const parent = `projects/${projectId}/locations/${location}/volumes/${volumeId}`;
|
|
171
172
|
// Create the request object
|
|
172
173
|
const request = { parent };
|
|
@@ -304,10 +304,11 @@ export const getStoragePoolHandler = async (args) => {
|
|
|
304
304
|
// List Storage Pools Handler
|
|
305
305
|
export const listStoragePoolsHandler = async (args) => {
|
|
306
306
|
try {
|
|
307
|
-
const { projectId,
|
|
307
|
+
const { projectId, filter, pageSize, pageToken } = args;
|
|
308
|
+
const location = args.location ?? '-';
|
|
308
309
|
// Create a new NetApp client using the factory
|
|
309
310
|
const netAppClient = NetAppClientFactory.createClient();
|
|
310
|
-
// Format the parent path for listing storage pools
|
|
311
|
+
// Format the parent path for listing storage pools (use "-" for all locations)
|
|
311
312
|
const parent = `projects/${projectId}/locations/${location}`;
|
|
312
313
|
// Call the API to list storage pools
|
|
313
314
|
const [storagePools, , paginated_response] = await netAppClient.listStoragePools({
|
|
@@ -430,10 +430,11 @@ export const getVolumeHandler = async (args) => {
|
|
|
430
430
|
// List Volumes Handler
|
|
431
431
|
export const listVolumesHandler = async (args) => {
|
|
432
432
|
try {
|
|
433
|
-
const { projectId,
|
|
433
|
+
const { projectId, filter, pageSize, pageToken } = args;
|
|
434
|
+
const location = args.location ?? '-';
|
|
434
435
|
// Create a new NetApp client using the factory
|
|
435
436
|
const netAppClient = NetAppClientFactory.createClient();
|
|
436
|
-
// Format the parent path
|
|
437
|
+
// Format the parent path (use "-" for all locations)
|
|
437
438
|
const parent = `projects/${projectId}/locations/${location}`;
|
|
438
439
|
// Create the request object
|
|
439
440
|
const request = { parent };
|
|
@@ -25,10 +25,13 @@ export const getHostGroupTool = {
|
|
|
25
25
|
export const listHostGroupsTool = {
|
|
26
26
|
name: 'gcnv_host_group_list',
|
|
27
27
|
title: 'List Host Groups',
|
|
28
|
-
description: 'Lists host groups in a specific location',
|
|
28
|
+
description: 'Lists host groups in a specific location (omit location for all locations)',
|
|
29
29
|
inputSchema: {
|
|
30
30
|
projectId: z.string().describe('The ID of the Google Cloud project'),
|
|
31
|
-
location: z
|
|
31
|
+
location: z
|
|
32
|
+
.string()
|
|
33
|
+
.optional()
|
|
34
|
+
.describe('The location to list host groups from; omit or use "-" for all locations'),
|
|
32
35
|
filter: z.string().optional().describe('Filter expression for filtering results'),
|
|
33
36
|
orderBy: z.string().optional().describe('Order by expression'),
|
|
34
37
|
pageSize: z.number().optional().describe('Maximum number of host groups to return per page'),
|
|
@@ -71,10 +71,13 @@ export const getKmsConfigTool = {
|
|
|
71
71
|
export const listKmsConfigsTool = {
|
|
72
72
|
name: 'gcnv_kms_config_list',
|
|
73
73
|
title: 'List KMS Configs',
|
|
74
|
-
description: 'Lists all KMS configurations in the specified location',
|
|
74
|
+
description: 'Lists all KMS configurations in the specified location (omit location for all locations)',
|
|
75
75
|
inputSchema: {
|
|
76
76
|
projectId: z.string().describe('The ID of the Google Cloud project'),
|
|
77
|
-
location: z
|
|
77
|
+
location: z
|
|
78
|
+
.string()
|
|
79
|
+
.optional()
|
|
80
|
+
.describe('The location to list KMS configs from; omit or use "-" for all locations'),
|
|
78
81
|
filter: z.string().optional().describe('Filter expression'),
|
|
79
82
|
pageSize: z.number().optional().describe('Maximum number of items to return'),
|
|
80
83
|
pageToken: z.string().optional().describe('Page token from previous request'),
|
|
@@ -39,10 +39,13 @@ export const cancelOperationTool = {
|
|
|
39
39
|
export const listOperationsTool = {
|
|
40
40
|
name: 'gcnv_operation_list',
|
|
41
41
|
title: 'List Operations',
|
|
42
|
-
description: 'Lists all active long-running operations in the project',
|
|
42
|
+
description: 'Lists all active long-running operations in the project (omit location for all locations)',
|
|
43
43
|
inputSchema: {
|
|
44
44
|
projectId: z.string().describe('The ID of the Google Cloud project'),
|
|
45
|
-
location: z
|
|
45
|
+
location: z
|
|
46
|
+
.string()
|
|
47
|
+
.optional()
|
|
48
|
+
.describe('The location to list operations from; omit or use "-" for all locations'),
|
|
46
49
|
filter: z.string().optional().describe('Filter expression for operations'),
|
|
47
50
|
pageSize: z.number().optional().describe('The maximum number of operations to return'),
|
|
48
51
|
pageToken: z.string().optional().describe('Page token from a previous list request'),
|
|
@@ -90,10 +90,13 @@ export const getQuotaRuleTool = {
|
|
|
90
90
|
export const listQuotaRulesTool = {
|
|
91
91
|
name: 'gcnv_quota_rule_list',
|
|
92
92
|
title: 'List Quota Rules',
|
|
93
|
-
description: 'Lists all quota rules for a volume',
|
|
93
|
+
description: 'Lists all quota rules for a volume (omit location for all locations)',
|
|
94
94
|
inputSchema: {
|
|
95
95
|
projectId: z.string().describe('The ID of the Google Cloud project'),
|
|
96
|
-
location: z
|
|
96
|
+
location: z
|
|
97
|
+
.string()
|
|
98
|
+
.optional()
|
|
99
|
+
.describe('The location of the volume; omit or use "-" for all locations'),
|
|
97
100
|
volumeId: z.string().describe('The ID of the volume'),
|
|
98
101
|
filter: z.string().optional().describe('Filter expression'),
|
|
99
102
|
pageSize: z.number().optional().describe('Maximum number of items to return'),
|
|
@@ -71,10 +71,13 @@ export const getReplicationTool = {
|
|
|
71
71
|
export const listReplicationsTool = {
|
|
72
72
|
name: 'gcnv_replication_list',
|
|
73
73
|
title: 'List Replications',
|
|
74
|
-
description: 'Lists all replications in the specified location',
|
|
74
|
+
description: 'Lists all replications in the specified location (omit location for all locations)',
|
|
75
75
|
inputSchema: {
|
|
76
76
|
projectId: z.string().describe('The ID of the Google Cloud project'),
|
|
77
|
-
location: z
|
|
77
|
+
location: z
|
|
78
|
+
.string()
|
|
79
|
+
.optional()
|
|
80
|
+
.describe('The location to list replications from; omit or use "-" for all locations'),
|
|
78
81
|
volumeId: z.string().describe('The ID of the volume for which the replications are listed'),
|
|
79
82
|
filter: z.string().optional().describe('Filter expression for filtering results'),
|
|
80
83
|
pageSize: z.number().optional().describe('The maximum number of replications to return'),
|
|
@@ -60,10 +60,13 @@ export const getSnapshotTool = {
|
|
|
60
60
|
export const listSnapshotsTool = {
|
|
61
61
|
name: 'gcnv_snapshot_list',
|
|
62
62
|
title: 'List Snapshots',
|
|
63
|
-
description: 'Lists all snapshots for a specified volume',
|
|
63
|
+
description: 'Lists all snapshots for a specified volume (omit location for all locations)',
|
|
64
64
|
inputSchema: {
|
|
65
65
|
projectId: z.string().describe('The ID of the Google Cloud project'),
|
|
66
|
-
location: z
|
|
66
|
+
location: z
|
|
67
|
+
.string()
|
|
68
|
+
.optional()
|
|
69
|
+
.describe('The location of the volume; omit or use "-" for all locations'),
|
|
67
70
|
volumeId: z.string().describe('The ID of the volume to list snapshots from'),
|
|
68
71
|
filter: z.string().optional().describe('Filter expression for filtering results'),
|
|
69
72
|
pageSize: z.number().optional().describe('The maximum number of snapshots to return'),
|
|
@@ -149,10 +149,13 @@ export const getStoragePoolTool = {
|
|
|
149
149
|
export const listStoragePoolsTool = {
|
|
150
150
|
name: 'gcnv_storage_pool_list',
|
|
151
151
|
title: 'List Storage Pools',
|
|
152
|
-
description: 'Lists all storage pools in the specified project and location',
|
|
152
|
+
description: 'Lists all storage pools in the specified project and location (omit location for all locations)',
|
|
153
153
|
inputSchema: {
|
|
154
154
|
projectId: z.string().describe('The ID of the Google Cloud project'),
|
|
155
|
-
location: z
|
|
155
|
+
location: z
|
|
156
|
+
.string()
|
|
157
|
+
.optional()
|
|
158
|
+
.describe('The location to list storage pools from; omit or use "-" for all locations'),
|
|
156
159
|
filter: z.string().optional().describe('Filter expression for filtering results'),
|
|
157
160
|
pageSize: z.number().optional().describe('The maximum number of storage pools to return'),
|
|
158
161
|
pageToken: z.string().optional().describe('Page token from a previous list request'),
|
|
@@ -323,10 +323,13 @@ export const getVolumeTool = {
|
|
|
323
323
|
export const listVolumesTool = {
|
|
324
324
|
name: 'gcnv_volume_list',
|
|
325
325
|
title: 'List Volumes',
|
|
326
|
-
description: 'Lists all volumes in the specified storage pool',
|
|
326
|
+
description: 'Lists all volumes in the specified storage pool (omit location for all locations)',
|
|
327
327
|
inputSchema: {
|
|
328
328
|
projectId: z.string().describe('The ID of the Google Cloud project'),
|
|
329
|
-
location: z
|
|
329
|
+
location: z
|
|
330
|
+
.string()
|
|
331
|
+
.optional()
|
|
332
|
+
.describe('The location to list volumes from; omit or use "-" for all locations'),
|
|
330
333
|
filter: z.string().optional().describe('Filter expression for filtering results'),
|
|
331
334
|
pageSize: z.number().optional().describe('The maximum number of volumes to return'),
|
|
332
335
|
pageToken: z.string().optional().describe('Page token from a previous list request'),
|
package/gemini-extension.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gcnv/gcnv-mcp-server",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.6",
|
|
4
4
|
"description": "Google Cloud NetApp Volumes MCP Server - A Model Context Protocol server for managing GCNV Backup, StoragePool, Volume and Replication resources",
|
|
5
5
|
"main": "build/index.js",
|
|
6
6
|
"bin": {
|