mcp-probe-kit 3.0.23 → 3.0.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -100,9 +100,9 @@ A powerful MCP (Model Context Protocol) server providing **27 tools** covering t
100
100
  - Linux: `~/.config/Cursor/User/globalStorage/state.vscdb`
101
101
 
102
102
  **Memory tools:**
103
- - `search_memory` - Semantic search across the shared memory pool (optionally prefer `type` / `tags`); returns `id`, `score`, `summary`, and `description` in both text output and `structuredContent` (for MCP clients that only surface `content[0].text`)
103
+ - `search_memory` - Semantic search across the shared memory pool (optionally prefer `type` / `tags`); text output includes `id`, `score`, summary, description, and a `--- content ---` body (default up to 1500 chars via `MEMORY_SEARCH_CONTENT_MAX_CHARS`)
104
104
  - `memorize_asset` - Persist reusable code/spec/pattern assets into vector memory
105
- - `read_memory_asset` - Read full asset content by `asset_id`
105
+ - `read_memory_asset` - Read full asset content by `asset_id` (text output includes the full `content` body)
106
106
  - `scan_and_extract_patterns` - Extract reusable patterns from code/file/directory before deciding whether to persist
107
107
 
108
108
  **Cross-repo memory pools:** do not rely on `source_project` / `source_path` for shared retrieval; put file paths in `content` instead. Search injection hides foreign `sourcePath` unless `MEMORY_REPO_ID` matches or `MEMORY_SEARCH_SHOW_SOURCE=true`.
@@ -20,6 +20,7 @@ describe('memory injection auto-load', () => {
20
20
  type: 'bugfix',
21
21
  description: 'Feishu proxy mismatch',
22
22
  summary: 'proxy caused 400 on HTTPS',
23
+ content: '【现象】submit 成功但 sync_failed\n【根因】HTTP_PROXY 污染\n【修复】proxy:false',
23
24
  tags: ['bugfix', 'proxy'],
24
25
  },
25
26
  ],
@@ -20,6 +20,7 @@ describe('memory-orchestration', () => {
20
20
  type: 'bugfix',
21
21
  description: 'desc',
22
22
  summary: 'summary',
23
+ content: '',
23
24
  tags: ['bugfix'],
24
25
  sourceProject: 'zhixing/gongyingshang',
25
26
  sourcePath: 'admin-api/app.js',
@@ -41,6 +42,7 @@ describe('memory-orchestration', () => {
41
42
  type: 'bugfix',
42
43
  description: '',
43
44
  summary: '',
45
+ content: '',
44
46
  tags: [],
45
47
  sourceProject: 'zhixing/gongyingshang',
46
48
  sourcePath: 'admin-api/app.js',
@@ -52,6 +54,7 @@ describe('memory-orchestration', () => {
52
54
  type: 'bugfix',
53
55
  description: '',
54
56
  summary: '',
57
+ content: '',
55
58
  tags: [],
56
59
  sourceProject: 'other/repo',
57
60
  sourcePath: 'src/index.ts',
@@ -73,6 +76,7 @@ describe('memory-orchestration', () => {
73
76
  type: 'bugfix',
74
77
  description: '',
75
78
  summary: 's',
79
+ content: '',
76
80
  tags: [],
77
81
  sourcePath: 'admin-api/app.js',
78
82
  },
@@ -23,6 +23,8 @@ export interface MemorySearchResult {
23
23
  type: string;
24
24
  description: string;
25
25
  summary: string;
26
+ /** Full payload content from Qdrant (may be empty on legacy points) */
27
+ content: string;
26
28
  tags: string[];
27
29
  sourceProject?: string;
28
30
  sourcePath?: string;
@@ -245,6 +245,7 @@ export class MemoryClient {
245
245
  type: fields.type,
246
246
  description: fields.description,
247
247
  summary: truncate(fields.summary, this.config.summaryMaxChars),
248
+ content: fields.content,
248
249
  tags: fields.tags,
249
250
  sourceProject: fields.sourceProject,
250
251
  sourcePath: fields.sourcePath,
@@ -16,6 +16,8 @@ export interface MemoryConfig {
16
16
  repoId: string;
17
17
  /** Max chars of each asset content injected into start_* guides */
18
18
  injectionContentMaxChars: number;
19
+ /** Max chars of content in search_memory text; 0 = omit content block */
20
+ searchContentMaxChars: number;
19
21
  }
20
22
  export declare function getMemoryConfig(): MemoryConfig;
21
23
  export declare function isMemoryEnabled(config?: MemoryConfig): boolean;
@@ -40,6 +40,7 @@ export function getMemoryConfig() {
40
40
  searchMinScore: getOptionalNumberEnv('MEMORY_SEARCH_MIN_SCORE', 0),
41
41
  repoId: (process.env.MEMORY_REPO_ID || '').trim(),
42
42
  injectionContentMaxChars: getNumberEnv('MEMORY_INJECTION_CONTENT_MAX_CHARS', 1500),
43
+ searchContentMaxChars: getOptionalNumberEnv('MEMORY_SEARCH_CONTENT_MAX_CHARS', 1500),
43
44
  };
44
45
  }
45
46
  export function isMemoryEnabled(config = getMemoryConfig()) {
@@ -15,6 +15,10 @@ export declare function truncateInjectionText(value: string, maxChars: number):
15
15
  export declare function loadMemoryInjectionContext(query: string, kind?: MemoryPlanKind): Promise<MemoryInjectionContext>;
16
16
  export declare function formatSearchMemoryResultsText(results: MemorySearchResult[], config?: MemoryConfig): string;
17
17
  export declare function shouldShowSourceInSearch(item: MemorySearchResult, config?: MemoryConfig): boolean;
18
+ export declare function formatMemoryAssetText(asset: MemoryAsset, options?: {
19
+ maxContentChars?: number;
20
+ }): string;
21
+ export declare function formatReadMemoryAssetText(asset: MemoryAsset): string;
18
22
  export declare function renderMemoryGuideSection(context: MemoryInjectionContext): string;
19
23
  export declare function buildMemoryPlanStep(kind?: MemoryPlanKind): {
20
24
  id: string;
@@ -93,7 +93,17 @@ export function formatSearchMemoryResultsText(results, config = getMemoryConfig(
93
93
  if (shouldShowSourceInSearch(item, config) && item.sourcePath) {
94
94
  lines.push(` - 来源: ${item.sourcePath}`);
95
95
  }
96
- lines.push(` - 全文: read_memory_asset {"asset_id": "${item.id}"}`);
96
+ if (config.searchContentMaxChars > 0) {
97
+ const body = truncateInjectionText(item.content || '', config.searchContentMaxChars);
98
+ lines.push(' --- content ---');
99
+ lines.push(body
100
+ ? body
101
+ .split('\n')
102
+ .map((line) => ` ${line}`)
103
+ .join('\n')
104
+ : ' (empty)');
105
+ }
106
+ lines.push(` - 更长全文: read_memory_asset {"asset_id": "${item.id}"}`);
97
107
  return lines.filter(Boolean).join('\n');
98
108
  });
99
109
  return `${header}\n\n${items.join('\n\n')}`;
@@ -113,23 +123,36 @@ function formatSourceHint(item, config) {
113
123
  }
114
124
  return `\n - 来源: ${item.sourcePath}`;
115
125
  }
116
- function formatAssetBody(asset, config) {
126
+ export function formatMemoryAssetText(asset, options) {
127
+ const content = options?.maxContentChars !== undefined
128
+ ? truncateInjectionText(asset.content, options.maxContentChars)
129
+ : asset.content;
117
130
  const lines = [
118
131
  `### ${asset.name}`,
119
132
  `- asset_id: ${asset.id}`,
133
+ asset.type ? `- type: ${asset.type}` : '',
134
+ asset.summary ? `- 摘要: ${asset.summary}` : '',
120
135
  asset.description ? `- 描述: ${asset.description}` : '',
121
136
  asset.usage ? `- 适用: ${asset.usage}` : '',
122
137
  asset.tags.length > 0 ? `- 标签: ${asset.tags.join(', ')}` : '',
138
+ asset.sourcePath ? `- 来源: ${asset.sourcePath}` : '',
123
139
  '',
124
- truncateInjectionText(asset.content, config.injectionContentMaxChars),
140
+ '--- content ---',
141
+ content || '(empty)',
125
142
  ].filter(Boolean);
126
143
  return lines.join('\n');
127
144
  }
145
+ export function formatReadMemoryAssetText(asset) {
146
+ return `已读取记忆资产: ${asset.name}\n\n${formatMemoryAssetText(asset)}`;
147
+ }
148
+ function formatAssetBody(asset, config) {
149
+ return formatMemoryAssetText(asset, { maxContentChars: config.injectionContentMaxChars });
150
+ }
128
151
  function formatResultBlock(item, index, context, config) {
129
152
  const label = formatMemoryResultLabel(item);
130
153
  const asset = context.assetsById[item.id];
131
154
  const header = `${index + 1}. ${label} score=${item.score.toFixed(3)}\n - 摘要: ${item.summary}${formatSourceHint(item, config)}`;
132
- if (asset?.content) {
155
+ if (asset) {
133
156
  return `${header}\n\n${formatAssetBody(asset, config)}\n`;
134
157
  }
135
158
  return `${header}\n - 全文加载失败,可手动: read_memory_asset {"asset_id": "${item.id}"}\n`;
@@ -145,7 +168,7 @@ export function renderMemoryGuideSection(context) {
145
168
  if (context.results.length === 0) {
146
169
  return `\n\n## 🧠 记忆系统\n- 状态: 已启用\n- 检索结果: 未找到高相关记录(含历史 Bug 修复与可复用模式)\n- 处理: 继续主流程;Bug 修复验证通过后必须 \`memorize_asset\` 沉淀;功能/UI 有可复用产出再沉淀\n`;
147
170
  }
148
- const loadedCount = context.results.filter((item) => context.assetsById[item.id]?.content).length;
171
+ const loadedCount = context.results.filter((item) => Boolean(context.assetsById[item.id])).length;
149
172
  const items = context.results
150
173
  .map((item, index) => formatResultBlock(item, index, context, config))
151
174
  .join('\n');
@@ -0,0 +1,75 @@
1
+ import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest';
2
+ const getAssetMock = vi.fn();
3
+ const isReadEnabledMock = vi.fn();
4
+ vi.mock('../../lib/memory-client.js', () => ({
5
+ createMemoryClient: () => ({
6
+ isReadEnabled: isReadEnabledMock,
7
+ getAsset: getAssetMock,
8
+ }),
9
+ }));
10
+ import { readMemoryAsset } from '../read_memory_asset.js';
11
+ import { formatReadMemoryAssetText } from '../../lib/memory-orchestration.js';
12
+ beforeEach(() => {
13
+ isReadEnabledMock.mockReset();
14
+ getAssetMock.mockReset();
15
+ });
16
+ afterEach(() => {
17
+ vi.clearAllMocks();
18
+ });
19
+ describe('formatReadMemoryAssetText', () => {
20
+ test('includes full content body', () => {
21
+ const text = formatReadMemoryAssetText({
22
+ id: 'asset-1',
23
+ name: 'playwright-e2e-testing-speed-pattern',
24
+ type: 'pattern',
25
+ description: 'Speed up Playwright E2E suites',
26
+ summary: 'Playwright E2E parallelization pattern',
27
+ content: 'export const parallelWorkers = 4;\n// use sharding',
28
+ tags: ['pattern', 'e2e'],
29
+ confidence: 0.9,
30
+ createdAt: '2026-01-01T00:00:00.000Z',
31
+ updatedAt: '2026-01-01T00:00:00.000Z',
32
+ });
33
+ expect(text).toContain('已读取记忆资产: playwright-e2e-testing-speed-pattern');
34
+ expect(text).toContain('--- content ---');
35
+ expect(text).toContain('export const parallelWorkers = 4;');
36
+ expect(text).toContain('asset_id: asset-1');
37
+ });
38
+ });
39
+ describe('read_memory_asset 单元测试', () => {
40
+ test('记忆服务未开启时返回跳过结果', async () => {
41
+ isReadEnabledMock.mockReturnValue(false);
42
+ const result = await readMemoryAsset({ asset_id: 'asset-1' });
43
+ expect(result.isError).toBe(false);
44
+ expect('structuredContent' in result).toBe(true);
45
+ if (!('structuredContent' in result)) {
46
+ throw new Error('structuredContent 缺失');
47
+ }
48
+ expect(result.content[0].text).toContain('记忆服务未开启');
49
+ expect(getAssetMock).not.toHaveBeenCalled();
50
+ });
51
+ test('命中资产时文本输出包含完整 content', async () => {
52
+ isReadEnabledMock.mockReturnValue(true);
53
+ getAssetMock.mockResolvedValue({
54
+ id: 'asset-1',
55
+ name: 'feishu-proxy-bug',
56
+ type: 'bugfix',
57
+ description: 'Feishu proxy mismatch',
58
+ summary: 'proxy caused 400 on HTTPS',
59
+ content: '【现象】submit 成功\n【根因】HTTP_PROXY 污染\n【修复】proxy:false',
60
+ tags: ['bugfix'],
61
+ confidence: 0.9,
62
+ createdAt: '2026-01-01T00:00:00.000Z',
63
+ updatedAt: '2026-01-01T00:00:00.000Z',
64
+ });
65
+ const result = await readMemoryAsset({ asset_id: 'asset-1' });
66
+ expect(result.isError).toBe(false);
67
+ expect('structuredContent' in result).toBe(true);
68
+ if (!('structuredContent' in result)) {
69
+ throw new Error('structuredContent 缺失');
70
+ }
71
+ expect(result.content[0].text).toContain('【现象】submit 成功');
72
+ expect(result.content[0].text).toContain('【修复】proxy:false');
73
+ expect(result.structuredContent.asset.content).toContain('【根因】HTTP_PROXY 污染');
74
+ });
75
+ });
@@ -17,7 +17,7 @@ afterEach(() => {
17
17
  vi.clearAllMocks();
18
18
  });
19
19
  describe('formatSearchMemoryResultsText', () => {
20
- test('renders id, summary, description and read hint', () => {
20
+ test('renders id, summary, description, content and read hint', () => {
21
21
  const text = formatSearchMemoryResultsText([
22
22
  {
23
23
  id: '6c97bd10-654e-4f25-a560-99f7469dc11a',
@@ -26,6 +26,7 @@ describe('formatSearchMemoryResultsText', () => {
26
26
  type: 'pattern',
27
27
  description: 'Speed up Playwright E2E suites',
28
28
  summary: 'Playwright E2E parallelization pattern',
29
+ content: 'export const parallelWorkers = 4;\n// use project-based sharding',
29
30
  tags: ['pattern', 'e2e'],
30
31
  },
31
32
  ]);
@@ -33,6 +34,8 @@ describe('formatSearchMemoryResultsText', () => {
33
34
  expect(text).toContain('id: 6c97bd10-654e-4f25-a560-99f7469dc11a');
34
35
  expect(text).toContain('摘要: Playwright E2E parallelization pattern');
35
36
  expect(text).toContain('描述: Speed up Playwright E2E suites');
37
+ expect(text).toContain('--- content ---');
38
+ expect(text).toContain('export const parallelWorkers = 4;');
36
39
  expect(text).toContain('read_memory_asset {"asset_id": "6c97bd10-654e-4f25-a560-99f7469dc11a"}');
37
40
  });
38
41
  test('returns empty-state text', () => {
@@ -62,6 +65,7 @@ describe('search_memory 单元测试', () => {
62
65
  type: 'bugfix',
63
66
  description: 'Feishu proxy mismatch',
64
67
  summary: 'proxy caused 400 on HTTPS',
68
+ content: '【现象】HTTPS 400\n【修复】修正 proxy 配置',
65
69
  tags: ['bugfix', 'proxy'],
66
70
  },
67
71
  ]);
@@ -74,6 +78,8 @@ describe('search_memory 单元测试', () => {
74
78
  expect(result.content[0].text).toContain('id: asset-1');
75
79
  expect(result.content[0].text).toContain('摘要: proxy caused 400 on HTTPS');
76
80
  expect(result.content[0].text).toContain('描述: Feishu proxy mismatch');
81
+ expect(result.content[0].text).toContain('--- content ---');
82
+ expect(result.content[0].text).toContain('【修复】修正 proxy 配置');
77
83
  expect(result.structuredContent.results[0]).toEqual(expect.objectContaining({
78
84
  id: 'asset-1',
79
85
  description: 'Feishu proxy mismatch',
@@ -1,5 +1,6 @@
1
1
  import { okStructured } from '../lib/response.js';
2
2
  import { createMemoryClient } from '../lib/memory-client.js';
3
+ import { formatReadMemoryAssetText } from '../lib/memory-orchestration.js';
3
4
  import { handleToolError } from '../utils/error-handler.js';
4
5
  export async function readMemoryAsset(args) {
5
6
  try {
@@ -15,7 +16,7 @@ export async function readMemoryAsset(args) {
15
16
  if (!asset) {
16
17
  return okStructured(`未找到记忆资产: ${assetId}`, { enabled: true, asset: null });
17
18
  }
18
- return okStructured(`已读取记忆资产: ${asset.name}`, {
19
+ return okStructured(formatReadMemoryAssetText(asset), {
19
20
  enabled: true,
20
21
  asset,
21
22
  });
@@ -42,6 +42,7 @@ export async function searchMemory(args) {
42
42
  type: item.type,
43
43
  description: item.description,
44
44
  summary: item.summary,
45
+ content: item.content,
45
46
  tags: item.tags,
46
47
  sourcePath: shouldShowSourceInSearch(item, config) ? item.sourcePath : undefined,
47
48
  }));
@@ -412,7 +412,7 @@ verbose: true`
412
412
  { name: 'tags', type: 'array', required: false, desc: '优先匹配的标签' },
413
413
  { name: 'limit', type: 'number', required: false, desc: '返回条数' }
414
414
  ],
415
- usage: '在 start_* 之外主动查找历史 Bug 修复或可复用模式;返回文本含 id/score/summary/description,并附带 structuredContent.results',
415
+ usage: '在 start_* 之外主动查找历史 Bug 修复或可复用模式;文本含 id/score/摘要/描述及 --- content --- 正文(默认最多 1500 字,可用 MEMORY_SEARCH_CONTENT_MAX_CHARS 调整)',
416
416
  example: `// 使用示例
417
417
  你: 请使用 search_memory 搜索 proxy 相关 bugfix
418
418
 
@@ -427,7 +427,7 @@ limit: 5`
427
427
  params: [
428
428
  { name: 'asset_id', type: 'string', required: true, desc: '资产唯一 ID' }
429
429
  ],
430
- usage: '当工作流或搜索结果已经找到 memory 摘要后,用它读取完整可复用资产',
430
+ usage: '当工作流或搜索结果已经找到 memory 摘要后,用它读取完整可复用资产;文本输出含 --- content --- 全文与 structuredContent.asset',
431
431
  example: `// 使用示例
432
432
  你: 请使用 read_memory_asset 工具读取资产
433
433
 
@@ -168,11 +168,11 @@
168
168
  },
169
169
  "search_memory": {
170
170
  "description": "Semantic search across the shared memory pool, with optional type/tags preference",
171
- "usage": "Use outside start_* to find historical bugfixes or patterns; text output includes id/score/summary/description; follow with read_memory_asset for full content"
171
+ "usage": "Use outside start_* to find historical bugfixes or patterns; text output includes id/score/summary/description and a --- content --- body (default 1500 chars; use read_memory_asset for unlimited full text)"
172
172
  },
173
173
  "read_memory_asset": {
174
174
  "description": "Read the full content and metadata of a stored memory asset by asset ID",
175
- "usage": "Use this after a workflow or search result already found a memory summary and you need the full reusable artifact"
175
+ "usage": "Use after search_memory or orchestration hits; text output includes the full --- content --- body plus structuredContent.asset"
176
176
  },
177
177
  "memorize_asset": {
178
178
  "description": "Persist high-value code, spec, or pattern assets into the vector memory system for later reuse",
@@ -168,11 +168,11 @@
168
168
  },
169
169
  "search_memory": {
170
170
  "description": "按语义检索共享记忆库,支持 type/tags 优先排序",
171
- "usage": "在 start_* 之外主动查找历史 Bug 修复或可复用模式;文本输出含 id/score/摘要/描述,命中后用 read_memory_asset 读全文"
171
+ "usage": "在 start_* 之外主动查找历史 Bug 修复或可复用模式;文本输出含 id/score/摘要/描述及 --- content --- 正文(默认最多 1500 字,更长全文用 read_memory_asset"
172
172
  },
173
173
  "read_memory_asset": {
174
174
  "description": "按资产 ID 读取已沉淀记忆的完整内容与元数据",
175
- "usage": "当编排阶段已经命中记忆摘要,需要进一步查看完整代码、规范或模式详情时使用"
175
+ "usage": "当编排阶段已经命中记忆摘要时使用;文本输出含 --- content --- 全文(代码/配置/详细描述)"
176
176
  },
177
177
  "memorize_asset": {
178
178
  "description": "把高价值代码、规范或模式写入向量记忆系统,供后续复用",
package/docs/i18n/en.json CHANGED
@@ -14,14 +14,14 @@
14
14
  "hero": {
15
15
  "title": "🚀 MCP Probe Kit",
16
16
  "subtitle": "AI Development Enhancement Toolkit · Documentation Center",
17
- "version": "v3.0.23",
17
+ "version": "v3.0.24",
18
18
  "quickStart": "Quick Start",
19
19
  "visitMainSite": "Visit ByteZoneX"
20
20
  },
21
21
  "sections": {
22
22
  "quickStart": {
23
23
  "title": "Quick Start",
24
- "description": "Get started with MCP Probe Kit v3.0.23 in 5 minutes",
24
+ "description": "Get started with MCP Probe Kit v3.0.24 in 5 minutes",
25
25
  "installConfig": "Installation & Configuration"
26
26
  },
27
27
  "tools": {
@@ -63,7 +63,7 @@
63
63
  },
64
64
  "gettingStarted": {
65
65
  "title": "Installation & Configuration",
66
- "subtitle": "Get started with MCP Probe Kit v3.0.23 in 5 minutes. Supports Cursor, Cline, and Claude Desktop",
66
+ "subtitle": "Get started with MCP Probe Kit v3.0.24 in 5 minutes. Supports Cursor, Cline, and Claude Desktop",
67
67
  "breadcrumb": {
68
68
  "home": "Documentation",
69
69
  "quickStart": "Quick Start",
package/docs/i18n/ja.json CHANGED
@@ -14,14 +14,14 @@
14
14
  "hero": {
15
15
  "title": "🚀 MCP Probe Kit",
16
16
  "subtitle": "AI開発強化ツールキット · ドキュメントセンター",
17
- "version": "v3.0.23",
17
+ "version": "v3.0.24",
18
18
  "quickStart": "クイックスタート",
19
19
  "visitMainSite": "ByteZoneXを訪問"
20
20
  },
21
21
  "sections": {
22
22
  "quickStart": {
23
23
  "title": "クイックスタート",
24
- "description": "5分でMCP Probe Kit v3.0.23を始める",
24
+ "description": "5分でMCP Probe Kit v3.0.24を始める",
25
25
  "installConfig": "インストールと設定"
26
26
  },
27
27
  "tools": {
package/docs/i18n/ko.json CHANGED
@@ -14,14 +14,14 @@
14
14
  "hero": {
15
15
  "title": "🚀 MCP Probe Kit",
16
16
  "subtitle": "AI 개발 강화 툴킷 · 문서 센터",
17
- "version": "v3.0.23",
17
+ "version": "v3.0.24",
18
18
  "quickStart": "빠른 시작",
19
19
  "visitMainSite": "ByteZoneX 방문"
20
20
  },
21
21
  "sections": {
22
22
  "quickStart": {
23
23
  "title": "빠른 시작",
24
- "description": "5분 안에 MCP Probe Kit v3.0.23 시작하기",
24
+ "description": "5분 안에 MCP Probe Kit v3.0.24 시작하기",
25
25
  "installConfig": "설치 및 구성"
26
26
  },
27
27
  "tools": {
@@ -14,14 +14,14 @@
14
14
  "hero": {
15
15
  "title": "🚀 MCP Probe Kit",
16
16
  "subtitle": "AI 开发增强工具集 · 文档中心",
17
- "version": "v3.0.23",
17
+ "version": "v3.0.24",
18
18
  "quickStart": "快速开始",
19
19
  "visitMainSite": "访问主站 ByteZoneX"
20
20
  },
21
21
  "sections": {
22
22
  "quickStart": {
23
23
  "title": "快速开始",
24
- "description": "5 分钟快速上手 MCP Probe Kit v3.0.23",
24
+ "description": "5 分钟快速上手 MCP Probe Kit v3.0.24",
25
25
  "installConfig": "安装配置"
26
26
  },
27
27
  "tools": {
@@ -63,7 +63,7 @@
63
63
  },
64
64
  "gettingStarted": {
65
65
  "title": "安装配置",
66
- "subtitle": "5 分钟快速上手 MCP Probe Kit v3.0.23,支持 Cursor、Cline 和 Claude Desktop",
66
+ "subtitle": "5 分钟快速上手 MCP Probe Kit v3.0.24,支持 Cursor、Cline 和 Claude Desktop",
67
67
  "breadcrumb": {
68
68
  "home": "文档首页",
69
69
  "quickStart": "快速开始",
@@ -262,6 +262,7 @@ After changing env, **fully restart** your MCP client (e.g. quit and reopen Curs
262
262
  | `MEMORY_EMBEDDING_PROVIDER` | No | Must be `openai-compatible` for Infinity |
263
263
  | `MEMORY_EMBEDDING_API_KEY` | Yes for Infinity | Bearer token = `INFINITY_API_KEY` |
264
264
  | `MEMORY_SEARCH_LIMIT` | No | Default `3` |
265
+ | `MEMORY_SEARCH_CONTENT_MAX_CHARS` | No | Max `content` chars in `search_memory` text; default `1500`, `0` = summary only |
265
266
  | `MEMORY_SUMMARY_MAX_CHARS` | No | Default `280` |
266
267
 
267
268
  ---
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mcp-probe-kit",
3
- "version": "3.0.23",
3
+ "version": "3.0.24",
4
4
  "description": "AI-Powered Development Toolkit - MCP Server with 27 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",