@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 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
- - For most tools, `location` is a **region** (e.g., `us-central1`).
38
- - For **FLEX storage pool creation**, `location` may be a **zone** (e.g., `us-central1-a`) to satisfy zone in location”.
39
- - If FLEX pool creation uses a regional `location`, the user must provide `zone` and `replicaZone`.
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.string().describe('The location to list active directories from'),
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.string().describe('The location to list backup policies from'),
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.string().describe('The location to list backups from'),
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.string().describe('The location to list backup vaults from'),
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, location, filter, pageSize, pageToken } = args;
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, location, backupVaultId, filter, pageSize, pageToken } = args;
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, location, filter, pageSize, pageToken } = args;
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, location, filter, pageSize, pageToken } = args;
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, location, filter, orderBy, pageSize, pageToken } = args;
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, location, filter, pageSize, pageToken, orderBy } = args;
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, location, filter, pageSize, pageToken } = args;
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, location, volumeId, filter, pageSize, pageToken, orderBy } = args;
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, location, volumeId, filter, pageSize, pageToken } = args;
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, location, volumeId, filter, pageSize, pageToken } = args;
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, location, filter, pageSize, pageToken } = args;
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, location, filter, pageSize, pageToken } = args;
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.string().describe('The location to list host groups from (use "-" for all)'),
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.string().describe('The location to list KMS configs from'),
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.string().describe('The location to list operations from'),
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.string().describe('The location of the volume'),
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.string().describe('The location to list replications from'),
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.string().describe('The location of the volume'),
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.string().describe('The location to list storage pools from'),
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.string().describe('The location to list volumes from'),
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'),
@@ -1,5 +1,5 @@
1
1
  {
2
- "name": "gcnv-mcp",
2
+ "name": "gcnv-mcp-server",
3
3
  "version": "1.0.0",
4
4
  "contextFileName": "GEMINI.md",
5
5
  "mcpServers": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gcnv/gcnv-mcp-server",
3
- "version": "1.1.5",
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": {