mcp-probe-kit 3.0.18 → 3.0.21

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 (62) hide show
  1. package/README.md +87 -55
  2. package/build/index.js +3 -1
  3. package/build/lib/__tests__/agents-md-template.unit.test.d.ts +1 -0
  4. package/build/lib/__tests__/agents-md-template.unit.test.js +27 -0
  5. package/build/lib/__tests__/memory-config.unit.test.js +9 -0
  6. package/build/lib/__tests__/memory-injection.unit.test.d.ts +1 -0
  7. package/build/lib/__tests__/memory-injection.unit.test.js +51 -0
  8. package/build/lib/__tests__/memory-orchestration.unit.test.d.ts +1 -0
  9. package/build/lib/__tests__/memory-orchestration.unit.test.js +84 -0
  10. package/build/lib/__tests__/memory-payload.unit.test.d.ts +1 -0
  11. package/build/lib/__tests__/memory-payload.unit.test.js +35 -0
  12. package/build/lib/__tests__/project-context-layout.unit.test.d.ts +1 -0
  13. package/build/lib/__tests__/project-context-layout.unit.test.js +80 -0
  14. package/build/lib/agents-md-template.d.ts +25 -0
  15. package/build/lib/agents-md-template.js +57 -0
  16. package/build/lib/memory-client.d.ts +8 -1
  17. package/build/lib/memory-client.js +53 -44
  18. package/build/lib/memory-config.d.ts +8 -0
  19. package/build/lib/memory-config.js +19 -0
  20. package/build/lib/memory-orchestration.d.ts +10 -3
  21. package/build/lib/memory-orchestration.js +146 -7
  22. package/build/lib/memory-payload.d.ts +21 -0
  23. package/build/lib/memory-payload.js +65 -0
  24. package/build/lib/merge-agents-md.d.ts +6 -0
  25. package/build/lib/merge-agents-md.js +51 -0
  26. package/build/lib/project-context-layout.d.ts +78 -0
  27. package/build/lib/project-context-layout.js +350 -0
  28. package/build/lib/workspace-root.js +6 -1
  29. package/build/resources/ui-ux-data/metadata.json +1 -1
  30. package/build/schemas/index.d.ts +62 -11
  31. package/build/schemas/memory-tools.d.ts +38 -9
  32. package/build/schemas/memory-tools.js +24 -9
  33. package/build/schemas/project-tools.d.ts +24 -2
  34. package/build/schemas/project-tools.js +24 -2
  35. package/build/tools/__tests__/code_insight.unit.test.js +3 -3
  36. package/build/tools/__tests__/init_project_context.unit.test.js +32 -21
  37. package/build/tools/__tests__/start_feature.unit.test.js +2 -1
  38. package/build/tools/code_insight.js +11 -9
  39. package/build/tools/index.d.ts +1 -0
  40. package/build/tools/index.js +1 -0
  41. package/build/tools/init_project_context.js +563 -506
  42. package/build/tools/memorize_asset.js +12 -0
  43. package/build/tools/scan_and_extract_patterns.js +7 -7
  44. package/build/tools/search_memory.d.ts +7 -0
  45. package/build/tools/search_memory.js +57 -0
  46. package/build/tools/start_bugfix.js +257 -251
  47. package/build/tools/start_feature.js +140 -134
  48. package/build/tools/start_ui.js +405 -405
  49. package/docs/.mcp-probe/layout.json +11 -0
  50. package/docs/data/tools.js +18 -0
  51. package/docs/i18n/all-tools/en.json +6 -1
  52. package/docs/i18n/all-tools/ja.json +2 -1
  53. package/docs/i18n/all-tools/ko.json +2 -1
  54. package/docs/i18n/all-tools/zh-CN.json +7 -2
  55. package/docs/i18n/en.json +38 -7
  56. package/docs/i18n/ja.json +9 -2
  57. package/docs/i18n/ko.json +9 -2
  58. package/docs/i18n/zh-CN.json +40 -9
  59. package/docs/memory-local-setup.md +314 -0
  60. package/docs/memory-local-setup.zh-CN.md +283 -0
  61. package/docs/pages/getting-started.html +252 -33
  62. package/package.json +2 -2
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>MCP Probe Kit - AI-Powered Complete Development Toolkit | 28 Tools Covering Entire Development Lifecycle</title>
6
+ <title>MCP Probe Kit - AI-Powered Complete Development Toolkit | 29 Tools Covering Entire Development Lifecycle</title>
7
7
  <meta name="i18n-title" content="meta.title">
8
8
 
9
9
  <!-- SEO Meta Tags -->
@@ -99,7 +99,7 @@
99
99
  <a href="./all-tools.html" class="flex items-center gap-2 px-3 py-2 rounded-md text-sm text-text-secondary hover:bg-bg-page hover:text-primary transition-colors no-underline">
100
100
  <span>🛠️</span>
101
101
  <span data-i18n="sidebar.allTools">All Tools</span>
102
- <span class="ml-auto bg-bg-page text-xs px-2 py-0.5 rounded-full">28</span>
102
+ <span class="ml-auto bg-bg-page text-xs px-2 py-0.5 rounded-full">29</span>
103
103
  </a>
104
104
  </div>
105
105
 
@@ -250,56 +250,241 @@
250
250
  <h3 class="font-semibold mb-2" data-i18n="gettingStarted.step1.memory.title">Memory System Setup (Qdrant + Embedding)</h3>
251
251
  <p class="mb-3 text-text-secondary">
252
252
  <span data-i18n="gettingStarted.step1.memory.descriptionPrefix">If you want to use</span>
253
+ <code class="bg-gray-200 px-1 rounded text-xs">search_memory</code>、
253
254
  <code class="bg-gray-200 px-1 rounded text-xs">memorize_asset</code>、
254
255
  <code class="bg-gray-200 px-1 rounded text-xs">read_memory_asset</code>、
255
256
  <code class="bg-gray-200 px-1 rounded text-xs">scan_and_extract_patterns</code>
256
257
  <span data-i18n="gettingStarted.step1.memory.descriptionSuffix">, you need to configure both a vector database and an embedding service.</span>
257
258
  </p>
258
- <div class="space-y-3">
259
- <div>
260
- <p class="font-medium mb-2" data-i18n="gettingStarted.step1.memory.optionA.title">Option A: Qdrant + Ollama (recommended)</p>
261
- <pre class="code-block mb-2 p-3 text-sm text-slate-200 bg-slate-900 rounded overflow-x-auto"><code>docker run -d --name mcp-qdrant -p 6333:6333 qdrant/qdrant
262
- ollama pull nomic-embed-text</code></pre>
263
- <pre class="code-block p-3 text-sm text-slate-200 bg-slate-900 rounded overflow-x-auto"><code>{
264
- "mcpServers": {
265
- "mcp-probe-kit": {
266
- "command": "npx",
267
- "args": ["-y", "mcp-probe-kit@latest"],
268
- "env": {
269
- "MEMORY_QDRANT_URL": "http://127.0.0.1:6333",
270
- "MEMORY_QDRANT_COLLECTION": "mcp_probe_memory",
271
- "MEMORY_EMBEDDING_PROVIDER": "ollama",
272
- "MEMORY_EMBEDDING_URL": "http://127.0.0.1:11434/api/embeddings",
273
- "MEMORY_EMBEDDING_MODEL": "nomic-embed-text",
274
- "MEMORY_SEARCH_LIMIT": "3",
275
- "MEMORY_SUMMARY_MAX_CHARS": "280"
276
- }
277
- }
278
- }
279
- }</code></pre>
259
+ <p class="mb-3 text-text-secondary" data-i18n="gettingStarted.step1.memory.deployIntro">Copy the files below into two folders, start both services, then paste the MCP config. No Ollama required.</p>
260
+ <p class="mb-3 text-text-secondary">
261
+ <span data-i18n="gettingStarted.step1.memory.guideLink">Extended guide (troubleshooting, performance):</span>
262
+ <a class="text-emerald-700 underline" href="https://github.com/mybolide/mcp-probe-kit/blob/main/docs/memory-local-setup.md" data-i18n="gettingStarted.step1.memory.guidePath">docs/memory-local-setup.md</a>
263
+ · <a class="text-emerald-700 underline" href="https://github.com/mybolide/mcp-probe-kit/blob/main/docs/memory-local-setup.zh-CN.md">中文</a>
264
+ </p>
265
+
266
+ <p class="font-medium mb-1" data-i18n="gettingStarted.step1.memory.portTitle">Ports</p>
267
+ <table class="w-full mb-4 text-xs border border-emerald-200 rounded overflow-hidden">
268
+ <thead class="bg-emerald-100"><tr><th class="px-2 py-1 text-left">Service</th><th class="px-2 py-1 text-left">URL</th></tr></thead>
269
+ <tbody>
270
+ <tr class="border-t border-emerald-200"><td class="px-2 py-1">Qdrant HTTP</td><td class="px-2 py-1"><code>http://127.0.0.1:50008</code></td></tr>
271
+ <tr class="border-t border-emerald-200"><td class="px-2 py-1">Qdrant gRPC</td><td class="px-2 py-1"><code>127.0.0.1:50009</code></td></tr>
272
+ <tr class="border-t border-emerald-200"><td class="px-2 py-1">Nomic Embed</td><td class="px-2 py-1"><code>http://127.0.0.1:50012</code></td></tr>
273
+ </tbody>
274
+ </table>
275
+
276
+ <p class="font-medium mb-1" data-i18n="gettingStarted.step1.memory.layoutTitle">0. Directory layout</p>
277
+ <p class="mb-2 text-text-secondary" data-i18n="gettingStarted.step1.memory.layoutText">Create two folders anywhere on your machine (example: ~/mcp-memory/):</p>
278
+ <pre class="code-block mb-4 p-3 text-sm text-slate-200 bg-slate-900 rounded overflow-x-auto"><code>mcp-memory/
279
+ ├── qdrant/
280
+ │ ├── docker-compose.yml
281
+ │ ├── .env
282
+ │ ├── data/
283
+ │ └── snapshots/
284
+ └── nomic-embed/
285
+ ├── docker-compose.yml
286
+ └── .env</code></pre>
287
+
288
+ <!-- Qdrant -->
289
+ <p class="font-semibold mb-2" data-i18n="gettingStarted.step1.memory.qdrantTitle">1. Qdrant (vector DB, port 50008)</p>
290
+ <p class="text-xs text-text-secondary mb-1" data-i18n="gettingStarted.step1.memory.qdrantCompose">qdrant/docker-compose.yml</p>
291
+ <div class="bg-slate-900 rounded-lg overflow-hidden mb-3">
292
+ <div class="flex items-center justify-between px-3 py-2 bg-slate-800">
293
+ <span class="text-xs text-slate-300 font-medium">docker-compose.yml</span>
294
+ <button type="button" onclick="copyCode(this)" class="text-xs text-slate-300 hover:text-white transition-colors" data-i18n="gettingStarted.common.copy">Copy</button>
280
295
  </div>
281
- <div>
282
- <p class="font-medium mb-2" data-i18n="gettingStarted.step1.memory.optionB.title">Option B: Qdrant + OpenAI-Compatible Embedding API</p>
283
- <pre class="code-block mb-2 p-3 text-sm text-slate-200 bg-slate-900 rounded overflow-x-auto"><code>docker run -d --name mcp-qdrant -p 6333:6333 qdrant/qdrant</code></pre>
284
- <pre class="code-block p-3 text-sm text-slate-200 bg-slate-900 rounded overflow-x-auto"><code>{
296
+ <pre class="code-block p-4 text-sm text-slate-200 overflow-x-auto"><code>services:
297
+ qdrant:
298
+ image: qdrant/qdrant:latest
299
+ container_name: qdrant
300
+ restart: always
301
+ env_file:
302
+ - .env
303
+ ports:
304
+ - "50008:6333"
305
+ - "50009:6334"
306
+ volumes:
307
+ - ./data:/qdrant/storage
308
+ - ./snapshots:/qdrant/snapshots
309
+ environment:
310
+ - QDRANT__SERVICE__HTTP_PORT=6333
311
+ - QDRANT__SERVICE__GRPC_PORT=6334
312
+ - QDRANT__LOG_LEVEL=INFO
313
+ - QDRANT__SERVICE__API_KEY=${QDRANT_API_KEY}
314
+ healthcheck:
315
+ test:
316
+ - "CMD"
317
+ - "bash"
318
+ - "-c"
319
+ - "exec 3&lt;&gt;/dev/tcp/127.0.0.1/6333 &amp;&amp; printf 'GET /collections HTTP/1.1\r\nHost: localhost\r\napi-key: ${QDRANT_API_KEY}\r\nConnection: close\r\n\r\n' &gt;&amp;3 &amp;&amp; IFS= read -r line &lt;&amp;3 &amp;&amp; [[ \"$$line\" == *\"200\"* ]]"
320
+ interval: 30s
321
+ timeout: 10s
322
+ retries: 5
323
+ start_period: 30s</code></pre>
324
+ </div>
325
+ <p class="text-xs text-text-secondary mb-1" data-i18n="gettingStarted.step1.memory.qdrantEnv">qdrant/.env</p>
326
+ <div class="bg-slate-900 rounded-lg overflow-hidden mb-3">
327
+ <div class="flex items-center justify-between px-3 py-2 bg-slate-800">
328
+ <span class="text-xs text-slate-300 font-medium">.env</span>
329
+ <button type="button" onclick="copyCode(this)" class="text-xs text-slate-300 hover:text-white transition-colors" data-i18n="gettingStarted.common.copy">Copy</button>
330
+ </div>
331
+ <pre class="code-block p-4 text-sm text-slate-200 overflow-x-auto"><code># Generate: python -c "import secrets; print(secrets.token_urlsafe(32))"
332
+ QDRANT_API_KEY=change-me-to-a-long-random-string
333
+ QDRANT_URL=http://127.0.0.1:50008</code></pre>
334
+ </div>
335
+ <p class="text-xs font-medium mb-1" data-i18n="gettingStarted.step1.memory.qdrantDeploy">Start Qdrant</p>
336
+ <div class="bg-slate-900 rounded-lg overflow-hidden mb-3">
337
+ <div class="flex items-center justify-between px-3 py-2 bg-slate-800">
338
+ <span class="text-xs text-slate-300 font-medium">PowerShell / Bash</span>
339
+ <button type="button" onclick="copyCode(this)" class="text-xs text-slate-300 hover:text-white transition-colors" data-i18n="gettingStarted.common.copy">Copy</button>
340
+ </div>
341
+ <pre class="code-block p-4 text-sm text-slate-200 overflow-x-auto"><code>cd qdrant
342
+ mkdir data snapshots 2&gt;$null; mkdir -p data snapshots
343
+ docker compose up -d
344
+ docker compose ps</code></pre>
345
+ </div>
346
+ <p class="text-xs font-medium mb-1" data-i18n="gettingStarted.step1.memory.qdrantVerify">Verify Qdrant</p>
347
+ <div class="bg-slate-900 rounded-lg overflow-hidden mb-2">
348
+ <div class="flex items-center justify-between px-3 py-2 bg-slate-800">
349
+ <span class="text-xs text-slate-300 font-medium">curl</span>
350
+ <button type="button" onclick="copyCode(this)" class="text-xs text-slate-300 hover:text-white transition-colors" data-i18n="gettingStarted.common.copy">Copy</button>
351
+ </div>
352
+ <pre class="code-block p-4 text-sm text-slate-200 overflow-x-auto"><code>curl http://127.0.0.1:50008/collections \
353
+ -H "api-key: YOUR_QDRANT_API_KEY"</code></pre>
354
+ </div>
355
+ <p class="mb-4 text-xs text-text-secondary" data-i18n="gettingStarted.step1.memory.qdrantNote">When API key is enabled, all requests need header api-key. Dashboard: http://127.0.0.1:50008/dashboard</p>
356
+
357
+ <!-- Nomic Embed -->
358
+ <p class="font-semibold mb-2" data-i18n="gettingStarted.step1.memory.nomicTitle">2. Nomic Embed / Infinity (embeddings, port 50012)</p>
359
+ <p class="text-xs text-text-secondary mb-1" data-i18n="gettingStarted.step1.memory.nomicCompose">nomic-embed/docker-compose.yml</p>
360
+ <div class="bg-slate-900 rounded-lg overflow-hidden mb-3">
361
+ <div class="flex items-center justify-between px-3 py-2 bg-slate-800">
362
+ <span class="text-xs text-slate-300 font-medium">docker-compose.yml</span>
363
+ <button type="button" onclick="copyCode(this)" class="text-xs text-slate-300 hover:text-white transition-colors" data-i18n="gettingStarted.common.copy">Copy</button>
364
+ </div>
365
+ <pre class="code-block p-4 text-sm text-slate-200 overflow-x-auto"><code>services:
366
+ nomic-embed:
367
+ image: michaelf34/infinity:0.0.70
368
+ container_name: nomic-embed
369
+ restart: unless-stopped
370
+ ports:
371
+ - "50012:7997"
372
+ volumes:
373
+ - hf_cache:/app/.cache
374
+ environment:
375
+ INFINITY_API_KEY: ${INFINITY_API_KEY}
376
+ command:
377
+ - v2
378
+ - --model-id
379
+ - nomic-ai/nomic-embed-text-v1.5
380
+ - --revision
381
+ - main
382
+ - --dtype
383
+ - float32
384
+ - --batch-size
385
+ - "8"
386
+ - --engine
387
+ - torch
388
+ - --port
389
+ - "7997"
390
+ - --no-bettertransformer
391
+ healthcheck:
392
+ test:
393
+ - "CMD"
394
+ - "curl"
395
+ - "-f"
396
+ - "http://127.0.0.1:7997/health"
397
+ interval: 30s
398
+ timeout: 10s
399
+ retries: 5
400
+ start_period: 120s
401
+
402
+ volumes:
403
+ hf_cache:</code></pre>
404
+ </div>
405
+ <p class="text-xs text-text-secondary mb-1" data-i18n="gettingStarted.step1.memory.nomicEnv">nomic-embed/.env</p>
406
+ <div class="bg-slate-900 rounded-lg overflow-hidden mb-3">
407
+ <div class="flex items-center justify-between px-3 py-2 bg-slate-800">
408
+ <span class="text-xs text-slate-300 font-medium">.env</span>
409
+ <button type="button" onclick="copyCode(this)" class="text-xs text-slate-300 hover:text-white transition-colors" data-i18n="gettingStarted.common.copy">Copy</button>
410
+ </div>
411
+ <pre class="code-block p-4 text-sm text-slate-200 overflow-x-auto"><code># Generate: python -c "import secrets; print(secrets.token_urlsafe(32))"
412
+ INFINITY_API_KEY=change-me-to-a-long-random-string</code></pre>
413
+ </div>
414
+ <p class="text-xs font-medium mb-1" data-i18n="gettingStarted.step1.memory.nomicDeploy">Start embedding service</p>
415
+ <div class="bg-slate-900 rounded-lg overflow-hidden mb-3">
416
+ <div class="flex items-center justify-between px-3 py-2 bg-slate-800">
417
+ <span class="text-xs text-slate-300 font-medium">PowerShell / Bash</span>
418
+ <button type="button" onclick="copyCode(this)" class="text-xs text-slate-300 hover:text-white transition-colors" data-i18n="gettingStarted.common.copy">Copy</button>
419
+ </div>
420
+ <pre class="code-block p-4 text-sm text-slate-200 overflow-x-auto"><code>cd nomic-embed
421
+ docker compose up -d
422
+ docker logs -f nomic-embed
423
+ # Wait for: ready to batch requests</code></pre>
424
+ </div>
425
+ <p class="text-xs font-medium mb-1" data-i18n="gettingStarted.step1.memory.nomicVerify">Verify embeddings</p>
426
+ <div class="bg-slate-900 rounded-lg overflow-hidden mb-2">
427
+ <div class="flex items-center justify-between px-3 py-2 bg-slate-800">
428
+ <span class="text-xs text-slate-300 font-medium">curl</span>
429
+ <button type="button" onclick="copyCode(this)" class="text-xs text-slate-300 hover:text-white transition-colors" data-i18n="gettingStarted.common.copy">Copy</button>
430
+ </div>
431
+ <pre class="code-block p-4 text-sm text-slate-200 overflow-x-auto"><code>curl http://127.0.0.1:50012/health
432
+
433
+ curl http://127.0.0.1:50012/embeddings \
434
+ -H "Authorization: Bearer YOUR_INFINITY_API_KEY" \
435
+ -H "Content-Type: application/json" \
436
+ -d '{"model":"nomic-ai/nomic-embed-text-v1.5","input":"hello world"}'
437
+ # Expect data[0].embedding length = 768</code></pre>
438
+ </div>
439
+ <p class="mb-4 text-xs text-text-secondary" data-i18n="gettingStarted.step1.memory.nomicNote">First start downloads the model (~2–5 min). Use POST /embeddings (not /v1/embeddings). Returns 768-dim vectors.</p>
440
+
441
+ <!-- MCP -->
442
+ <p class="font-semibold mb-2" data-i18n="gettingStarted.step1.memory.mcpTitle">3. MCP client configuration</p>
443
+ <div class="bg-slate-900 rounded-lg overflow-hidden mb-2">
444
+ <div class="flex items-center justify-between px-3 py-2 bg-slate-800">
445
+ <span class="text-xs text-slate-300 font-medium">Cursor / Claude Desktop mcpServers</span>
446
+ <button type="button" onclick="copyCode(this)" class="text-xs text-slate-300 hover:text-white transition-colors" data-i18n="gettingStarted.common.copy">Copy</button>
447
+ </div>
448
+ <pre class="code-block p-4 text-sm text-slate-200 overflow-x-auto"><code>{
285
449
  "mcpServers": {
286
450
  "mcp-probe-kit": {
287
451
  "command": "npx",
288
452
  "args": ["-y", "mcp-probe-kit@latest"],
289
453
  "env": {
290
- "MEMORY_QDRANT_URL": "http://127.0.0.1:6333",
454
+ "MEMORY_QDRANT_URL": "http://127.0.0.1:50008",
455
+ "MEMORY_QDRANT_API_KEY": "same-as-qdrant-.env-QDRANT_API_KEY",
291
456
  "MEMORY_QDRANT_COLLECTION": "mcp_probe_memory",
292
- "MEMORY_QDRANT_API_KEY": "",
293
457
  "MEMORY_EMBEDDING_PROVIDER": "openai-compatible",
294
- "MEMORY_EMBEDDING_URL": "https://your-embedding-endpoint/v1/embeddings",
295
- "MEMORY_EMBEDDING_API_KEY": "your-api-key",
296
- "MEMORY_EMBEDDING_MODEL": "text-embedding-3-small",
458
+ "MEMORY_EMBEDDING_URL": "http://127.0.0.1:50012/embeddings",
459
+ "MEMORY_EMBEDDING_MODEL": "nomic-ai/nomic-embed-text-v1.5",
460
+ "MEMORY_EMBEDDING_API_KEY": "same-as-nomic-embed-.env-INFINITY_API_KEY",
297
461
  "MEMORY_SEARCH_LIMIT": "3",
298
462
  "MEMORY_SUMMARY_MAX_CHARS": "280"
299
463
  }
300
464
  }
301
465
  }
302
466
  }</code></pre>
467
+ </div>
468
+ <p class="mb-4 text-xs text-text-secondary" data-i18n="gettingStarted.step1.memory.mcpNote">Use the same keys as in qdrant/.env and nomic-embed/.env. Restart Cursor after saving.</p>
469
+
470
+ <p class="font-medium mb-2" data-i18n="gettingStarted.step1.memory.alternativesTitle">Other embedding options</p>
471
+ <div class="space-y-3">
472
+ <div>
473
+ <p class="font-medium mb-2" data-i18n="gettingStarted.step1.memory.optionB.title">Option B: Qdrant + Ollama</p>
474
+ <pre class="code-block mb-2 p-3 text-sm text-slate-200 bg-slate-900 rounded overflow-x-auto"><code>docker run -d --name mcp-qdrant -p 6333:6333 qdrant/qdrant
475
+ ollama pull nomic-embed-text</code></pre>
476
+ <pre class="code-block p-3 text-sm text-slate-200 bg-slate-900 rounded overflow-x-auto"><code>"MEMORY_QDRANT_URL": "http://127.0.0.1:6333",
477
+ "MEMORY_EMBEDDING_PROVIDER": "ollama",
478
+ "MEMORY_EMBEDDING_URL": "http://127.0.0.1:11434/api/embeddings",
479
+ "MEMORY_EMBEDDING_MODEL": "nomic-embed-text"</code></pre>
480
+ </div>
481
+ <div>
482
+ <p class="font-medium mb-2" data-i18n="gettingStarted.step1.memory.optionC.title">Option C: Qdrant + hosted OpenAI-compatible API</p>
483
+ <pre class="code-block p-3 text-sm text-slate-200 bg-slate-900 rounded overflow-x-auto"><code>"MEMORY_QDRANT_URL": "http://127.0.0.1:50008",
484
+ "MEMORY_EMBEDDING_PROVIDER": "openai-compatible",
485
+ "MEMORY_EMBEDDING_URL": "https://your-embedding-endpoint/v1/embeddings",
486
+ "MEMORY_EMBEDDING_API_KEY": "your-api-key",
487
+ "MEMORY_EMBEDDING_MODEL": "text-embedding-3-small"</code></pre>
303
488
  </div>
304
489
  </div>
305
490
  <div class="mt-3">
@@ -511,6 +696,40 @@ npm run build</code></pre>
511
696
  </div>
512
697
  </div>
513
698
  </div>
699
+
700
+ <!-- OpenCode -->
701
+ <div class="border border-border rounded-lg overflow-hidden">
702
+ <button onclick="toggleClient('opencode')" class="w-full px-4 py-3 bg-bg-page flex items-center justify-between text-left hover:bg-gray-100 transition-colors">
703
+ <div class="flex items-center gap-2">
704
+ <span class="text-lg">🤖</span>
705
+ <span class="font-medium text-text-primary" data-i18n="gettingStarted.step2.opencode.title">OpenCode</span>
706
+ </div>
707
+ <svg class="w-5 h-5 text-text-tertiary transition-transform" id="opencode-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24">
708
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"/>
709
+ </svg>
710
+ </button>
711
+ <div id="opencode-content" class="hidden p-4 border-t border-border">
712
+ <p class="text-text-secondary text-sm mb-3"><span data-i18n="gettingStarted.step2.opencode.description">Create or edit</span> <code class="bg-gray-200 px-1 rounded text-xs">opencode.json</code> <span data-i18n="gettingStarted.step2.opencode.description2">in project root, or globally at</span> <code class="bg-gray-200 px-1 rounded text-xs">~/.config/opencode/opencode.json</code></p>
713
+ <div class="bg-slate-900 rounded-lg overflow-hidden">
714
+ <div class="flex items-center justify-between px-3 py-2 bg-slate-800">
715
+ <span class="text-xs text-slate-300 font-medium">opencode.json</span>
716
+ <button onclick="copyCode(this)" class="text-xs text-slate-300 hover:text-white transition-colors" data-i18n="gettingStarted.common.copy">Copy</button>
717
+ </div>
718
+ <pre class="code-block p-4 text-sm text-slate-200 overflow-x-auto"><code>{
719
+ "mcp": {
720
+ "mcp-probe-kit": {
721
+ "type": "local",
722
+ "command": ["npx", "-y", "mcp-probe-kit@latest"],
723
+ "enabled": true
724
+ }
725
+ }
726
+ }</code></pre>
727
+ </div>
728
+ <div class="p-3 mt-3 bg-blue-50 border-l-3 border-blue-500 rounded-r text-sm text-text-primary">
729
+ <strong>💡 <span data-i18n="gettingStarted.step2.opencode.note">Note:</span></strong><span data-i18n="gettingStarted.step2.opencode.noteText">OpenCode uses <code>"environment"</code> (not <code>"env"</code>) for env vars, <code>"mcp"</code> (not <code>"mcpServers"</code>), and <code>"command"</code> as an array with <code>"type": "local"</code> required. See <a href="https://opencode.ai/docs/mcp" target="_blank" rel="noopener" class="text-primary hover:underline">OpenCode MCP docs</a>.</span>
730
+ </div>
731
+ </div>
732
+ </div>
514
733
  </div>
515
734
  </section>
516
735
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "mcp-probe-kit",
3
- "version": "3.0.18",
4
- "description": "AI-Powered Development Toolkit - MCP Server with 28 tools covering code quality, development efficiency, project management, and UI/UX design. Features: Structured Output, Workflow Orchestration, UI/UX Pro Max, and Requirements Interview.",
3
+ "version": "3.0.21",
4
+ "description": "AI-Powered Development Toolkit - MCP Server with 29 tools covering code quality, development efficiency, project management, and UI/UX design. Features: Structured Output, Workflow Orchestration, UI/UX Pro Max, and Requirements Interview.",
5
5
  "mcpName": "io.github.mybolide/mcp-probe-kit",
6
6
  "type": "module",
7
7
  "main": "build/index.js",