firebase-tools 14.11.1 → 14.11.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.
Files changed (58) hide show
  1. package/lib/apptesting/ensureProjectConfigured.js +4 -3
  2. package/lib/commands/ext-export.js +1 -1
  3. package/lib/commands/login.js +2 -2
  4. package/lib/deploy/functions/params.js +4 -0
  5. package/lib/mcp/errors.js +7 -1
  6. package/lib/mcp/index.js +46 -45
  7. package/lib/mcp/tools/apphosting/fetch_logs.js +22 -22
  8. package/lib/mcp/tools/apphosting/list_backends.js +10 -10
  9. package/lib/mcp/tools/auth/disable_user.js +7 -7
  10. package/lib/mcp/tools/auth/get_user.js +6 -6
  11. package/lib/mcp/tools/auth/index.js +10 -10
  12. package/lib/mcp/tools/auth/list_users.js +6 -6
  13. package/lib/mcp/tools/auth/set_claims.js +7 -7
  14. package/lib/mcp/tools/auth/set_sms_region_policy.js +6 -6
  15. package/lib/mcp/tools/core/consult_assistant.js +6 -6
  16. package/lib/mcp/tools/core/create_android_sha.js +9 -9
  17. package/lib/mcp/tools/core/create_app.js +7 -7
  18. package/lib/mcp/tools/core/create_project.js +13 -13
  19. package/lib/mcp/tools/core/get_admin_sdk_config.js +7 -7
  20. package/lib/mcp/tools/core/get_environment.js +8 -8
  21. package/lib/mcp/tools/core/get_project.js +5 -5
  22. package/lib/mcp/tools/core/get_sdk_config.js +9 -9
  23. package/lib/mcp/tools/core/index.js +24 -24
  24. package/lib/mcp/tools/core/init.js +8 -8
  25. package/lib/mcp/tools/core/list_apps.js +6 -6
  26. package/lib/mcp/tools/core/list_projects.js +6 -6
  27. package/lib/mcp/tools/core/update_environment.js +10 -10
  28. package/lib/mcp/tools/crashlytics/index.js +2 -2
  29. package/lib/mcp/tools/crashlytics/list_top_issues.js +6 -6
  30. package/lib/mcp/tools/dataconnect/emulator.js +6 -6
  31. package/lib/mcp/tools/dataconnect/execute_graphql.js +10 -10
  32. package/lib/mcp/tools/dataconnect/execute_graphql_read.js +10 -10
  33. package/lib/mcp/tools/dataconnect/execute_mutation.js +13 -13
  34. package/lib/mcp/tools/dataconnect/execute_query.js +13 -13
  35. package/lib/mcp/tools/dataconnect/generate_operation.js +8 -8
  36. package/lib/mcp/tools/dataconnect/generate_schema.js +6 -6
  37. package/lib/mcp/tools/dataconnect/get_connector.js +8 -8
  38. package/lib/mcp/tools/dataconnect/get_schema.js +8 -8
  39. package/lib/mcp/tools/dataconnect/index.js +18 -18
  40. package/lib/mcp/tools/dataconnect/list_services.js +5 -5
  41. package/lib/mcp/tools/firestore/delete_document.js +13 -13
  42. package/lib/mcp/tools/firestore/get_documents.js +13 -13
  43. package/lib/mcp/tools/firestore/list_collections.js +9 -9
  44. package/lib/mcp/tools/firestore/query_collection.js +13 -13
  45. package/lib/mcp/tools/index.js +18 -18
  46. package/lib/mcp/tools/messaging/index.js +2 -2
  47. package/lib/mcp/tools/messaging/send_message.js +7 -7
  48. package/lib/mcp/tools/remoteconfig/get_template.js +5 -5
  49. package/lib/mcp/tools/remoteconfig/index.js +4 -4
  50. package/lib/mcp/tools/remoteconfig/publish_template.js +7 -7
  51. package/lib/mcp/tools/remoteconfig/rollback_template.js +6 -6
  52. package/lib/mcp/tools/rules/get_rules.js +8 -8
  53. package/lib/mcp/tools/rules/validate_rules.js +10 -10
  54. package/lib/mcp/tools/storage/get_download_url.js +8 -8
  55. package/lib/mcp/tools/storage/get_rules.js +8 -8
  56. package/package.json +1 -1
  57. package/templates/init/dataconnect/mutations.gql +1 -1
  58. package/templates/init/dataconnect/queries.gql +3 -3
@@ -2,11 +2,11 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getRulesTool = void 0;
4
4
  const zod_1 = require("zod");
5
- const tool_js_1 = require("../../tool.js");
6
- const util_js_1 = require("../../util.js");
7
- const rules_js_1 = require("../../../gcp/rules.js");
5
+ const tool_1 = require("../../tool");
6
+ const util_1 = require("../../util");
7
+ const rules_1 = require("../../../gcp/rules");
8
8
  function getRulesTool(productName, releaseName) {
9
- return (0, tool_js_1.tool)({
9
+ return (0, tool_1.tool)({
10
10
  name: "get_rules",
11
11
  description: `Retrieves the active ${productName} security rules for the current project.`,
12
12
  inputSchema: zod_1.z.object({}),
@@ -19,11 +19,11 @@ function getRulesTool(productName, releaseName) {
19
19
  requiresAuth: true,
20
20
  },
21
21
  }, async (_, { projectId }) => {
22
- const rulesetName = await (0, rules_js_1.getLatestRulesetName)(projectId, releaseName);
22
+ const rulesetName = await (0, rules_1.getLatestRulesetName)(projectId, releaseName);
23
23
  if (!rulesetName)
24
- return (0, util_js_1.mcpError)(`No active Firestore rules were found in project '${projectId}'`);
25
- const rules = await (0, rules_js_1.getRulesetContent)(rulesetName);
26
- return (0, util_js_1.toContent)(rules[0].content);
24
+ return (0, util_1.mcpError)(`No active Firestore rules were found in project '${projectId}'`);
25
+ const rules = await (0, rules_1.getRulesetContent)(rulesetName);
26
+ return (0, util_1.toContent)(rules[0].content);
27
27
  });
28
28
  }
29
29
  exports.getRulesTool = getRulesTool;
@@ -2,9 +2,9 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.validateRulesTool = void 0;
4
4
  const zod_1 = require("zod");
5
- const tool_js_1 = require("../../tool.js");
6
- const util_js_1 = require("../../util.js");
7
- const rules_js_1 = require("../../../gcp/rules.js");
5
+ const tool_1 = require("../../tool");
6
+ const util_1 = require("../../util");
7
+ const rules_1 = require("../../../gcp/rules");
8
8
  const path_1 = require("path");
9
9
  function formatRulesetIssues(issues, rulesSource) {
10
10
  const sourceLines = rulesSource.split("\n");
@@ -39,7 +39,7 @@ function formatRulesetIssues(issues, rulesSource) {
39
39
  return formattedOutput.join("\n\n");
40
40
  }
41
41
  function validateRulesTool(productName) {
42
- return (0, tool_js_1.tool)({
42
+ return (0, tool_1.tool)({
43
43
  name: "validate_rules",
44
44
  description: `Checks the provided ${productName} Rules source for syntax and validation errors. Provide EITHER the source code to validate OR a path to a source file.`,
45
45
  inputSchema: zod_1.z.object({
@@ -63,18 +63,18 @@ function validateRulesTool(productName) {
63
63
  }, async ({ source, source_file }, { projectId, config, host }) => {
64
64
  var _a, _b;
65
65
  if (source && source_file) {
66
- return (0, util_js_1.mcpError)("Must supply `source` or `source_file`, not both.");
66
+ return (0, util_1.mcpError)("Must supply `source` or `source_file`, not both.");
67
67
  }
68
68
  let rulesSourceContent;
69
69
  if (source_file) {
70
70
  try {
71
71
  const filePath = (0, path_1.resolve)(source_file, host.cachedProjectRoot);
72
72
  if (filePath.includes("../"))
73
- return (0, util_js_1.mcpError)("Cannot read files outside of the project directory.");
73
+ return (0, util_1.mcpError)("Cannot read files outside of the project directory.");
74
74
  rulesSourceContent = config.readProjectFile(source_file);
75
75
  }
76
76
  catch (e) {
77
- return (0, util_js_1.mcpError)(`Failed to read source_file '${source_file}': ${e.message}`);
77
+ return (0, util_1.mcpError)(`Failed to read source_file '${source_file}': ${e.message}`);
78
78
  }
79
79
  }
80
80
  else if (source) {
@@ -83,16 +83,16 @@ function validateRulesTool(productName) {
83
83
  else {
84
84
  rulesSourceContent = "";
85
85
  }
86
- const result = await (0, rules_js_1.testRuleset)(projectId, [
86
+ const result = await (0, rules_1.testRuleset)(projectId, [
87
87
  { name: "test.rules", content: rulesSourceContent },
88
88
  ]);
89
89
  if ((_b = (_a = result.body) === null || _a === void 0 ? void 0 : _a.issues) === null || _b === void 0 ? void 0 : _b.length) {
90
90
  const issues = result.body.issues;
91
91
  let out = `Found ${issues.length} issues in rules source:\n\n`;
92
92
  out += formatRulesetIssues(issues, rulesSourceContent);
93
- return (0, util_js_1.toContent)(out);
93
+ return (0, util_1.toContent)(out);
94
94
  }
95
- return (0, util_js_1.toContent)("OK: No errors detected.");
95
+ return (0, util_1.toContent)("OK: No errors detected.");
96
96
  });
97
97
  }
98
98
  exports.validateRulesTool = validateRulesTool;
@@ -2,11 +2,11 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.get_object_download_url = void 0;
4
4
  const zod_1 = require("zod");
5
- const tool_js_1 = require("../../tool.js");
6
- const util_js_1 = require("../../util.js");
7
- const storage_js_1 = require("../../../gcp/storage.js");
8
- const types_js_1 = require("../../../emulator/types.js");
9
- exports.get_object_download_url = (0, tool_js_1.tool)({
5
+ const tool_1 = require("../../tool");
6
+ const util_1 = require("../../util");
7
+ const storage_1 = require("../../../gcp/storage");
8
+ const types_1 = require("../../../emulator/types");
9
+ exports.get_object_download_url = (0, tool_1.tool)({
10
10
  name: "get_object_download_url",
11
11
  description: "Retrieves the download URL for an object in Firebase Storage.",
12
12
  inputSchema: zod_1.z.object({
@@ -33,8 +33,8 @@ exports.get_object_download_url = (0, tool_js_1.tool)({
33
33
  }
34
34
  let emulatorUrl;
35
35
  if (use_emulator) {
36
- emulatorUrl = await host.getEmulatorUrl(types_js_1.Emulators.STORAGE);
36
+ emulatorUrl = await host.getEmulatorUrl(types_1.Emulators.STORAGE);
37
37
  }
38
- const downloadUrl = await (0, storage_js_1.getDownloadUrl)(bucket, object_path, emulatorUrl);
39
- return (0, util_js_1.toContent)(downloadUrl);
38
+ const downloadUrl = await (0, storage_1.getDownloadUrl)(bucket, object_path, emulatorUrl);
39
+ return (0, util_1.toContent)(downloadUrl);
40
40
  });
@@ -2,10 +2,10 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.get_rules = void 0;
4
4
  const zod_1 = require("zod");
5
- const tool_js_1 = require("../../tool.js");
6
- const util_js_1 = require("../../util.js");
7
- const rules_js_1 = require("../../../gcp/rules.js");
8
- exports.get_rules = (0, tool_js_1.tool)({
5
+ const tool_1 = require("../../tool");
6
+ const util_1 = require("../../util");
7
+ const rules_1 = require("../../../gcp/rules");
8
+ exports.get_rules = (0, tool_1.tool)({
9
9
  name: "get_rules",
10
10
  description: "Retrieves the Firebase Cloud Storage Rules for the default bucket.",
11
11
  inputSchema: zod_1.z.object({}),
@@ -18,9 +18,9 @@ exports.get_rules = (0, tool_js_1.tool)({
18
18
  requiresAuth: true,
19
19
  },
20
20
  }, async (_, { projectId }) => {
21
- const rulesetName = await (0, rules_js_1.getLatestRulesetName)(projectId, "firebase.storage");
21
+ const rulesetName = await (0, rules_1.getLatestRulesetName)(projectId, "firebase.storage");
22
22
  if (!rulesetName)
23
- return (0, util_js_1.mcpError)(`No active Firebase Storage rules were found in project '${projectId}'`);
24
- const rules = await (0, rules_js_1.getRulesetContent)(rulesetName);
25
- return (0, util_js_1.toContent)(rules[0].content);
23
+ return (0, util_1.mcpError)(`No active Firebase Storage rules were found in project '${projectId}'`);
24
+ const rules = await (0, rules_1.getRulesetContent)(rulesetName);
25
+ return (0, util_1.toContent)(rules[0].content);
26
26
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "firebase-tools",
3
- "version": "14.11.1",
3
+ "version": "14.11.2",
4
4
  "description": "Command-Line Interface for Firebase",
5
5
  "main": "./lib/index.js",
6
6
  "bin": {
@@ -2,7 +2,7 @@
2
2
 
3
3
  # # Create a movie based on user input
4
4
  # mutation CreateMovie($title: String!, $genre: String!, $imageUrl: String!)
5
- # @auth(level: USER_EMAIL_VERIFIED) {
5
+ # @auth(level: USER_EMAIL_VERIFIED, insecureReason: "Any email verified users can create a new movie.") {
6
6
  # movie_insert(data: { title: $title, genre: $genre, imageUrl: $imageUrl })
7
7
  # }
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  # # @auth() directives control who can call each operation.
4
4
  # # Anyone should be able to list all movies, so the auth level is set to PUBLIC
5
- # query ListMovies @auth(level: PUBLIC) {
5
+ # query ListMovies @auth(level: PUBLIC, insecureReason: "Anyone can list all movies.") {
6
6
  # movies {
7
7
  # id
8
8
  # title
@@ -40,7 +40,7 @@
40
40
  # }
41
41
 
42
42
  # # Get movie by id
43
- # query GetMovieById($id: UUID!) @auth(level: PUBLIC) {
43
+ # query GetMovieById($id: UUID!) @auth(level: PUBLIC, insecureReason: "Anyone can get a movie by id.") {
44
44
  # movie(id: $id) {
45
45
  # id
46
46
  # title
@@ -64,7 +64,7 @@
64
64
  # }
65
65
 
66
66
  # # Search for movies, actors, and reviews
67
- # query SearchMovie($titleInput: String, $genre: String) @auth(level: PUBLIC) {
67
+ # query SearchMovie($titleInput: String, $genre: String) @auth(level: PUBLIC, insecureReason: "Anyone can search for movies.") {
68
68
  # movies(
69
69
  # where: {
70
70
  # _and: [{ genre: { eq: $genre } }, { title: { contains: $titleInput } }]