@zenuml/core 3.46.4 → 3.46.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.
Files changed (71) hide show
  1. package/.claude/skills/babysit-pr/SKILL.md +203 -0
  2. package/.claude/skills/babysit-pr/agents/openai.yaml +7 -0
  3. package/.claude/skills/dia-scoring/SKILL.md +1 -1
  4. package/.claude/skills/propagate-core-release/SKILL.md +200 -0
  5. package/.claude/skills/propagate-core-release/agents/openai.yaml +7 -0
  6. package/.claude/skills/propagate-core-release/references/downstreams.md +41 -0
  7. package/.claude/skills/ship-branch/SKILL.md +13 -2
  8. package/dist/stats.html +1 -1
  9. package/dist/zenuml.esm.mjs +3 -3
  10. package/dist/zenuml.js +3 -3
  11. package/docs/superpowers/plans/2026-03-27-e2e-test-reorg.md +698 -0
  12. package/{cy → e2e/data}/compare-cases.js +70 -37
  13. package/{cy/smoke-editable-label.html → e2e/fixtures/editable-label.html} +1 -1
  14. package/{cy/editable-span-test.html → e2e/fixtures/editable-span.html} +1 -1
  15. package/e2e/fixtures/fixture.html +31 -0
  16. package/{cy → e2e/tools}/canonical-history.html +1 -1
  17. package/{cy → e2e/tools}/compare-case.html +3 -3
  18. package/{cy → e2e/tools}/compare.html +2 -2
  19. package/{cy → e2e/tools}/native-diff-ext/content.js +2 -2
  20. package/firebase-debug.log +108 -0
  21. package/index.html +2 -2
  22. package/mermaid-zenuml-async-spa-auth.png +0 -0
  23. package/mermaid-zenuml-async-spa-auth.snapshot.md +96 -0
  24. package/package.json +1 -1
  25. package/scripts/analyze-compare-case/collect-data.mjs +1 -1
  26. package/scripts/analyze-compare-case.mjs +1 -1
  27. package/skills/dia-scoring/SKILL.md +1 -1
  28. package/vite.config.ts +5 -5
  29. package/cy/async-message-1.html +0 -32
  30. package/cy/async-message-2.html +0 -46
  31. package/cy/async-message-3.html +0 -41
  32. package/cy/creation-rtl.html +0 -28
  33. package/cy/defect-406-alt-under-creation.html +0 -40
  34. package/cy/demo1.html +0 -28
  35. package/cy/demo3.html +0 -28
  36. package/cy/demo4.html +0 -28
  37. package/cy/element-report.html +0 -705
  38. package/cy/fragments-with-return.html +0 -35
  39. package/cy/icons-test.html +0 -29
  40. package/cy/if-fragment.html +0 -28
  41. package/cy/legacy-vs-html.html +0 -291
  42. package/cy/named-parameters.html +0 -30
  43. package/cy/nested-interaction-with-fragment.html +0 -34
  44. package/cy/nested-interaction-with-outbound.html +0 -34
  45. package/cy/parity-test.html +0 -122
  46. package/cy/return-in-nested-if.html +0 -29
  47. package/cy/return.html +0 -38
  48. package/cy/self-sync-message-at-root.html +0 -28
  49. package/cy/smoke-creation.html +0 -26
  50. package/cy/smoke-fragment-issue.html +0 -36
  51. package/cy/smoke-fragment.html +0 -42
  52. package/cy/smoke-interaction.html +0 -34
  53. package/cy/smoke.html +0 -40
  54. package/cy/theme-default-test.html +0 -28
  55. package/cy/vertical-1.html +0 -25
  56. package/cy/vertical-10.html +0 -33
  57. package/cy/vertical-11.html +0 -29
  58. package/cy/vertical-2.html +0 -23
  59. package/cy/vertical-3.html +0 -37
  60. package/cy/vertical-4.html +0 -42
  61. package/cy/vertical-5.html +0 -40
  62. package/cy/vertical-6.html +0 -29
  63. package/cy/vertical-7.html +0 -27
  64. package/cy/vertical-8.html +0 -32
  65. package/cy/vertical-9.html +0 -25
  66. package/cy/xss.html +0 -21
  67. /package/{cy → e2e/data}/diff-algorithm.js +0 -0
  68. /package/{cy → e2e/fixtures}/svg-test.html +0 -0
  69. /package/{cy → e2e/tools}/native-diff-ext/background.js +0 -0
  70. /package/{cy → e2e/tools}/native-diff-ext/bridge.js +0 -0
  71. /package/{cy → e2e/tools}/svg-preview.html +0 -0
@@ -10,8 +10,13 @@ export const CASES = {
10
10
  B -> C: process
11
11
  C -> B: result
12
12
  B -> A: done`,
13
- "named-params": `A.method(userId=123, name="John")
14
- B.create(type="User", active=true)`,
13
+ "named-params": `title Named Parameters Test
14
+ // Testing named parameter syntax (param=value)
15
+ A.method(userId=123, name="John")
16
+ B.create(type="User", active=true)
17
+ C.mixedCall(1, name="Mixed", enabled=false)
18
+ D.oldStyle(1, 2, 3)
19
+ E.complex(first="value1", second=42, third=true, fourth="final")`,
15
20
 
16
21
  // --- Sync calls & self-calls ---
17
22
  "nested-sync": `A.method() {
@@ -40,7 +45,7 @@ A.method1{
40
45
  }
41
46
  }
42
47
  }`,
43
- "nested-fragment": `title Nested Interaction
48
+ "nested-fragment": `title Nested Interaction with Fragment and Self-Invocation
44
49
  A.Read() {
45
50
  B.Submit() {
46
51
  Process() {
@@ -52,7 +57,7 @@ A.Read() {
52
57
  }
53
58
  }
54
59
  }`,
55
- "nested-outbound": `title Nested Interaction with Outbound
60
+ "nested-outbound": `title Nested Interaction with Outbound Message and Fragment
56
61
  A.Read() {
57
62
  B.Submit() {
58
63
  C->B.method {
@@ -73,40 +78,54 @@ A.Read() {
73
78
  "participant-width": `LongParticipantName.method`,
74
79
 
75
80
  // --- Async messages ---
76
- "async-1": `A->A: selfA
77
- A->B: aToB
78
- A->C: aToC
79
- B->B: selfB
80
- B->C: bToC
81
- B->A: bToA
82
- C->C: selfC
83
- C->B: cToB
84
- C->A: cToA`,
85
- "async-2a": `A.method {
86
- A->A: selfPing
87
- A->B: send
88
- A->C: broadcast
89
- B->B: selfCheck
90
- B->C: forward
91
- B->A: reply
92
- C->C: selfLog
93
- C->B: respond
94
- C->A: callback
95
- }`,
96
- "async-2b": `A.method {
97
- A->B: init
81
+ "async-1": `A->A: async
82
+ A->B: async
83
+ A->C: async
84
+ B->B: async
85
+ B->C: async
86
+ B->A: async
87
+ C->C: async
88
+ C->B: async
89
+ C->A: async`,
90
+ "async-2": `A.method {
91
+ A->A: async
92
+ A->B: async
93
+ A->C: async
94
+ B->B: async
95
+ B->C: async
96
+ B->A: async
97
+ C->C: async
98
+ C->B: async
99
+ C->A: async
98
100
  B.method {
99
- A->B: request
100
- B->C: delegate
101
- C->A: complete
101
+ A->A: async
102
+ A->B: async
103
+ A->C: async
104
+ B->B: async
105
+ B->C: async
106
+ B->A: async
107
+ C->C: async
108
+ C->B: async
109
+ C->A: async
102
110
  }
103
111
  }`,
104
112
  "async-3": `A B C
105
113
  C.method {
106
- A->C: notify
107
- C->A: respond
108
- C->B: forward
109
- B->C: ack
114
+ A->C: async
115
+ C->A: async
116
+ C->B: async
117
+ B->C: async
118
+ B.method {
119
+ A->A: async
120
+ A->B: async
121
+ A->C: async
122
+ B->B: async
123
+ B->C: async
124
+ B->A: async
125
+ C->C: async
126
+ C->B: async
127
+ C->A: async
128
+ }
110
129
  }`,
111
130
  "async-self": `A->A: selfAsync`,
112
131
  "async-self-nested": `A.method {
@@ -153,8 +172,9 @@ B->A: So what`,
153
172
  } else {
154
173
  A -> B: elseMsg
155
174
  }`,
156
- "if-fragment": `title Issue 232
175
+ "if-fragment": `title Issue 232 - wrong layout for if-fragment
157
176
  Client -> Server:SendRequest
177
+
158
178
  if(true){
159
179
  Server -> Server: processRequest
160
180
  }`,
@@ -173,7 +193,7 @@ loop(condition) {
173
193
  }`,
174
194
  "fragment": `A
175
195
  B
176
- C
196
+ C #FF0000 // we style it to make it more important in image comparison
177
197
  if(x) {
178
198
  loop(y) {
179
199
  try {
@@ -267,6 +287,7 @@ A.m1 {
267
287
 
268
288
  // --- Return ---
269
289
  "return": `A B C D
290
+
270
291
  A->B.method() {
271
292
  ret0_assign_rtl =C.method_long_to_give_space {
272
293
  @return C->D: ret1_annotation_ltr
@@ -275,8 +296,17 @@ A->B.method() {
275
296
  return ret2_return_ltr
276
297
  }
277
298
  }
299
+
278
300
  return ret2_return_rtl
279
301
  @return B->A: ret4_annotation_rtl
302
+ }`,
303
+ "return-in-nested-if": `A.m {
304
+ if (condition) {
305
+ return ret
306
+ if(x) {
307
+ new B
308
+ }
309
+ }
280
310
  }`,
281
311
  // Minimal return isolation cases
282
312
  "return-single-explicit": `A B
@@ -335,6 +365,7 @@ new B`,
335
365
  } else {
336
366
  new B
337
367
  }
368
+
338
369
  new C
339
370
  try {
340
371
  new D
@@ -350,6 +381,7 @@ try {
350
381
  } else {
351
382
  new B
352
383
  }
384
+
353
385
  new C
354
386
  try {
355
387
  new D
@@ -398,7 +430,7 @@ section(){
398
430
  "vertical-8": `new Creation() {
399
431
  return from_creation
400
432
  }
401
- return "back to caller"
433
+ return "from if to original source"
402
434
  try {
403
435
  new AHasAVeryLongNameLongNameLongNameLongName() {
404
436
  new CreatWithinCreat()
@@ -450,6 +482,7 @@ group "B C" {@EC2 B @ECS C}
450
482
  new B
451
483
  ReturnType ret = ParticipantName.methodA(a, b) {
452
484
  critical("This is a critical message") {
485
+ // Customised style for RESTFul API - \`POST /order\`
453
486
  ReturnType ret2 = selfCall() {
454
487
  B.syncCallWithinSelfCall() {
455
488
  ParticipantName.rightToLeftCall()
@@ -470,7 +503,7 @@ ReturnType ret = ParticipantName.methodA(a, b) {
470
503
  new Creation() {
471
504
  return from_creation
472
505
  }
473
- return "back to caller"
506
+ return "from if to original source"
474
507
  try {
475
508
  new AHasAVeryLongNameLongNameLongNameLongName() {
476
509
  new CreatWithinCreat()
@@ -29,6 +29,6 @@ C->D: Good to see you
29
29
  >
30
30
  </div>
31
31
  <!-- built files will be auto injected -->
32
- <script type="module" src="/src/main-cy.ts"></script>
32
+ <script type="module" src="/src/main-e2e.ts"></script>
33
33
  </body>
34
34
  </html>
@@ -70,7 +70,7 @@
70
70
  <script type="module">
71
71
  import { createRoot } from 'react-dom/client';
72
72
  import { createElement } from 'react';
73
- import { EditableSpan } from '../src/components/common/EditableSpan/EditableSpan';
73
+ import { EditableSpan } from '../../src/components/common/EditableSpan/EditableSpan';
74
74
 
75
75
  function createLogger(logId) {
76
76
  const logEl = document.getElementById(logId);
@@ -0,0 +1,31 @@
1
+ <!doctype html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta http-equiv="X-UA-Compatible" content="IE=edge" />
6
+ <meta name="viewport" content="width=device-width,initial-scale=1.0" />
7
+ <title>ZenUML Test Fixture</title>
8
+ <style>
9
+ body {
10
+ margin: 0;
11
+ }
12
+ </style>
13
+ </head>
14
+ <body>
15
+ <div id="diagram" class="diagram">
16
+ <pre class="zenuml" style="margin: 0" id="zenuml-code"></pre>
17
+ </div>
18
+ <script type="module">
19
+ import { CASES } from "../data/compare-cases.js";
20
+ const params = new URLSearchParams(window.location.search);
21
+ const caseName = params.get("case");
22
+ if (caseName && CASES[caseName]) {
23
+ document.getElementById("zenuml-code").textContent = CASES[caseName];
24
+ } else {
25
+ document.getElementById("zenuml-code").textContent =
26
+ "// Case not found: " + caseName;
27
+ }
28
+ </script>
29
+ <script type="module" src="/src/main-e2e.ts"></script>
30
+ </body>
31
+ </html>
@@ -345,7 +345,7 @@
345
345
  <button class="sidebar-toggle" id="sidebar-toggle" title="Toggle sidebar">&#9776;</button>
346
346
  <h1>canonical scores</h1>
347
347
  <span class="summary" id="summary"></span>
348
- <a href="/cy/compare.html" class="back-link">compare cases &rarr;</a>
348
+ <a href="/e2e/tools/compare.html" class="back-link">compare cases &rarr;</a>
349
349
  </div>
350
350
 
351
351
  <div class="layout">
@@ -32,7 +32,7 @@
32
32
  </head>
33
33
  <body>
34
34
  <div class="compare-bar">
35
- <a href="/cy/compare.html">&larr; All cases</a>
35
+ <a href="/e2e/tools/compare.html">&larr; All cases</a>
36
36
  <h2 id="case-name"></h2>
37
37
  <div class="nav">
38
38
  <a id="prev-link" href="#">&larr; Prev</a>
@@ -60,8 +60,8 @@
60
60
  import ZenUml from "/src/core.tsx";
61
61
  import { renderToSvg } from "/src/svg/renderToSvg.ts";
62
62
 
63
- import { CASES } from "./compare-cases.js";
64
- import { diffImages, DEFAULTS } from "./diff-algorithm.js";
63
+ import { CASES } from "../data/compare-cases.js";
64
+ import { diffImages, DEFAULTS } from "../data/diff-algorithm.js";
65
65
 
66
66
  const caseNames = Object.keys(CASES);
67
67
  const params = new URLSearchParams(window.location.search);
@@ -20,12 +20,12 @@
20
20
  <h1>SVG vs HTML Comparison</h1>
21
21
  <div class="grid" id="grid"></div>
22
22
  <script type="module">
23
- import { CASES } from "./compare-cases.js";
23
+ import { CASES } from "../data/compare-cases.js";
24
24
 
25
25
  const grid = document.getElementById("grid");
26
26
  for (const name of Object.keys(CASES)) {
27
27
  const a = document.createElement("a");
28
- a.href = `/cy/compare-case.html?case=${encodeURIComponent(name)}`;
28
+ a.href = `/e2e/tools/compare-case.html?case=${encodeURIComponent(name)}`;
29
29
  a.className = "card";
30
30
  a.innerHTML = `<div class="name">${name}</div>`;
31
31
  grid.appendChild(a);
@@ -2,7 +2,7 @@
2
2
  // Uses CDP element screenshots via bridge.js → background.js
3
3
  // Hides neighboring panels before each screenshot to prevent overlap.
4
4
  //
5
- // Diff algorithm lives in cy/diff-algorithm.js, loaded by compare-case.html
5
+ // Diff algorithm lives in e2e/data/diff-algorithm.js, loaded by compare-case.html
6
6
  // and exposed as window.diffFromImages. This script only handles screenshots
7
7
  // and orchestration.
8
8
 
@@ -107,7 +107,7 @@ async function runNativeDiff() {
107
107
  const idx = cases.indexOf(currentCase);
108
108
  if (idx >= 0 && idx + 1 < cases.length) {
109
109
  setTimeout(() => {
110
- window.location.href = `/cy/compare-case.html?case=${cases[idx + 1]}`;
110
+ window.location.href = `/e2e/tools/compare-case.html?case=${cases[idx + 1]}`;
111
111
  }, 200);
112
112
  }
113
113
  } else {
@@ -0,0 +1,108 @@
1
+ [debug] [2026-03-27T00:40:31.482Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
2
+ [debug] [2026-03-27T00:40:31.483Z] > authorizing via signed-in user (eagle.xiao@gmail.com)
3
+ [debug] [2026-03-27T00:40:31.491Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
4
+ [debug] [2026-03-27T00:40:31.491Z] > authorizing via signed-in user (eagle.xiao@gmail.com)
5
+ [debug] [2026-03-27T00:40:31.744Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
6
+ [debug] [2026-03-27T00:40:31.744Z] > authorizing via signed-in user (eagle.xiao@gmail.com)
7
+ [debug] [2026-03-27T00:40:31.745Z] >>> [apiv2][query] POST https://developerknowledge.googleapis.com/mcp [none]
8
+ [debug] [2026-03-27T00:40:31.745Z] >>> [apiv2][body] POST https://developerknowledge.googleapis.com/mcp {"method":"tools/list","jsonrpc":"2.0","id":1}
9
+ [debug] [2026-03-27T00:40:32.461Z] <<< [apiv2][status] POST https://developerknowledge.googleapis.com/mcp 200
10
+ [debug] [2026-03-27T00:40:32.461Z] <<< [apiv2][body] POST https://developerknowledge.googleapis.com/mcp {"id":1,"jsonrpc":"2.0","result":{"tools":[{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Use this tool to find documentation about Google developer products. The documents contain official APIs, code snippets, release notes, best practices, guides, debugging info, and more. It covers the following products and domains:\n\n* Android: developer.android.com\n* Apigee: docs.apigee.com\n* Chrome: developer.chrome.com\n* Firebase: firebase.google.com\n* Fuchsia: fuchsia.dev\n* Google AI: ai.google.dev\n* Google Cloud: docs.cloud.google.com\n* Google Developers, Ads, Search, Google Maps, Youtube: developers.google.com\n* Google Home: developers.home.google.com\n* TensorFlow: www.tensorflow.org\n* Web: web.dev\n\nThis tool returns chunks of text, names, and URLs for matching documents. If the returned chunks are not detailed enough to answer the user's question, use `get_documents` with the `parent` from this tool's output to retrieve the full document content.","inputSchema":{"description":"Request schema for search_documents. Use the query field to search for related Google developer documentation.","properties":{"query":{"description":"Required. The raw query string provided by the user, such as \"How to create a Cloud Storage bucket?\".","type":"string"}},"required":["query"],"type":"object"},"name":"search_documents","outputSchema":{"$defs":{"DocumentChunk":{"description":"A DocumentChunk represents a piece of content from a Document in the DeveloperKnowledge corpus. To fetch the entire document content, pass the `parent` to get_document or batch_get_documents.","properties":{"content":{"description":"Output only. The content of the document chunk.","readOnly":true,"type":"string"},"id":{"description":"Output only. The ID of this chunk within the document. The chunk ID is unique within a document, but not globally unique across documents. The chunk ID is not stable and may change over time.","readOnly":true,"type":"string"},"parent":{"description":"Output only. The resource name of the document this chunk is from. Format: `documents/{uri_without_scheme}` Example: `documents/docs.cloud.google.com/storage/docs/creating-buckets`","readOnly":true,"type":"string"}},"type":"object"}},"description":"Response schema for search_documents.","properties":{"results":{"description":"The search results for the given query. Each Document in this list contains a snippet of content relevant to the search query. Use the DocumentChunk.name field of each result with get_documents to retrieve the full document content.","items":{"$ref":"#/$defs/DocumentChunk"},"type":"array"}},"type":"object"}},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Use this tool to retrieve the full content of a single document or up to 20 documents in a single call. The document names should be obtained from the `parent` field of results from a call to the `search_documents` tool. Set the `names` parameter to a list of document names.","inputSchema":{"description":"Request schema for get_documents.","properties":{"names":{"description":"Required. The names of the documents to retrieve, as returned by search_documents. A maximum of 20 documents can be retrieved in one call. The documents are returned in the same order as the `names` in the request. Format: `documents/{uri_without_scheme}` Example: `documents/docs.cloud.google.com/storage/docs/creating-buckets`","items":{"type":"string"},"type":"array"}},"required":["names"],"type":"object"},"name":"get_documents","outputSchema":{"$defs":{"Document":{"description":"A Document represents a piece of content from the Developer Knowledge corpus.","properties":{"content":{"description":"Output only. The content of the document in Markdown format.","readOnly":true,"type":"string"},"description":{"description":"Output only. A description of the document.","readOnly":true,"type":"string"},"name":{"description":"Identifier. The resource name of the document. Format: `documents/{uri_without_scheme}` Example: `documents/docs.cloud.google.com/storage/docs/creating-buckets`","type":"string","x-google-identifier":true},"title":{"description":"Output only. The title of the document.","readOnly":true,"type":"string"},"uri":{"description":"Output only. The URI of the content, such as `https://cloud.google.com/storage/docs/creating-buckets`.","readOnly":true,"type":"string"}},"type":"object"}},"description":"Response schema for get_documents.","properties":{"documents":{"description":"Documents requested.","items":{"$ref":"#/$defs/Document"},"type":"array"}},"type":"object"}}]}}
11
+ [debug] [2026-03-27T00:40:32.463Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
12
+ [debug] [2026-03-27T00:40:32.464Z] > authorizing via signed-in user (eagle.xiao@gmail.com)
13
+ [debug] [2026-03-27T00:53:43.772Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
14
+ [debug] [2026-03-27T00:53:43.773Z] > authorizing via signed-in user (eagle.xiao@gmail.com)
15
+ [debug] [2026-03-27T00:53:43.786Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
16
+ [debug] [2026-03-27T00:53:43.786Z] > authorizing via signed-in user (eagle.xiao@gmail.com)
17
+ [debug] [2026-03-27T00:53:44.081Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
18
+ [debug] [2026-03-27T00:53:44.082Z] > authorizing via signed-in user (eagle.xiao@gmail.com)
19
+ [debug] [2026-03-27T00:53:44.082Z] >>> [apiv2][query] POST https://developerknowledge.googleapis.com/mcp [none]
20
+ [debug] [2026-03-27T00:53:44.082Z] >>> [apiv2][body] POST https://developerknowledge.googleapis.com/mcp {"method":"tools/list","jsonrpc":"2.0","id":1}
21
+ [debug] [2026-03-27T00:53:44.736Z] <<< [apiv2][status] POST https://developerknowledge.googleapis.com/mcp 200
22
+ [debug] [2026-03-27T00:53:44.736Z] <<< [apiv2][body] POST https://developerknowledge.googleapis.com/mcp {"id":1,"jsonrpc":"2.0","result":{"tools":[{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Use this tool to find documentation about Google developer products. The documents contain official APIs, code snippets, release notes, best practices, guides, debugging info, and more. It covers the following products and domains:\n\n* Android: developer.android.com\n* Apigee: docs.apigee.com\n* Chrome: developer.chrome.com\n* Firebase: firebase.google.com\n* Fuchsia: fuchsia.dev\n* Google AI: ai.google.dev\n* Google Cloud: docs.cloud.google.com\n* Google Developers, Ads, Search, Google Maps, Youtube: developers.google.com\n* Google Home: developers.home.google.com\n* TensorFlow: www.tensorflow.org\n* Web: web.dev\n\nThis tool returns chunks of text, names, and URLs for matching documents. If the returned chunks are not detailed enough to answer the user's question, use `get_documents` with the `parent` from this tool's output to retrieve the full document content.","inputSchema":{"description":"Request schema for search_documents. Use the query field to search for related Google developer documentation.","properties":{"query":{"description":"Required. The raw query string provided by the user, such as \"How to create a Cloud Storage bucket?\".","type":"string"}},"required":["query"],"type":"object"},"name":"search_documents","outputSchema":{"$defs":{"DocumentChunk":{"description":"A DocumentChunk represents a piece of content from a Document in the DeveloperKnowledge corpus. To fetch the entire document content, pass the `parent` to get_document or batch_get_documents.","properties":{"content":{"description":"Output only. The content of the document chunk.","readOnly":true,"type":"string"},"id":{"description":"Output only. The ID of this chunk within the document. The chunk ID is unique within a document, but not globally unique across documents. The chunk ID is not stable and may change over time.","readOnly":true,"type":"string"},"parent":{"description":"Output only. The resource name of the document this chunk is from. Format: `documents/{uri_without_scheme}` Example: `documents/docs.cloud.google.com/storage/docs/creating-buckets`","readOnly":true,"type":"string"}},"type":"object"}},"description":"Response schema for search_documents.","properties":{"results":{"description":"The search results for the given query. Each Document in this list contains a snippet of content relevant to the search query. Use the DocumentChunk.name field of each result with get_documents to retrieve the full document content.","items":{"$ref":"#/$defs/DocumentChunk"},"type":"array"}},"type":"object"}},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Use this tool to retrieve the full content of a single document or up to 20 documents in a single call. The document names should be obtained from the `parent` field of results from a call to the `search_documents` tool. Set the `names` parameter to a list of document names.","inputSchema":{"description":"Request schema for get_documents.","properties":{"names":{"description":"Required. The names of the documents to retrieve, as returned by search_documents. A maximum of 20 documents can be retrieved in one call. The documents are returned in the same order as the `names` in the request. Format: `documents/{uri_without_scheme}` Example: `documents/docs.cloud.google.com/storage/docs/creating-buckets`","items":{"type":"string"},"type":"array"}},"required":["names"],"type":"object"},"name":"get_documents","outputSchema":{"$defs":{"Document":{"description":"A Document represents a piece of content from the Developer Knowledge corpus.","properties":{"content":{"description":"Output only. The content of the document in Markdown format.","readOnly":true,"type":"string"},"description":{"description":"Output only. A description of the document.","readOnly":true,"type":"string"},"name":{"description":"Identifier. The resource name of the document. Format: `documents/{uri_without_scheme}` Example: `documents/docs.cloud.google.com/storage/docs/creating-buckets`","type":"string","x-google-identifier":true},"title":{"description":"Output only. The title of the document.","readOnly":true,"type":"string"},"uri":{"description":"Output only. The URI of the content, such as `https://cloud.google.com/storage/docs/creating-buckets`.","readOnly":true,"type":"string"}},"type":"object"}},"description":"Response schema for get_documents.","properties":{"documents":{"description":"Documents requested.","items":{"$ref":"#/$defs/Document"},"type":"array"}},"type":"object"}}]}}
23
+ [debug] [2026-03-27T00:53:44.737Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
24
+ [debug] [2026-03-27T00:53:44.737Z] > authorizing via signed-in user (eagle.xiao@gmail.com)
25
+ [debug] [2026-03-27T00:58:47.641Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
26
+ [debug] [2026-03-27T00:58:47.644Z] > authorizing via signed-in user (eagle.xiao@gmail.com)
27
+ [debug] [2026-03-27T00:58:47.662Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
28
+ [debug] [2026-03-27T00:58:47.662Z] > authorizing via signed-in user (eagle.xiao@gmail.com)
29
+ [debug] [2026-03-27T00:58:47.965Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
30
+ [debug] [2026-03-27T00:58:47.965Z] > authorizing via signed-in user (eagle.xiao@gmail.com)
31
+ [debug] [2026-03-27T00:58:47.966Z] >>> [apiv2][query] POST https://developerknowledge.googleapis.com/mcp [none]
32
+ [debug] [2026-03-27T00:58:47.966Z] >>> [apiv2][body] POST https://developerknowledge.googleapis.com/mcp {"method":"tools/list","jsonrpc":"2.0","id":1}
33
+ [debug] [2026-03-27T00:58:48.592Z] <<< [apiv2][status] POST https://developerknowledge.googleapis.com/mcp 200
34
+ [debug] [2026-03-27T00:58:48.592Z] <<< [apiv2][body] POST https://developerknowledge.googleapis.com/mcp {"id":1,"jsonrpc":"2.0","result":{"tools":[{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Use this tool to find documentation about Google developer products. The documents contain official APIs, code snippets, release notes, best practices, guides, debugging info, and more. It covers the following products and domains:\n\n* Android: developer.android.com\n* Apigee: docs.apigee.com\n* Chrome: developer.chrome.com\n* Firebase: firebase.google.com\n* Fuchsia: fuchsia.dev\n* Google AI: ai.google.dev\n* Google Cloud: docs.cloud.google.com\n* Google Developers, Ads, Search, Google Maps, Youtube: developers.google.com\n* Google Home: developers.home.google.com\n* TensorFlow: www.tensorflow.org\n* Web: web.dev\n\nThis tool returns chunks of text, names, and URLs for matching documents. If the returned chunks are not detailed enough to answer the user's question, use `get_documents` with the `parent` from this tool's output to retrieve the full document content.","inputSchema":{"description":"Request schema for search_documents. Use the query field to search for related Google developer documentation.","properties":{"query":{"description":"Required. The raw query string provided by the user, such as \"How to create a Cloud Storage bucket?\".","type":"string"}},"required":["query"],"type":"object"},"name":"search_documents","outputSchema":{"$defs":{"DocumentChunk":{"description":"A DocumentChunk represents a piece of content from a Document in the DeveloperKnowledge corpus. To fetch the entire document content, pass the `parent` to get_document or batch_get_documents.","properties":{"content":{"description":"Output only. The content of the document chunk.","readOnly":true,"type":"string"},"id":{"description":"Output only. The ID of this chunk within the document. The chunk ID is unique within a document, but not globally unique across documents. The chunk ID is not stable and may change over time.","readOnly":true,"type":"string"},"parent":{"description":"Output only. The resource name of the document this chunk is from. Format: `documents/{uri_without_scheme}` Example: `documents/docs.cloud.google.com/storage/docs/creating-buckets`","readOnly":true,"type":"string"}},"type":"object"}},"description":"Response schema for search_documents.","properties":{"results":{"description":"The search results for the given query. Each Document in this list contains a snippet of content relevant to the search query. Use the DocumentChunk.name field of each result with get_documents to retrieve the full document content.","items":{"$ref":"#/$defs/DocumentChunk"},"type":"array"}},"type":"object"}},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Use this tool to retrieve the full content of a single document or up to 20 documents in a single call. The document names should be obtained from the `parent` field of results from a call to the `search_documents` tool. Set the `names` parameter to a list of document names.","inputSchema":{"description":"Request schema for get_documents.","properties":{"names":{"description":"Required. The names of the documents to retrieve, as returned by search_documents. A maximum of 20 documents can be retrieved in one call. The documents are returned in the same order as the `names` in the request. Format: `documents/{uri_without_scheme}` Example: `documents/docs.cloud.google.com/storage/docs/creating-buckets`","items":{"type":"string"},"type":"array"}},"required":["names"],"type":"object"},"name":"get_documents","outputSchema":{"$defs":{"Document":{"description":"A Document represents a piece of content from the Developer Knowledge corpus.","properties":{"content":{"description":"Output only. The content of the document in Markdown format.","readOnly":true,"type":"string"},"description":{"description":"Output only. A description of the document.","readOnly":true,"type":"string"},"name":{"description":"Identifier. The resource name of the document. Format: `documents/{uri_without_scheme}` Example: `documents/docs.cloud.google.com/storage/docs/creating-buckets`","type":"string","x-google-identifier":true},"title":{"description":"Output only. The title of the document.","readOnly":true,"type":"string"},"uri":{"description":"Output only. The URI of the content, such as `https://cloud.google.com/storage/docs/creating-buckets`.","readOnly":true,"type":"string"}},"type":"object"}},"description":"Response schema for get_documents.","properties":{"documents":{"description":"Documents requested.","items":{"$ref":"#/$defs/Document"},"type":"array"}},"type":"object"}}]}}
35
+ [debug] [2026-03-27T00:58:48.594Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
36
+ [debug] [2026-03-27T00:58:48.594Z] > authorizing via signed-in user (eagle.xiao@gmail.com)
37
+ [debug] [2026-03-27T00:58:55.154Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
38
+ [debug] [2026-03-27T00:58:55.155Z] > authorizing via signed-in user (eagle.xiao@gmail.com)
39
+ [debug] [2026-03-27T00:58:55.161Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
40
+ [debug] [2026-03-27T00:58:55.161Z] > authorizing via signed-in user (eagle.xiao@gmail.com)
41
+ [debug] [2026-03-27T00:58:55.455Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
42
+ [debug] [2026-03-27T00:58:55.455Z] > authorizing via signed-in user (eagle.xiao@gmail.com)
43
+ [debug] [2026-03-27T00:58:55.457Z] >>> [apiv2][query] POST https://developerknowledge.googleapis.com/mcp [none]
44
+ [debug] [2026-03-27T00:58:55.457Z] >>> [apiv2][body] POST https://developerknowledge.googleapis.com/mcp {"method":"tools/list","jsonrpc":"2.0","id":1}
45
+ [debug] [2026-03-27T00:58:56.059Z] <<< [apiv2][status] POST https://developerknowledge.googleapis.com/mcp 200
46
+ [debug] [2026-03-27T00:58:56.060Z] <<< [apiv2][body] POST https://developerknowledge.googleapis.com/mcp {"id":1,"jsonrpc":"2.0","result":{"tools":[{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Use this tool to find documentation about Google developer products. The documents contain official APIs, code snippets, release notes, best practices, guides, debugging info, and more. It covers the following products and domains:\n\n* Android: developer.android.com\n* Apigee: docs.apigee.com\n* Chrome: developer.chrome.com\n* Firebase: firebase.google.com\n* Fuchsia: fuchsia.dev\n* Google AI: ai.google.dev\n* Google Cloud: docs.cloud.google.com\n* Google Developers, Ads, Search, Google Maps, Youtube: developers.google.com\n* Google Home: developers.home.google.com\n* TensorFlow: www.tensorflow.org\n* Web: web.dev\n\nThis tool returns chunks of text, names, and URLs for matching documents. If the returned chunks are not detailed enough to answer the user's question, use `get_documents` with the `parent` from this tool's output to retrieve the full document content.","inputSchema":{"description":"Request schema for search_documents. Use the query field to search for related Google developer documentation.","properties":{"query":{"description":"Required. The raw query string provided by the user, such as \"How to create a Cloud Storage bucket?\".","type":"string"}},"required":["query"],"type":"object"},"name":"search_documents","outputSchema":{"$defs":{"DocumentChunk":{"description":"A DocumentChunk represents a piece of content from a Document in the DeveloperKnowledge corpus. To fetch the entire document content, pass the `parent` to get_document or batch_get_documents.","properties":{"content":{"description":"Output only. The content of the document chunk.","readOnly":true,"type":"string"},"id":{"description":"Output only. The ID of this chunk within the document. The chunk ID is unique within a document, but not globally unique across documents. The chunk ID is not stable and may change over time.","readOnly":true,"type":"string"},"parent":{"description":"Output only. The resource name of the document this chunk is from. Format: `documents/{uri_without_scheme}` Example: `documents/docs.cloud.google.com/storage/docs/creating-buckets`","readOnly":true,"type":"string"}},"type":"object"}},"description":"Response schema for search_documents.","properties":{"results":{"description":"The search results for the given query. Each Document in this list contains a snippet of content relevant to the search query. Use the DocumentChunk.name field of each result with get_documents to retrieve the full document content.","items":{"$ref":"#/$defs/DocumentChunk"},"type":"array"}},"type":"object"}},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Use this tool to retrieve the full content of a single document or up to 20 documents in a single call. The document names should be obtained from the `parent` field of results from a call to the `search_documents` tool. Set the `names` parameter to a list of document names.","inputSchema":{"description":"Request schema for get_documents.","properties":{"names":{"description":"Required. The names of the documents to retrieve, as returned by search_documents. A maximum of 20 documents can be retrieved in one call. The documents are returned in the same order as the `names` in the request. Format: `documents/{uri_without_scheme}` Example: `documents/docs.cloud.google.com/storage/docs/creating-buckets`","items":{"type":"string"},"type":"array"}},"required":["names"],"type":"object"},"name":"get_documents","outputSchema":{"$defs":{"Document":{"description":"A Document represents a piece of content from the Developer Knowledge corpus.","properties":{"content":{"description":"Output only. The content of the document in Markdown format.","readOnly":true,"type":"string"},"description":{"description":"Output only. A description of the document.","readOnly":true,"type":"string"},"name":{"description":"Identifier. The resource name of the document. Format: `documents/{uri_without_scheme}` Example: `documents/docs.cloud.google.com/storage/docs/creating-buckets`","type":"string","x-google-identifier":true},"title":{"description":"Output only. The title of the document.","readOnly":true,"type":"string"},"uri":{"description":"Output only. The URI of the content, such as `https://cloud.google.com/storage/docs/creating-buckets`.","readOnly":true,"type":"string"}},"type":"object"}},"description":"Response schema for get_documents.","properties":{"documents":{"description":"Documents requested.","items":{"$ref":"#/$defs/Document"},"type":"array"}},"type":"object"}}]}}
47
+ [debug] [2026-03-27T00:58:56.061Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
48
+ [debug] [2026-03-27T00:58:56.061Z] > authorizing via signed-in user (eagle.xiao@gmail.com)
49
+ [debug] [2026-03-27T01:00:17.877Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
50
+ [debug] [2026-03-27T01:00:17.878Z] > authorizing via signed-in user (eagle.xiao@gmail.com)
51
+ [debug] [2026-03-27T01:00:17.889Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
52
+ [debug] [2026-03-27T01:00:17.889Z] > authorizing via signed-in user (eagle.xiao@gmail.com)
53
+ [debug] [2026-03-27T01:00:18.304Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
54
+ [debug] [2026-03-27T01:00:18.305Z] > authorizing via signed-in user (eagle.xiao@gmail.com)
55
+ [debug] [2026-03-27T01:00:18.306Z] >>> [apiv2][query] POST https://developerknowledge.googleapis.com/mcp [none]
56
+ [debug] [2026-03-27T01:00:18.307Z] >>> [apiv2][body] POST https://developerknowledge.googleapis.com/mcp {"method":"tools/list","jsonrpc":"2.0","id":1}
57
+ [debug] [2026-03-27T01:00:18.966Z] <<< [apiv2][status] POST https://developerknowledge.googleapis.com/mcp 200
58
+ [debug] [2026-03-27T01:00:18.966Z] <<< [apiv2][body] POST https://developerknowledge.googleapis.com/mcp {"id":1,"jsonrpc":"2.0","result":{"tools":[{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Use this tool to find documentation about Google developer products. The documents contain official APIs, code snippets, release notes, best practices, guides, debugging info, and more. It covers the following products and domains:\n\n* Android: developer.android.com\n* Apigee: docs.apigee.com\n* Chrome: developer.chrome.com\n* Firebase: firebase.google.com\n* Fuchsia: fuchsia.dev\n* Google AI: ai.google.dev\n* Google Cloud: docs.cloud.google.com\n* Google Developers, Ads, Search, Google Maps, Youtube: developers.google.com\n* Google Home: developers.home.google.com\n* TensorFlow: www.tensorflow.org\n* Web: web.dev\n\nThis tool returns chunks of text, names, and URLs for matching documents. If the returned chunks are not detailed enough to answer the user's question, use `get_documents` with the `parent` from this tool's output to retrieve the full document content.","inputSchema":{"description":"Request schema for search_documents. Use the query field to search for related Google developer documentation.","properties":{"query":{"description":"Required. The raw query string provided by the user, such as \"How to create a Cloud Storage bucket?\".","type":"string"}},"required":["query"],"type":"object"},"name":"search_documents","outputSchema":{"$defs":{"DocumentChunk":{"description":"A DocumentChunk represents a piece of content from a Document in the DeveloperKnowledge corpus. To fetch the entire document content, pass the `parent` to get_document or batch_get_documents.","properties":{"content":{"description":"Output only. The content of the document chunk.","readOnly":true,"type":"string"},"id":{"description":"Output only. The ID of this chunk within the document. The chunk ID is unique within a document, but not globally unique across documents. The chunk ID is not stable and may change over time.","readOnly":true,"type":"string"},"parent":{"description":"Output only. The resource name of the document this chunk is from. Format: `documents/{uri_without_scheme}` Example: `documents/docs.cloud.google.com/storage/docs/creating-buckets`","readOnly":true,"type":"string"}},"type":"object"}},"description":"Response schema for search_documents.","properties":{"results":{"description":"The search results for the given query. Each Document in this list contains a snippet of content relevant to the search query. Use the DocumentChunk.name field of each result with get_documents to retrieve the full document content.","items":{"$ref":"#/$defs/DocumentChunk"},"type":"array"}},"type":"object"}},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Use this tool to retrieve the full content of a single document or up to 20 documents in a single call. The document names should be obtained from the `parent` field of results from a call to the `search_documents` tool. Set the `names` parameter to a list of document names.","inputSchema":{"description":"Request schema for get_documents.","properties":{"names":{"description":"Required. The names of the documents to retrieve, as returned by search_documents. A maximum of 20 documents can be retrieved in one call. The documents are returned in the same order as the `names` in the request. Format: `documents/{uri_without_scheme}` Example: `documents/docs.cloud.google.com/storage/docs/creating-buckets`","items":{"type":"string"},"type":"array"}},"required":["names"],"type":"object"},"name":"get_documents","outputSchema":{"$defs":{"Document":{"description":"A Document represents a piece of content from the Developer Knowledge corpus.","properties":{"content":{"description":"Output only. The content of the document in Markdown format.","readOnly":true,"type":"string"},"description":{"description":"Output only. A description of the document.","readOnly":true,"type":"string"},"name":{"description":"Identifier. The resource name of the document. Format: `documents/{uri_without_scheme}` Example: `documents/docs.cloud.google.com/storage/docs/creating-buckets`","type":"string","x-google-identifier":true},"title":{"description":"Output only. The title of the document.","readOnly":true,"type":"string"},"uri":{"description":"Output only. The URI of the content, such as `https://cloud.google.com/storage/docs/creating-buckets`.","readOnly":true,"type":"string"}},"type":"object"}},"description":"Response schema for get_documents.","properties":{"documents":{"description":"Documents requested.","items":{"$ref":"#/$defs/Document"},"type":"array"}},"type":"object"}}]}}
59
+ [debug] [2026-03-27T01:00:18.967Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
60
+ [debug] [2026-03-27T01:00:18.967Z] > authorizing via signed-in user (eagle.xiao@gmail.com)
61
+ [debug] [2026-03-27T01:05:22.129Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
62
+ [debug] [2026-03-27T01:05:22.131Z] > authorizing via signed-in user (eagle.xiao@gmail.com)
63
+ [debug] [2026-03-27T01:05:22.138Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
64
+ [debug] [2026-03-27T01:05:22.138Z] > authorizing via signed-in user (eagle.xiao@gmail.com)
65
+ [debug] [2026-03-27T01:05:22.445Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
66
+ [debug] [2026-03-27T01:05:22.446Z] > authorizing via signed-in user (eagle.xiao@gmail.com)
67
+ [debug] [2026-03-27T01:05:22.447Z] >>> [apiv2][query] POST https://developerknowledge.googleapis.com/mcp [none]
68
+ [debug] [2026-03-27T01:05:22.447Z] >>> [apiv2][body] POST https://developerknowledge.googleapis.com/mcp {"method":"tools/list","jsonrpc":"2.0","id":1}
69
+ [debug] [2026-03-27T01:05:23.048Z] <<< [apiv2][status] POST https://developerknowledge.googleapis.com/mcp 200
70
+ [debug] [2026-03-27T01:05:23.048Z] <<< [apiv2][body] POST https://developerknowledge.googleapis.com/mcp {"id":1,"jsonrpc":"2.0","result":{"tools":[{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Use this tool to find documentation about Google developer products. The documents contain official APIs, code snippets, release notes, best practices, guides, debugging info, and more. It covers the following products and domains:\n\n* Android: developer.android.com\n* Apigee: docs.apigee.com\n* Chrome: developer.chrome.com\n* Firebase: firebase.google.com\n* Fuchsia: fuchsia.dev\n* Google AI: ai.google.dev\n* Google Cloud: docs.cloud.google.com\n* Google Developers, Ads, Search, Google Maps, Youtube: developers.google.com\n* Google Home: developers.home.google.com\n* TensorFlow: www.tensorflow.org\n* Web: web.dev\n\nThis tool returns chunks of text, names, and URLs for matching documents. If the returned chunks are not detailed enough to answer the user's question, use `get_documents` with the `parent` from this tool's output to retrieve the full document content.","inputSchema":{"description":"Request schema for search_documents. Use the query field to search for related Google developer documentation.","properties":{"query":{"description":"Required. The raw query string provided by the user, such as \"How to create a Cloud Storage bucket?\".","type":"string"}},"required":["query"],"type":"object"},"name":"search_documents","outputSchema":{"$defs":{"DocumentChunk":{"description":"A DocumentChunk represents a piece of content from a Document in the DeveloperKnowledge corpus. To fetch the entire document content, pass the `parent` to get_document or batch_get_documents.","properties":{"content":{"description":"Output only. The content of the document chunk.","readOnly":true,"type":"string"},"id":{"description":"Output only. The ID of this chunk within the document. The chunk ID is unique within a document, but not globally unique across documents. The chunk ID is not stable and may change over time.","readOnly":true,"type":"string"},"parent":{"description":"Output only. The resource name of the document this chunk is from. Format: `documents/{uri_without_scheme}` Example: `documents/docs.cloud.google.com/storage/docs/creating-buckets`","readOnly":true,"type":"string"}},"type":"object"}},"description":"Response schema for search_documents.","properties":{"results":{"description":"The search results for the given query. Each Document in this list contains a snippet of content relevant to the search query. Use the DocumentChunk.name field of each result with get_documents to retrieve the full document content.","items":{"$ref":"#/$defs/DocumentChunk"},"type":"array"}},"type":"object"}},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Use this tool to retrieve the full content of a single document or up to 20 documents in a single call. The document names should be obtained from the `parent` field of results from a call to the `search_documents` tool. Set the `names` parameter to a list of document names.","inputSchema":{"description":"Request schema for get_documents.","properties":{"names":{"description":"Required. The names of the documents to retrieve, as returned by search_documents. A maximum of 20 documents can be retrieved in one call. The documents are returned in the same order as the `names` in the request. Format: `documents/{uri_without_scheme}` Example: `documents/docs.cloud.google.com/storage/docs/creating-buckets`","items":{"type":"string"},"type":"array"}},"required":["names"],"type":"object"},"name":"get_documents","outputSchema":{"$defs":{"Document":{"description":"A Document represents a piece of content from the Developer Knowledge corpus.","properties":{"content":{"description":"Output only. The content of the document in Markdown format.","readOnly":true,"type":"string"},"description":{"description":"Output only. A description of the document.","readOnly":true,"type":"string"},"name":{"description":"Identifier. The resource name of the document. Format: `documents/{uri_without_scheme}` Example: `documents/docs.cloud.google.com/storage/docs/creating-buckets`","type":"string","x-google-identifier":true},"title":{"description":"Output only. The title of the document.","readOnly":true,"type":"string"},"uri":{"description":"Output only. The URI of the content, such as `https://cloud.google.com/storage/docs/creating-buckets`.","readOnly":true,"type":"string"}},"type":"object"}},"description":"Response schema for get_documents.","properties":{"documents":{"description":"Documents requested.","items":{"$ref":"#/$defs/Document"},"type":"array"}},"type":"object"}}]}}
71
+ [debug] [2026-03-27T01:05:23.049Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
72
+ [debug] [2026-03-27T01:05:23.049Z] > authorizing via signed-in user (eagle.xiao@gmail.com)
73
+ [debug] [2026-03-27T01:08:51.137Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
74
+ [debug] [2026-03-27T01:08:51.138Z] > authorizing via signed-in user (eagle.xiao@gmail.com)
75
+ [debug] [2026-03-27T01:08:51.149Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
76
+ [debug] [2026-03-27T01:08:51.149Z] > authorizing via signed-in user (eagle.xiao@gmail.com)
77
+ [debug] [2026-03-27T01:08:51.417Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
78
+ [debug] [2026-03-27T01:08:51.417Z] > authorizing via signed-in user (eagle.xiao@gmail.com)
79
+ [debug] [2026-03-27T01:08:51.418Z] >>> [apiv2][query] POST https://developerknowledge.googleapis.com/mcp [none]
80
+ [debug] [2026-03-27T01:08:51.418Z] >>> [apiv2][body] POST https://developerknowledge.googleapis.com/mcp {"method":"tools/list","jsonrpc":"2.0","id":1}
81
+ [debug] [2026-03-27T01:08:52.065Z] <<< [apiv2][status] POST https://developerknowledge.googleapis.com/mcp 200
82
+ [debug] [2026-03-27T01:08:52.065Z] <<< [apiv2][body] POST https://developerknowledge.googleapis.com/mcp {"id":1,"jsonrpc":"2.0","result":{"tools":[{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Use this tool to find documentation about Google developer products. The documents contain official APIs, code snippets, release notes, best practices, guides, debugging info, and more. It covers the following products and domains:\n\n* Android: developer.android.com\n* Apigee: docs.apigee.com\n* Chrome: developer.chrome.com\n* Firebase: firebase.google.com\n* Fuchsia: fuchsia.dev\n* Google AI: ai.google.dev\n* Google Cloud: docs.cloud.google.com\n* Google Developers, Ads, Search, Google Maps, Youtube: developers.google.com\n* Google Home: developers.home.google.com\n* TensorFlow: www.tensorflow.org\n* Web: web.dev\n\nThis tool returns chunks of text, names, and URLs for matching documents. If the returned chunks are not detailed enough to answer the user's question, use `get_documents` with the `parent` from this tool's output to retrieve the full document content.","inputSchema":{"description":"Request schema for search_documents. Use the query field to search for related Google developer documentation.","properties":{"query":{"description":"Required. The raw query string provided by the user, such as \"How to create a Cloud Storage bucket?\".","type":"string"}},"required":["query"],"type":"object"},"name":"search_documents","outputSchema":{"$defs":{"DocumentChunk":{"description":"A DocumentChunk represents a piece of content from a Document in the DeveloperKnowledge corpus. To fetch the entire document content, pass the `parent` to get_document or batch_get_documents.","properties":{"content":{"description":"Output only. The content of the document chunk.","readOnly":true,"type":"string"},"id":{"description":"Output only. The ID of this chunk within the document. The chunk ID is unique within a document, but not globally unique across documents. The chunk ID is not stable and may change over time.","readOnly":true,"type":"string"},"parent":{"description":"Output only. The resource name of the document this chunk is from. Format: `documents/{uri_without_scheme}` Example: `documents/docs.cloud.google.com/storage/docs/creating-buckets`","readOnly":true,"type":"string"}},"type":"object"}},"description":"Response schema for search_documents.","properties":{"results":{"description":"The search results for the given query. Each Document in this list contains a snippet of content relevant to the search query. Use the DocumentChunk.name field of each result with get_documents to retrieve the full document content.","items":{"$ref":"#/$defs/DocumentChunk"},"type":"array"}},"type":"object"}},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Use this tool to retrieve the full content of a single document or up to 20 documents in a single call. The document names should be obtained from the `parent` field of results from a call to the `search_documents` tool. Set the `names` parameter to a list of document names.","inputSchema":{"description":"Request schema for get_documents.","properties":{"names":{"description":"Required. The names of the documents to retrieve, as returned by search_documents. A maximum of 20 documents can be retrieved in one call. The documents are returned in the same order as the `names` in the request. Format: `documents/{uri_without_scheme}` Example: `documents/docs.cloud.google.com/storage/docs/creating-buckets`","items":{"type":"string"},"type":"array"}},"required":["names"],"type":"object"},"name":"get_documents","outputSchema":{"$defs":{"Document":{"description":"A Document represents a piece of content from the Developer Knowledge corpus.","properties":{"content":{"description":"Output only. The content of the document in Markdown format.","readOnly":true,"type":"string"},"description":{"description":"Output only. A description of the document.","readOnly":true,"type":"string"},"name":{"description":"Identifier. The resource name of the document. Format: `documents/{uri_without_scheme}` Example: `documents/docs.cloud.google.com/storage/docs/creating-buckets`","type":"string","x-google-identifier":true},"title":{"description":"Output only. The title of the document.","readOnly":true,"type":"string"},"uri":{"description":"Output only. The URI of the content, such as `https://cloud.google.com/storage/docs/creating-buckets`.","readOnly":true,"type":"string"}},"type":"object"}},"description":"Response schema for get_documents.","properties":{"documents":{"description":"Documents requested.","items":{"$ref":"#/$defs/Document"},"type":"array"}},"type":"object"}}]}}
83
+ [debug] [2026-03-27T01:08:52.066Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
84
+ [debug] [2026-03-27T01:08:52.067Z] > authorizing via signed-in user (eagle.xiao@gmail.com)
85
+ [debug] [2026-03-27T03:22:53.489Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
86
+ [debug] [2026-03-27T03:22:53.496Z] > authorizing via signed-in user (eagle.xiao@gmail.com)
87
+ [debug] [2026-03-27T03:22:53.505Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
88
+ [debug] [2026-03-27T03:22:53.505Z] > authorizing via signed-in user (eagle.xiao@gmail.com)
89
+ [debug] [2026-03-27T03:22:53.810Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
90
+ [debug] [2026-03-27T03:22:53.811Z] > authorizing via signed-in user (eagle.xiao@gmail.com)
91
+ [debug] [2026-03-27T03:22:53.813Z] >>> [apiv2][query] POST https://developerknowledge.googleapis.com/mcp [none]
92
+ [debug] [2026-03-27T03:22:53.813Z] >>> [apiv2][body] POST https://developerknowledge.googleapis.com/mcp {"method":"tools/list","jsonrpc":"2.0","id":1}
93
+ [debug] [2026-03-27T03:22:54.477Z] <<< [apiv2][status] POST https://developerknowledge.googleapis.com/mcp 200
94
+ [debug] [2026-03-27T03:22:54.477Z] <<< [apiv2][body] POST https://developerknowledge.googleapis.com/mcp {"id":1,"jsonrpc":"2.0","result":{"tools":[{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Use this tool to find documentation about Google developer products. The documents contain official APIs, code snippets, release notes, best practices, guides, debugging info, and more. It covers the following products and domains:\n\n* Android: developer.android.com\n* Apigee: docs.apigee.com\n* Chrome: developer.chrome.com\n* Firebase: firebase.google.com\n* Fuchsia: fuchsia.dev\n* Google AI: ai.google.dev\n* Google Cloud: docs.cloud.google.com\n* Google Developers, Ads, Search, Google Maps, Youtube: developers.google.com\n* Google Home: developers.home.google.com\n* TensorFlow: www.tensorflow.org\n* Web: web.dev\n\nThis tool returns chunks of text, names, and URLs for matching documents. If the returned chunks are not detailed enough to answer the user's question, use `get_documents` with the `parent` from this tool's output to retrieve the full document content.","inputSchema":{"description":"Request schema for search_documents. Use the query field to search for related Google developer documentation.","properties":{"query":{"description":"Required. The raw query string provided by the user, such as \"How to create a Cloud Storage bucket?\".","type":"string"}},"required":["query"],"type":"object"},"name":"search_documents","outputSchema":{"$defs":{"DocumentChunk":{"description":"A DocumentChunk represents a piece of content from a Document in the DeveloperKnowledge corpus. To fetch the entire document content, pass the `parent` to get_document or batch_get_documents.","properties":{"content":{"description":"Output only. The content of the document chunk.","readOnly":true,"type":"string"},"id":{"description":"Output only. The ID of this chunk within the document. The chunk ID is unique within a document, but not globally unique across documents. The chunk ID is not stable and may change over time.","readOnly":true,"type":"string"},"parent":{"description":"Output only. The resource name of the document this chunk is from. Format: `documents/{uri_without_scheme}` Example: `documents/docs.cloud.google.com/storage/docs/creating-buckets`","readOnly":true,"type":"string"}},"type":"object"}},"description":"Response schema for search_documents.","properties":{"results":{"description":"The search results for the given query. Each Document in this list contains a snippet of content relevant to the search query. Use the DocumentChunk.name field of each result with get_documents to retrieve the full document content.","items":{"$ref":"#/$defs/DocumentChunk"},"type":"array"}},"type":"object"}},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Use this tool to retrieve the full content of a single document or up to 20 documents in a single call. The document names should be obtained from the `parent` field of results from a call to the `search_documents` tool. Set the `names` parameter to a list of document names.","inputSchema":{"description":"Request schema for get_documents.","properties":{"names":{"description":"Required. The names of the documents to retrieve, as returned by search_documents. A maximum of 20 documents can be retrieved in one call. The documents are returned in the same order as the `names` in the request. Format: `documents/{uri_without_scheme}` Example: `documents/docs.cloud.google.com/storage/docs/creating-buckets`","items":{"type":"string"},"type":"array"}},"required":["names"],"type":"object"},"name":"get_documents","outputSchema":{"$defs":{"Document":{"description":"A Document represents a piece of content from the Developer Knowledge corpus.","properties":{"content":{"description":"Output only. The content of the document in Markdown format.","readOnly":true,"type":"string"},"description":{"description":"Output only. A description of the document.","readOnly":true,"type":"string"},"name":{"description":"Identifier. The resource name of the document. Format: `documents/{uri_without_scheme}` Example: `documents/docs.cloud.google.com/storage/docs/creating-buckets`","type":"string","x-google-identifier":true},"title":{"description":"Output only. The title of the document.","readOnly":true,"type":"string"},"uri":{"description":"Output only. The URI of the content, such as `https://cloud.google.com/storage/docs/creating-buckets`.","readOnly":true,"type":"string"}},"type":"object"}},"description":"Response schema for get_documents.","properties":{"documents":{"description":"Documents requested.","items":{"$ref":"#/$defs/Document"},"type":"array"}},"type":"object"}}]}}
95
+ [debug] [2026-03-27T03:22:54.479Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
96
+ [debug] [2026-03-27T03:22:54.479Z] > authorizing via signed-in user (eagle.xiao@gmail.com)
97
+ [debug] [2026-03-27T05:21:32.803Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
98
+ [debug] [2026-03-27T05:21:32.804Z] > authorizing via signed-in user (eagle.xiao@gmail.com)
99
+ [debug] [2026-03-27T05:21:32.810Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
100
+ [debug] [2026-03-27T05:21:32.810Z] > authorizing via signed-in user (eagle.xiao@gmail.com)
101
+ [debug] [2026-03-27T05:21:33.117Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
102
+ [debug] [2026-03-27T05:21:33.117Z] > authorizing via signed-in user (eagle.xiao@gmail.com)
103
+ [debug] [2026-03-27T05:21:33.119Z] >>> [apiv2][query] POST https://developerknowledge.googleapis.com/mcp [none]
104
+ [debug] [2026-03-27T05:21:33.119Z] >>> [apiv2][body] POST https://developerknowledge.googleapis.com/mcp {"method":"tools/list","jsonrpc":"2.0","id":1}
105
+ [debug] [2026-03-27T05:21:33.848Z] <<< [apiv2][status] POST https://developerknowledge.googleapis.com/mcp 200
106
+ [debug] [2026-03-27T05:21:33.848Z] <<< [apiv2][body] POST https://developerknowledge.googleapis.com/mcp {"id":1,"jsonrpc":"2.0","result":{"tools":[{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Use this tool to find documentation about Google developer products. The documents contain official APIs, code snippets, release notes, best practices, guides, debugging info, and more. It covers the following products and domains:\n\n* Android: developer.android.com\n* Apigee: docs.apigee.com\n* Chrome: developer.chrome.com\n* Firebase: firebase.google.com\n* Fuchsia: fuchsia.dev\n* Google AI: ai.google.dev\n* Google Cloud: docs.cloud.google.com\n* Google Developers, Ads, Search, Google Maps, Youtube: developers.google.com\n* Google Home: developers.home.google.com\n* TensorFlow: www.tensorflow.org\n* Web: web.dev\n\nThis tool returns chunks of text, names, and URLs for matching documents. If the returned chunks are not detailed enough to answer the user's question, use `get_documents` with the `parent` from this tool's output to retrieve the full document content.","inputSchema":{"description":"Request schema for search_documents. Use the query field to search for related Google developer documentation.","properties":{"query":{"description":"Required. The raw query string provided by the user, such as \"How to create a Cloud Storage bucket?\".","type":"string"}},"required":["query"],"type":"object"},"name":"search_documents","outputSchema":{"$defs":{"DocumentChunk":{"description":"A DocumentChunk represents a piece of content from a Document in the DeveloperKnowledge corpus. To fetch the entire document content, pass the `parent` to get_document or batch_get_documents.","properties":{"content":{"description":"Output only. The content of the document chunk.","readOnly":true,"type":"string"},"id":{"description":"Output only. The ID of this chunk within the document. The chunk ID is unique within a document, but not globally unique across documents. The chunk ID is not stable and may change over time.","readOnly":true,"type":"string"},"parent":{"description":"Output only. The resource name of the document this chunk is from. Format: `documents/{uri_without_scheme}` Example: `documents/docs.cloud.google.com/storage/docs/creating-buckets`","readOnly":true,"type":"string"}},"type":"object"}},"description":"Response schema for search_documents.","properties":{"results":{"description":"The search results for the given query. Each Document in this list contains a snippet of content relevant to the search query. Use the DocumentChunk.name field of each result with get_documents to retrieve the full document content.","items":{"$ref":"#/$defs/DocumentChunk"},"type":"array"}},"type":"object"}},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"description":"Use this tool to retrieve the full content of a single document or up to 20 documents in a single call. The document names should be obtained from the `parent` field of results from a call to the `search_documents` tool. Set the `names` parameter to a list of document names.","inputSchema":{"description":"Request schema for get_documents.","properties":{"names":{"description":"Required. The names of the documents to retrieve, as returned by search_documents. A maximum of 20 documents can be retrieved in one call. The documents are returned in the same order as the `names` in the request. Format: `documents/{uri_without_scheme}` Example: `documents/docs.cloud.google.com/storage/docs/creating-buckets`","items":{"type":"string"},"type":"array"}},"required":["names"],"type":"object"},"name":"get_documents","outputSchema":{"$defs":{"Document":{"description":"A Document represents a piece of content from the Developer Knowledge corpus.","properties":{"content":{"description":"Output only. The content of the document in Markdown format.","readOnly":true,"type":"string"},"description":{"description":"Output only. A description of the document.","readOnly":true,"type":"string"},"name":{"description":"Identifier. The resource name of the document. Format: `documents/{uri_without_scheme}` Example: `documents/docs.cloud.google.com/storage/docs/creating-buckets`","type":"string","x-google-identifier":true},"title":{"description":"Output only. The title of the document.","readOnly":true,"type":"string"},"uri":{"description":"Output only. The URI of the content, such as `https://cloud.google.com/storage/docs/creating-buckets`.","readOnly":true,"type":"string"}},"type":"object"}},"description":"Response schema for get_documents.","properties":{"documents":{"description":"Documents requested.","items":{"$ref":"#/$defs/Document"},"type":"array"}},"type":"object"}}]}}
107
+ [debug] [2026-03-27T05:21:33.850Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
108
+ [debug] [2026-03-27T05:21:33.851Z] > authorizing via signed-in user (eagle.xiao@gmail.com)
package/index.html CHANGED
@@ -436,10 +436,10 @@
436
436
  <button id="view-split" class="tool-chip">Split</button>
437
437
  <button id="width-provider-toggle" class="tool-chip"></button>
438
438
  <span id="svg-stats" class="stats-text">SVG: waiting</span>
439
- <a class="tool-link" href="/cy/compare.html" target="_blank" rel="noreferrer">
439
+ <a class="tool-link" href="/e2e/tools/compare.html" target="_blank" rel="noreferrer">
440
440
  Compare Cases
441
441
  </a>
442
- <a class="tool-link" href="/cy/svg-preview.html" target="_blank" rel="noreferrer">
442
+ <a class="tool-link" href="/e2e/tools/svg-preview.html" target="_blank" rel="noreferrer">
443
443
  SVG Only
444
444
  </a>
445
445
  </div>