@muleiwu/mdoc-mcp 0.2.0 → 0.3.1
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/dist/index.js
CHANGED
|
@@ -5,6 +5,7 @@ import * as z from 'zod/v4';
|
|
|
5
5
|
import { createClientFromEnv } from './client.js';
|
|
6
6
|
import { getManifest } from './tools/get-manifest.js';
|
|
7
7
|
import { getArticleContent } from './tools/get-article-content.js';
|
|
8
|
+
import { searchInDocument } from './tools/search-in-document.js';
|
|
8
9
|
const server = new McpServer({
|
|
9
10
|
name: 'mdoc-mcp',
|
|
10
11
|
version: '0.1.0',
|
|
@@ -98,6 +99,59 @@ server.registerTool('get_article_content', {
|
|
|
98
99
|
};
|
|
99
100
|
}
|
|
100
101
|
});
|
|
102
|
+
// Tool: search_in_document
|
|
103
|
+
server.registerTool('search_in_document', {
|
|
104
|
+
title: '文档语义搜索',
|
|
105
|
+
description: '在 mdoc 文档中进行语义搜索,根据关键词查找最相关的文章。' +
|
|
106
|
+
'返回匹配文章的标题、相关度、内容摘要和链接。' +
|
|
107
|
+
'可以通过 mdoc.cc 网址或 orgSlug/docSlug 参数指定文档。' +
|
|
108
|
+
'示例网址格式:https://mdoc.cc/mliev/1ms 或 https://mdoc.cc/mliev/1ms/v1.0.0',
|
|
109
|
+
inputSchema: {
|
|
110
|
+
url: z
|
|
111
|
+
.string()
|
|
112
|
+
.optional()
|
|
113
|
+
.describe('mdoc 文档网址,如 https://mdoc.cc/mliev/1ms 或 https://mdoc.cc/mliev/1ms/v1.0.0。' +
|
|
114
|
+
'提供 url 时,orgSlug 和 docSlug 可省略。'),
|
|
115
|
+
orgSlug: z
|
|
116
|
+
.string()
|
|
117
|
+
.optional()
|
|
118
|
+
.describe('组织标识,如 mliev。当未提供 url 时必填。'),
|
|
119
|
+
docSlug: z
|
|
120
|
+
.string()
|
|
121
|
+
.optional()
|
|
122
|
+
.describe('文档标识,如 1ms。当未提供 url 时必填。'),
|
|
123
|
+
version: z
|
|
124
|
+
.string()
|
|
125
|
+
.optional()
|
|
126
|
+
.describe('版本名称,如 v1.0.0。不指定则使用文档默认版本。'),
|
|
127
|
+
query: z
|
|
128
|
+
.string()
|
|
129
|
+
.describe('搜索关键词,如「如何配置路由」'),
|
|
130
|
+
topK: z
|
|
131
|
+
.number()
|
|
132
|
+
.optional()
|
|
133
|
+
.describe('最大返回结果数,范围 1-20,默认 5。'),
|
|
134
|
+
minScore: z
|
|
135
|
+
.number()
|
|
136
|
+
.optional()
|
|
137
|
+
.describe('最小相似度阈值,范围 0-1,默认 0.5。'),
|
|
138
|
+
},
|
|
139
|
+
}, async (args) => {
|
|
140
|
+
try {
|
|
141
|
+
const client = createClientFromEnv();
|
|
142
|
+
const content = await searchInDocument(client, args);
|
|
143
|
+
return {
|
|
144
|
+
content: [{ type: 'text', text: content }],
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
149
|
+
return {
|
|
150
|
+
content: [{ type: 'text', text: `错误: ${message}` }],
|
|
151
|
+
isError: true,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
});
|
|
101
155
|
async function main() {
|
|
102
156
|
const transport = new StdioServerTransport();
|
|
103
157
|
await server.connect(transport);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { MdocClient } from '../client.js';
|
|
2
|
+
export interface SearchInDocumentInput {
|
|
3
|
+
url?: string;
|
|
4
|
+
orgSlug?: string;
|
|
5
|
+
docSlug?: string;
|
|
6
|
+
version?: string;
|
|
7
|
+
query: string;
|
|
8
|
+
topK?: number;
|
|
9
|
+
minScore?: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* 在文档中进行语义搜索
|
|
13
|
+
* 对应 API: GET /openapi/organizations/:orgSlug/documents/:docSlug/search
|
|
14
|
+
*/
|
|
15
|
+
export declare function searchInDocument(client: MdocClient, input: SearchInDocumentInput): Promise<string>;
|
|
16
|
+
//# sourceMappingURL=search-in-document.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-in-document.d.ts","sourceRoot":"","sources":["../../src/tools/search-in-document.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG1C,MAAM,WAAW,qBAAqB;IACpC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAoBD;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,qBAAqB,GAC3B,OAAO,CAAC,MAAM,CAAC,CAyEjB"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { parseMdocUrl } from '../url-parser.js';
|
|
2
|
+
/**
|
|
3
|
+
* 在文档中进行语义搜索
|
|
4
|
+
* 对应 API: GET /openapi/organizations/:orgSlug/documents/:docSlug/search
|
|
5
|
+
*/
|
|
6
|
+
export async function searchInDocument(client, input) {
|
|
7
|
+
let orgSlug;
|
|
8
|
+
let docSlug;
|
|
9
|
+
let version = input.version;
|
|
10
|
+
if (input.url) {
|
|
11
|
+
const parsed = parseMdocUrl(input.url);
|
|
12
|
+
orgSlug = parsed.orgSlug;
|
|
13
|
+
docSlug = parsed.docSlug;
|
|
14
|
+
if (!version && parsed.version) {
|
|
15
|
+
version = parsed.version;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
else if (input.orgSlug && input.docSlug) {
|
|
19
|
+
orgSlug = input.orgSlug;
|
|
20
|
+
docSlug = input.docSlug;
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
throw new Error('请提供 url 参数,或同时提供 orgSlug 和 docSlug 参数');
|
|
24
|
+
}
|
|
25
|
+
if (!input.query) {
|
|
26
|
+
throw new Error('请提供 query 参数(搜索关键词)');
|
|
27
|
+
}
|
|
28
|
+
const path = `/openapi/organizations/${encodeURIComponent(orgSlug)}/documents/${encodeURIComponent(docSlug)}/search`;
|
|
29
|
+
const query = {
|
|
30
|
+
q: input.query,
|
|
31
|
+
};
|
|
32
|
+
if (version) {
|
|
33
|
+
query['version'] = version;
|
|
34
|
+
}
|
|
35
|
+
if (input.topK !== undefined) {
|
|
36
|
+
query['top_k'] = String(input.topK);
|
|
37
|
+
}
|
|
38
|
+
if (input.minScore !== undefined) {
|
|
39
|
+
query['min_score'] = String(input.minScore);
|
|
40
|
+
}
|
|
41
|
+
const raw = await client.get({ path, query });
|
|
42
|
+
let resp;
|
|
43
|
+
try {
|
|
44
|
+
resp = JSON.parse(raw);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
throw new Error(`无法解析搜索响应: ${raw.slice(0, 200)}`);
|
|
48
|
+
}
|
|
49
|
+
if (resp.code !== 0) {
|
|
50
|
+
throw new Error(`搜索失败: ${resp.message}`);
|
|
51
|
+
}
|
|
52
|
+
const data = resp.data;
|
|
53
|
+
if (!data || data.results.length === 0) {
|
|
54
|
+
return `未找到与「${input.query}」相关的文章。`;
|
|
55
|
+
}
|
|
56
|
+
const lines = [
|
|
57
|
+
`共找到 ${data.total} 篇相关文章:`,
|
|
58
|
+
'',
|
|
59
|
+
];
|
|
60
|
+
for (const result of data.results) {
|
|
61
|
+
lines.push(`### ${result.title}`);
|
|
62
|
+
lines.push(`- 相关度: ${(result.score * 100).toFixed(1)}%`);
|
|
63
|
+
lines.push(`- 文章 ID: ${result.article_id}`);
|
|
64
|
+
if (result.content) {
|
|
65
|
+
lines.push(`- 摘要: ${result.content}`);
|
|
66
|
+
}
|
|
67
|
+
lines.push(`- Markdown 全文 (需携带 token 调用,仅限 API 访问): ${result.markdown_url}`);
|
|
68
|
+
lines.push(`- 浏览器链接: ${result.browser_url}`);
|
|
69
|
+
lines.push('');
|
|
70
|
+
}
|
|
71
|
+
return lines.join('\n');
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=search-in-document.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-in-document.js","sourceRoot":"","sources":["../../src/tools/search-in-document.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AA8BhD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAkB,EAClB,KAA4B;IAE5B,IAAI,OAAe,CAAC;IACpB,IAAI,OAAe,CAAC;IACpB,IAAI,OAAO,GAAuB,KAAK,CAAC,OAAO,CAAC;IAEhD,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;QACd,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACvC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QACzB,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QACzB,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YAC/B,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC3B,CAAC;IACH,CAAC;SAAM,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAC1C,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QACxB,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC1B,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,IAAI,GAAG,0BAA0B,kBAAkB,CAAC,OAAO,CAAC,cAAc,kBAAkB,CAAC,OAAO,CAAC,SAAS,CAAC;IACrH,MAAM,KAAK,GAA2B;QACpC,CAAC,EAAE,KAAK,CAAC,KAAK;KACf,CAAC;IACF,IAAI,OAAO,EAAE,CAAC;QACZ,KAAK,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC;IAC7B,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC7B,KAAK,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACjC,KAAK,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAE9C,IAAI,IAAuB,CAAC;IAC5B,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,aAAa,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACvB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvC,OAAO,QAAQ,KAAK,CAAC,KAAK,SAAS,CAAC;IACtC,CAAC;IAED,MAAM,KAAK,GAAa;QACtB,OAAO,IAAI,CAAC,KAAK,SAAS;QAC1B,EAAE;KACH,CAAC;IAEF,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACzD,KAAK,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QAC5C,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,KAAK,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QACxC,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,2CAA2C,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;QAC7E,KAAK,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QAC7C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|