@zakstam/convex-docs-mcp 1.0.0
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 +18 -0
- package/build/index.d.ts +3 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +132 -0
- package/build/index.js.map +1 -0
- package/build/tools/getPage.d.ts +12 -0
- package/build/tools/getPage.d.ts.map +1 -0
- package/build/tools/getPage.js +27 -0
- package/build/tools/getPage.js.map +1 -0
- package/build/tools/listTopics.d.ts +22 -0
- package/build/tools/listTopics.d.ts.map +1 -0
- package/build/tools/listTopics.js +47 -0
- package/build/tools/listTopics.js.map +1 -0
- package/build/tools/search.d.ts +15 -0
- package/build/tools/search.d.ts.map +1 -0
- package/build/tools/search.js +61 -0
- package/build/tools/search.js.map +1 -0
- package/build/types.d.ts +25 -0
- package/build/types.d.ts.map +1 -0
- package/build/types.js +2 -0
- package/build/types.js.map +1 -0
- package/build/utils/fetcher.d.ts +9 -0
- package/build/utils/fetcher.d.ts.map +1 -0
- package/build/utils/fetcher.js +39 -0
- package/build/utils/fetcher.js.map +1 -0
- package/build/utils/markdown.d.ts +5 -0
- package/build/utils/markdown.d.ts.map +1 -0
- package/build/utils/markdown.js +108 -0
- package/build/utils/markdown.js.map +1 -0
- package/build/utils/sitemap.d.ts +9 -0
- package/build/utils/sitemap.d.ts.map +1 -0
- package/build/utils/sitemap.js +195 -0
- package/build/utils/sitemap.js.map +1 -0
- package/package.json +55 -0
package/README.md
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Convex Documentation MCP Server
|
|
2
|
+
|
|
3
|
+
MCP server providing Claude Code with access to Convex documentation.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
claude mcp add convex-docs -- npx -y @zakstam/convex-docs-mcp
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
On Windows (not WSL):
|
|
12
|
+
```bash
|
|
13
|
+
claude mcp add convex-docs -- cmd /c npx -y @zakstam/convex-docs-mcp
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## License
|
|
17
|
+
|
|
18
|
+
MIT
|
package/build/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/build/index.js
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
3
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
|
|
5
|
+
import { listTopics, listTopicsSchema } from "./tools/listTopics.js";
|
|
6
|
+
import { getPage, getPageSchema } from "./tools/getPage.js";
|
|
7
|
+
import { search, searchSchema } from "./tools/search.js";
|
|
8
|
+
const server = new Server({
|
|
9
|
+
name: "convex-docs",
|
|
10
|
+
version: "1.0.0",
|
|
11
|
+
}, {
|
|
12
|
+
capabilities: {
|
|
13
|
+
tools: {},
|
|
14
|
+
},
|
|
15
|
+
});
|
|
16
|
+
// List available tools
|
|
17
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
18
|
+
return {
|
|
19
|
+
tools: [
|
|
20
|
+
{
|
|
21
|
+
name: "list_convex_topics",
|
|
22
|
+
description: "List all available Convex documentation sections and pages. Optionally filter by a specific section like 'functions', 'database', 'auth', etc.",
|
|
23
|
+
inputSchema: {
|
|
24
|
+
type: "object",
|
|
25
|
+
properties: {
|
|
26
|
+
section: {
|
|
27
|
+
type: "string",
|
|
28
|
+
description: "Optional section to filter by (e.g., 'functions', 'database', 'auth')",
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
name: "get_convex_doc_page",
|
|
35
|
+
description: "Fetch and return a specific Convex documentation page as markdown. Provide either a path (e.g., 'functions/query-functions') or a full URL.",
|
|
36
|
+
inputSchema: {
|
|
37
|
+
type: "object",
|
|
38
|
+
properties: {
|
|
39
|
+
path: {
|
|
40
|
+
type: "string",
|
|
41
|
+
description: "The documentation page path (e.g., 'functions/query-functions') or full URL",
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
required: ["path"],
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
name: "search_convex_docs",
|
|
49
|
+
description: "Search Convex documentation by keyword or topic. Returns matching pages with titles, URLs, and descriptions.",
|
|
50
|
+
inputSchema: {
|
|
51
|
+
type: "object",
|
|
52
|
+
properties: {
|
|
53
|
+
query: {
|
|
54
|
+
type: "string",
|
|
55
|
+
description: "Search query to find relevant Convex documentation",
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
required: ["query"],
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
],
|
|
62
|
+
};
|
|
63
|
+
});
|
|
64
|
+
// Handle tool calls
|
|
65
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
66
|
+
const { name, arguments: args } = request.params;
|
|
67
|
+
try {
|
|
68
|
+
switch (name) {
|
|
69
|
+
case "list_convex_topics": {
|
|
70
|
+
const input = listTopicsSchema.parse(args);
|
|
71
|
+
const result = await listTopics(input);
|
|
72
|
+
return {
|
|
73
|
+
content: [
|
|
74
|
+
{
|
|
75
|
+
type: "text",
|
|
76
|
+
text: JSON.stringify(result, null, 2),
|
|
77
|
+
},
|
|
78
|
+
],
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
case "get_convex_doc_page": {
|
|
82
|
+
const input = getPageSchema.parse(args);
|
|
83
|
+
const result = await getPage(input);
|
|
84
|
+
return {
|
|
85
|
+
content: [
|
|
86
|
+
{
|
|
87
|
+
type: "text",
|
|
88
|
+
text: `# ${result.title}\n\nSource: ${result.url}\n\n---\n\n${result.content}`,
|
|
89
|
+
},
|
|
90
|
+
],
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
case "search_convex_docs": {
|
|
94
|
+
const input = searchSchema.parse(args);
|
|
95
|
+
const result = await search(input);
|
|
96
|
+
return {
|
|
97
|
+
content: [
|
|
98
|
+
{
|
|
99
|
+
type: "text",
|
|
100
|
+
text: JSON.stringify(result, null, 2),
|
|
101
|
+
},
|
|
102
|
+
],
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
default:
|
|
106
|
+
throw new Error(`Unknown tool: ${name}`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
const errorMessage = error instanceof Error ? error.message : "Unknown error occurred";
|
|
111
|
+
return {
|
|
112
|
+
content: [
|
|
113
|
+
{
|
|
114
|
+
type: "text",
|
|
115
|
+
text: `Error: ${errorMessage}`,
|
|
116
|
+
},
|
|
117
|
+
],
|
|
118
|
+
isError: true,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
// Start the server
|
|
123
|
+
async function main() {
|
|
124
|
+
const transport = new StdioServerTransport();
|
|
125
|
+
await server.connect(transport);
|
|
126
|
+
console.error("Convex Docs MCP Server running on stdio");
|
|
127
|
+
}
|
|
128
|
+
main().catch((error) => {
|
|
129
|
+
console.error("Fatal error:", error);
|
|
130
|
+
process.exit(1);
|
|
131
|
+
});
|
|
132
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { DocPage } from "../types.js";
|
|
3
|
+
export declare const getPageSchema: z.ZodObject<{
|
|
4
|
+
path: z.ZodString;
|
|
5
|
+
}, "strip", z.ZodTypeAny, {
|
|
6
|
+
path: string;
|
|
7
|
+
}, {
|
|
8
|
+
path: string;
|
|
9
|
+
}>;
|
|
10
|
+
export type GetPageInput = z.infer<typeof getPageSchema>;
|
|
11
|
+
export declare function getPage(input: GetPageInput): Promise<DocPage>;
|
|
12
|
+
//# sourceMappingURL=getPage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getPage.d.ts","sourceRoot":"","sources":["../../src/tools/getPage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAI3C,eAAO,MAAM,aAAa;;;;;;EAMxB,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAEzD,wBAAsB,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAmBnE"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { fetchDocPage } from "../utils/fetcher.js";
|
|
3
|
+
import { htmlToMarkdown, extractTitle } from "../utils/markdown.js";
|
|
4
|
+
export const getPageSchema = z.object({
|
|
5
|
+
path: z
|
|
6
|
+
.string()
|
|
7
|
+
.describe("The documentation page path (e.g., 'functions/query-functions') or full URL"),
|
|
8
|
+
});
|
|
9
|
+
export async function getPage(input) {
|
|
10
|
+
const { html, url, cached } = await fetchDocPage(input.path);
|
|
11
|
+
const title = extractTitle(html);
|
|
12
|
+
const content = htmlToMarkdown(html);
|
|
13
|
+
// Log cache status to stderr for debugging
|
|
14
|
+
if (cached) {
|
|
15
|
+
console.error(`[cache hit] ${url}`);
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
console.error(`[fetched] ${url}`);
|
|
19
|
+
}
|
|
20
|
+
return {
|
|
21
|
+
title,
|
|
22
|
+
path: input.path,
|
|
23
|
+
url,
|
|
24
|
+
content,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=getPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getPage.js","sourceRoot":"","sources":["../../src/tools/getPage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,YAAY,EAAe,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,IAAI,EAAE,CAAC;SACJ,MAAM,EAAE;SACR,QAAQ,CACP,6EAA6E,CAC9E;CACJ,CAAC,CAAC;AAIH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,KAAmB;IAC/C,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAE7D,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IAErC,2CAA2C;IAC3C,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,eAAe,GAAG,EAAE,CAAC,CAAC;IACtC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,aAAa,GAAG,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,OAAO;QACL,KAAK;QACL,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,GAAG;QACH,OAAO;KACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const listTopicsSchema: z.ZodObject<{
|
|
3
|
+
section: z.ZodOptional<z.ZodString>;
|
|
4
|
+
}, "strip", z.ZodTypeAny, {
|
|
5
|
+
section?: string | undefined;
|
|
6
|
+
}, {
|
|
7
|
+
section?: string | undefined;
|
|
8
|
+
}>;
|
|
9
|
+
export type ListTopicsInput = z.infer<typeof listTopicsSchema>;
|
|
10
|
+
interface TopicListItem {
|
|
11
|
+
title: string;
|
|
12
|
+
path: string;
|
|
13
|
+
url: string;
|
|
14
|
+
description?: string;
|
|
15
|
+
children?: TopicListItem[];
|
|
16
|
+
}
|
|
17
|
+
export declare function listTopics(input: ListTopicsInput): Promise<{
|
|
18
|
+
topics: TopicListItem[];
|
|
19
|
+
totalCount: number;
|
|
20
|
+
}>;
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=listTopics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listTopics.d.ts","sourceRoot":"","sources":["../../src/tools/listTopics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAQxB,eAAO,MAAM,gBAAgB;;;;;;EAK3B,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE/D,UAAU,aAAa;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;CAC5B;AAoBD,wBAAsB,UAAU,CAC9B,KAAK,EAAE,eAAe,GACrB,OAAO,CAAC;IAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CA0B1D"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { getAllTopics, filterTopicsBySection, DOCS_BASE_URL, } from "../utils/sitemap.js";
|
|
3
|
+
export const listTopicsSchema = z.object({
|
|
4
|
+
section: z
|
|
5
|
+
.string()
|
|
6
|
+
.optional()
|
|
7
|
+
.describe("Optional section to filter by (e.g., 'functions', 'database')"),
|
|
8
|
+
});
|
|
9
|
+
function formatTopic(topic) {
|
|
10
|
+
const item = {
|
|
11
|
+
title: topic.title,
|
|
12
|
+
path: topic.path,
|
|
13
|
+
url: `${DOCS_BASE_URL}/${topic.path}`,
|
|
14
|
+
};
|
|
15
|
+
if (topic.description) {
|
|
16
|
+
item.description = topic.description;
|
|
17
|
+
}
|
|
18
|
+
if (topic.children && topic.children.length > 0) {
|
|
19
|
+
item.children = topic.children.map(formatTopic);
|
|
20
|
+
}
|
|
21
|
+
return item;
|
|
22
|
+
}
|
|
23
|
+
export async function listTopics(input) {
|
|
24
|
+
let topics;
|
|
25
|
+
if (input.section) {
|
|
26
|
+
topics = filterTopicsBySection(input.section);
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
topics = getAllTopics();
|
|
30
|
+
}
|
|
31
|
+
const formattedTopics = topics.map(formatTopic);
|
|
32
|
+
// Count total topics including nested ones
|
|
33
|
+
function countTopics(items) {
|
|
34
|
+
let count = items.length;
|
|
35
|
+
for (const item of items) {
|
|
36
|
+
if (item.children) {
|
|
37
|
+
count += countTopics(item.children);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return count;
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
topics: formattedTopics,
|
|
44
|
+
totalCount: countTopics(formattedTopics),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=listTopics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listTopics.js","sourceRoot":"","sources":["../../src/tools/listTopics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EACL,YAAY,EACZ,qBAAqB,EACrB,aAAa,GACd,MAAM,qBAAqB,CAAC;AAE7B,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,+DAA+D,CAAC;CAC7E,CAAC,CAAC;AAYH,SAAS,WAAW,CAAC,KAAe;IAClC,MAAM,IAAI,GAAkB;QAC1B,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,GAAG,EAAE,GAAG,aAAa,IAAI,KAAK,CAAC,IAAI,EAAE;KACtC,CAAC;IAEF,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QACtB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;IACvC,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChD,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,KAAsB;IAEtB,IAAI,MAAkB,CAAC;IAEvB,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,MAAM,GAAG,qBAAqB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAChD,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,YAAY,EAAE,CAAC;IAC1B,CAAC;IAED,MAAM,eAAe,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAEhD,2CAA2C;IAC3C,SAAS,WAAW,CAAC,KAAsB;QACzC,IAAI,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;QACzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,KAAK,IAAI,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO;QACL,MAAM,EAAE,eAAe;QACvB,UAAU,EAAE,WAAW,CAAC,eAAe,CAAC;KACzC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { SearchResult } from "../types.js";
|
|
3
|
+
export declare const searchSchema: z.ZodObject<{
|
|
4
|
+
query: z.ZodString;
|
|
5
|
+
}, "strip", z.ZodTypeAny, {
|
|
6
|
+
query: string;
|
|
7
|
+
}, {
|
|
8
|
+
query: string;
|
|
9
|
+
}>;
|
|
10
|
+
export type SearchInput = z.infer<typeof searchSchema>;
|
|
11
|
+
export declare function search(input: SearchInput): Promise<{
|
|
12
|
+
results: SearchResult[];
|
|
13
|
+
query: string;
|
|
14
|
+
}>;
|
|
15
|
+
//# sourceMappingURL=search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,eAAO,MAAM,YAAY;;;;;;EAEvB,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAEvD,wBAAsB,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC;IACxD,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC,CA4DD"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { searchTopics, DOCS_BASE_URL } from "../utils/sitemap.js";
|
|
3
|
+
export const searchSchema = z.object({
|
|
4
|
+
query: z.string().describe("Search query to find relevant Convex documentation"),
|
|
5
|
+
});
|
|
6
|
+
export async function search(input) {
|
|
7
|
+
const { query } = input;
|
|
8
|
+
// Search through the local topic index
|
|
9
|
+
const matchingTopics = searchTopics(query);
|
|
10
|
+
// Score and format results
|
|
11
|
+
const results = matchingTopics.map((topic) => {
|
|
12
|
+
let score = 0;
|
|
13
|
+
const queryLower = query.toLowerCase();
|
|
14
|
+
const titleLower = topic.title.toLowerCase();
|
|
15
|
+
const pathLower = topic.path.toLowerCase();
|
|
16
|
+
const descLower = (topic.description || "").toLowerCase();
|
|
17
|
+
// Higher score for title matches
|
|
18
|
+
if (titleLower === queryLower) {
|
|
19
|
+
score += 100;
|
|
20
|
+
}
|
|
21
|
+
else if (titleLower.includes(queryLower)) {
|
|
22
|
+
score += 50;
|
|
23
|
+
}
|
|
24
|
+
// Score for path matches
|
|
25
|
+
if (pathLower.includes(queryLower)) {
|
|
26
|
+
score += 30;
|
|
27
|
+
}
|
|
28
|
+
// Score for description matches
|
|
29
|
+
if (descLower.includes(queryLower)) {
|
|
30
|
+
score += 20;
|
|
31
|
+
}
|
|
32
|
+
// Boost exact word matches
|
|
33
|
+
const queryWords = queryLower.split(/\s+/);
|
|
34
|
+
for (const word of queryWords) {
|
|
35
|
+
if (word.length > 2) {
|
|
36
|
+
if (titleLower.includes(word))
|
|
37
|
+
score += 10;
|
|
38
|
+
if (pathLower.includes(word))
|
|
39
|
+
score += 5;
|
|
40
|
+
if (descLower.includes(word))
|
|
41
|
+
score += 5;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
title: topic.title,
|
|
46
|
+
path: topic.path,
|
|
47
|
+
url: `${DOCS_BASE_URL}/${topic.path}`,
|
|
48
|
+
snippet: topic.description || `Documentation page: ${topic.title}`,
|
|
49
|
+
score,
|
|
50
|
+
};
|
|
51
|
+
});
|
|
52
|
+
// Sort by score descending
|
|
53
|
+
results.sort((a, b) => b.score - a.score);
|
|
54
|
+
// Limit to top 10 results
|
|
55
|
+
const topResults = results.slice(0, 10);
|
|
56
|
+
return {
|
|
57
|
+
results: topResults,
|
|
58
|
+
query,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAElE,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oDAAoD,CAAC;CACjF,CAAC,CAAC;AAIH,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,KAAkB;IAI7C,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IAExB,uCAAuC;IACvC,MAAM,cAAc,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAE3C,2BAA2B;IAC3B,MAAM,OAAO,GAAmB,cAAc,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC3D,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QACvC,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QAC7C,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,SAAS,GAAG,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAE1D,iCAAiC;QACjC,IAAI,UAAU,KAAK,UAAU,EAAE,CAAC;YAC9B,KAAK,IAAI,GAAG,CAAC;QACf,CAAC;aAAM,IAAI,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3C,KAAK,IAAI,EAAE,CAAC;QACd,CAAC;QAED,yBAAyB;QACzB,IAAI,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YACnC,KAAK,IAAI,EAAE,CAAC;QACd,CAAC;QAED,gCAAgC;QAChC,IAAI,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YACnC,KAAK,IAAI,EAAE,CAAC;QACd,CAAC;QAED,2BAA2B;QAC3B,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC3C,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpB,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC;oBAAE,KAAK,IAAI,EAAE,CAAC;gBAC3C,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;oBAAE,KAAK,IAAI,CAAC,CAAC;gBACzC,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;oBAAE,KAAK,IAAI,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;QAED,OAAO;YACL,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,GAAG,EAAE,GAAG,aAAa,IAAI,KAAK,CAAC,IAAI,EAAE;YACrC,OAAO,EAAE,KAAK,CAAC,WAAW,IAAI,uBAAuB,KAAK,CAAC,KAAK,EAAE;YAClE,KAAK;SACN,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,2BAA2B;IAC3B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAE1C,0BAA0B;IAC1B,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAExC,OAAO;QACL,OAAO,EAAE,UAAU;QACnB,KAAK;KACN,CAAC;AACJ,CAAC"}
|
package/build/types.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface DocTopic {
|
|
2
|
+
title: string;
|
|
3
|
+
path: string;
|
|
4
|
+
description?: string;
|
|
5
|
+
children?: DocTopic[];
|
|
6
|
+
}
|
|
7
|
+
export interface SearchResult {
|
|
8
|
+
title: string;
|
|
9
|
+
path: string;
|
|
10
|
+
url: string;
|
|
11
|
+
snippet: string;
|
|
12
|
+
score: number;
|
|
13
|
+
}
|
|
14
|
+
export interface DocPage {
|
|
15
|
+
title: string;
|
|
16
|
+
path: string;
|
|
17
|
+
url: string;
|
|
18
|
+
content: string;
|
|
19
|
+
}
|
|
20
|
+
export interface FetchResult {
|
|
21
|
+
html: string;
|
|
22
|
+
url: string;
|
|
23
|
+
cached: boolean;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,OAAO,CAAC;CACjB"}
|
package/build/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { FetchResult } from "../types.js";
|
|
2
|
+
export declare function buildDocUrl(path: string): string;
|
|
3
|
+
export declare function fetchDocPage(path: string): Promise<FetchResult>;
|
|
4
|
+
export declare function clearCache(): void;
|
|
5
|
+
export declare function getCacheStats(): {
|
|
6
|
+
size: number;
|
|
7
|
+
urls: string[];
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=fetcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetcher.d.ts","sourceRoot":"","sources":["../../src/utils/fetcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAM/C,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQhD;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAwBrE;AAED,wBAAgB,UAAU,IAAI,IAAI,CAEjC;AAED,wBAAgB,aAAa,IAAI;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAKhE"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { DOCS_BASE_URL } from "./sitemap.js";
|
|
2
|
+
const cache = new Map();
|
|
3
|
+
const CACHE_TTL_MS = 15 * 60 * 1000; // 15 minutes
|
|
4
|
+
export function buildDocUrl(path) {
|
|
5
|
+
const normalizedPath = path.replace(/^\/+|\/+$/g, "");
|
|
6
|
+
if (path.startsWith("http://") || path.startsWith("https://")) {
|
|
7
|
+
return path;
|
|
8
|
+
}
|
|
9
|
+
return `${DOCS_BASE_URL}/${normalizedPath}`;
|
|
10
|
+
}
|
|
11
|
+
export async function fetchDocPage(path) {
|
|
12
|
+
const url = buildDocUrl(path);
|
|
13
|
+
const cached = cache.get(url);
|
|
14
|
+
if (cached && Date.now() - cached.timestamp < CACHE_TTL_MS) {
|
|
15
|
+
return { html: cached.html, url, cached: true };
|
|
16
|
+
}
|
|
17
|
+
const response = await fetch(url, {
|
|
18
|
+
headers: {
|
|
19
|
+
"User-Agent": "ConvexDocsMCPServer/1.0",
|
|
20
|
+
"Accept": "text/html,application/xhtml+xml",
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
if (!response.ok) {
|
|
24
|
+
throw new Error(`Failed to fetch ${url}: ${response.status} ${response.statusText}`);
|
|
25
|
+
}
|
|
26
|
+
const html = await response.text();
|
|
27
|
+
cache.set(url, { html, timestamp: Date.now() });
|
|
28
|
+
return { html, url, cached: false };
|
|
29
|
+
}
|
|
30
|
+
export function clearCache() {
|
|
31
|
+
cache.clear();
|
|
32
|
+
}
|
|
33
|
+
export function getCacheStats() {
|
|
34
|
+
return {
|
|
35
|
+
size: cache.size,
|
|
36
|
+
urls: Array.from(cache.keys()),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=fetcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetcher.js","sourceRoot":"","sources":["../../src/utils/fetcher.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,KAAK,GAAG,IAAI,GAAG,EAA+C,CAAC;AACrE,MAAM,YAAY,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,aAAa;AAElD,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;IAEtD,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,GAAG,aAAa,IAAI,cAAc,EAAE,CAAC;AAC9C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAY;IAC7C,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAE9B,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,SAAS,GAAG,YAAY,EAAE,CAAC;QAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAClD,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,OAAO,EAAE;YACP,YAAY,EAAE,yBAAyB;YACvC,QAAQ,EAAE,iCAAiC;SAC5C;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,mBAAmB,GAAG,KAAK,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IACvF,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAEnC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAEhD,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,KAAK,CAAC,KAAK,EAAE,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;KAC/B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function extractMainContent(html: string): string;
|
|
2
|
+
export declare function extractTitle(html: string): string;
|
|
3
|
+
export declare function htmlToMarkdown(html: string): string;
|
|
4
|
+
export declare function createSnippet(text: string, maxLength?: number): string;
|
|
5
|
+
//# sourceMappingURL=markdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/utils/markdown.ts"],"names":[],"mappings":"AAoCA,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA6CvD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAmBjD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAUnD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,GAAE,MAAY,GAAG,MAAM,CAiB3E"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import TurndownService from "turndown";
|
|
2
|
+
const turndown = new TurndownService({
|
|
3
|
+
headingStyle: "atx",
|
|
4
|
+
codeBlockStyle: "fenced",
|
|
5
|
+
bulletListMarker: "-",
|
|
6
|
+
});
|
|
7
|
+
// Customize code block handling for better output
|
|
8
|
+
turndown.addRule("fencedCodeBlock", {
|
|
9
|
+
filter: (node) => {
|
|
10
|
+
return (node.nodeName === "PRE" &&
|
|
11
|
+
node.firstChild !== null &&
|
|
12
|
+
node.firstChild.nodeName === "CODE");
|
|
13
|
+
},
|
|
14
|
+
replacement: (_content, node) => {
|
|
15
|
+
const codeNode = node.firstChild;
|
|
16
|
+
const className = codeNode.getAttribute("class") || "";
|
|
17
|
+
const langMatch = className.match(/language-(\w+)/);
|
|
18
|
+
const lang = langMatch ? langMatch[1] : "";
|
|
19
|
+
const code = codeNode.textContent || "";
|
|
20
|
+
return `\n\`\`\`${lang}\n${code}\n\`\`\`\n`;
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
// Remove certain elements that are not useful in markdown
|
|
24
|
+
turndown.remove(["script", "style", "nav", "footer", "header", "aside", "button", "noscript"]);
|
|
25
|
+
// Add rule to remove SVG elements
|
|
26
|
+
turndown.addRule("removeSvg", {
|
|
27
|
+
filter: (node) => node.nodeName === "SVG",
|
|
28
|
+
replacement: () => "",
|
|
29
|
+
});
|
|
30
|
+
export function extractMainContent(html) {
|
|
31
|
+
// Try to extract the main content area
|
|
32
|
+
// Convex docs typically have content in <main> or an article element
|
|
33
|
+
// Look for main content patterns
|
|
34
|
+
const mainPatterns = [
|
|
35
|
+
/<main[^>]*>([\s\S]*?)<\/main>/i,
|
|
36
|
+
/<article[^>]*>([\s\S]*?)<\/article>/i,
|
|
37
|
+
/<div[^>]*class="[^"]*content[^"]*"[^>]*>([\s\S]*?)<\/div>/i,
|
|
38
|
+
/<div[^>]*id="[^"]*content[^"]*"[^>]*>([\s\S]*?)<\/div>/i,
|
|
39
|
+
];
|
|
40
|
+
for (const pattern of mainPatterns) {
|
|
41
|
+
const match = html.match(pattern);
|
|
42
|
+
if (match && match[1]) {
|
|
43
|
+
return match[1];
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// If no main content found, try to clean up the HTML
|
|
47
|
+
// Remove obvious non-content elements
|
|
48
|
+
let cleaned = html;
|
|
49
|
+
// Remove head section
|
|
50
|
+
cleaned = cleaned.replace(/<head[\s\S]*?<\/head>/gi, "");
|
|
51
|
+
// Remove navigation
|
|
52
|
+
cleaned = cleaned.replace(/<nav[\s\S]*?<\/nav>/gi, "");
|
|
53
|
+
// Remove footer
|
|
54
|
+
cleaned = cleaned.replace(/<footer[\s\S]*?<\/footer>/gi, "");
|
|
55
|
+
// Remove header
|
|
56
|
+
cleaned = cleaned.replace(/<header[\s\S]*?<\/header>/gi, "");
|
|
57
|
+
// Remove aside elements (sidebars)
|
|
58
|
+
cleaned = cleaned.replace(/<aside[\s\S]*?<\/aside>/gi, "");
|
|
59
|
+
// Remove script tags
|
|
60
|
+
cleaned = cleaned.replace(/<script[\s\S]*?<\/script>/gi, "");
|
|
61
|
+
// Remove style tags
|
|
62
|
+
cleaned = cleaned.replace(/<style[\s\S]*?<\/style>/gi, "");
|
|
63
|
+
return cleaned;
|
|
64
|
+
}
|
|
65
|
+
export function extractTitle(html) {
|
|
66
|
+
// Try to extract the page title
|
|
67
|
+
const titlePatterns = [
|
|
68
|
+
/<title[^>]*>([^<]*)<\/title>/i,
|
|
69
|
+
/<h1[^>]*>([^<]*)<\/h1>/i,
|
|
70
|
+
];
|
|
71
|
+
for (const pattern of titlePatterns) {
|
|
72
|
+
const match = html.match(pattern);
|
|
73
|
+
if (match && match[1]) {
|
|
74
|
+
// Clean up the title
|
|
75
|
+
let title = match[1].trim();
|
|
76
|
+
// Remove common suffixes like " | Convex Docs"
|
|
77
|
+
title = title.replace(/\s*[|–-]\s*Convex.*$/i, "");
|
|
78
|
+
return title;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return "Untitled";
|
|
82
|
+
}
|
|
83
|
+
export function htmlToMarkdown(html) {
|
|
84
|
+
const mainContent = extractMainContent(html);
|
|
85
|
+
const markdown = turndown.turndown(mainContent);
|
|
86
|
+
// Clean up excessive whitespace
|
|
87
|
+
let cleaned = markdown
|
|
88
|
+
.replace(/\n{3,}/g, "\n\n")
|
|
89
|
+
.replace(/^\s+|\s+$/g, "");
|
|
90
|
+
return cleaned;
|
|
91
|
+
}
|
|
92
|
+
export function createSnippet(text, maxLength = 200) {
|
|
93
|
+
// Remove markdown formatting for snippet
|
|
94
|
+
let snippet = text
|
|
95
|
+
.replace(/```[\s\S]*?```/g, "") // Remove code blocks
|
|
96
|
+
.replace(/`[^`]+`/g, "") // Remove inline code
|
|
97
|
+
.replace(/\[([^\]]+)\]\([^)]+\)/g, "$1") // Remove links, keep text
|
|
98
|
+
.replace(/#+\s*/g, "") // Remove heading markers
|
|
99
|
+
.replace(/[*_~]+/g, "") // Remove emphasis markers
|
|
100
|
+
.replace(/\n+/g, " ") // Replace newlines with spaces
|
|
101
|
+
.replace(/\s+/g, " ") // Collapse whitespace
|
|
102
|
+
.trim();
|
|
103
|
+
if (snippet.length > maxLength) {
|
|
104
|
+
snippet = snippet.substring(0, maxLength - 3) + "...";
|
|
105
|
+
}
|
|
106
|
+
return snippet;
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/utils/markdown.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,UAAU,CAAC;AAEvC,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC;IACnC,YAAY,EAAE,KAAK;IACnB,cAAc,EAAE,QAAQ;IACxB,gBAAgB,EAAE,GAAG;CACtB,CAAC,CAAC;AAEH,kDAAkD;AAClD,QAAQ,CAAC,OAAO,CAAC,iBAAiB,EAAE;IAClC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QACf,OAAO,CACL,IAAI,CAAC,QAAQ,KAAK,KAAK;YACvB,IAAI,CAAC,UAAU,KAAK,IAAI;YACxB,IAAI,CAAC,UAAU,CAAC,QAAQ,KAAK,MAAM,CACpC,CAAC;IACJ,CAAC;IACD,WAAW,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE;QAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAqB,CAAC;QAC5C,MAAM,SAAS,GAAG,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QACvD,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACpD,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,IAAI,EAAE,CAAC;QACxC,OAAO,WAAW,IAAI,KAAK,IAAI,YAAY,CAAC;IAC9C,CAAC;CACF,CAAC,CAAC;AAEH,0DAA0D;AAC1D,QAAQ,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;AAE/F,kCAAkC;AAClC,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE;IAC5B,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,KAAK,KAAK;IACzC,WAAW,EAAE,GAAG,EAAE,CAAC,EAAE;CACtB,CAAC,CAAC;AAEH,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,uCAAuC;IACvC,qEAAqE;IAErE,iCAAiC;IACjC,MAAM,YAAY,GAAG;QACnB,gCAAgC;QAChC,sCAAsC;QACtC,4DAA4D;QAC5D,yDAAyD;KAC1D,CAAC;IAEF,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACtB,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,qDAAqD;IACrD,sCAAsC;IACtC,IAAI,OAAO,GAAG,IAAI,CAAC;IAEnB,sBAAsB;IACtB,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,yBAAyB,EAAE,EAAE,CAAC,CAAC;IAEzD,oBAAoB;IACpB,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAAC;IAEvD,gBAAgB;IAChB,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,6BAA6B,EAAE,EAAE,CAAC,CAAC;IAE7D,gBAAgB;IAChB,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,6BAA6B,EAAE,EAAE,CAAC,CAAC;IAE7D,mCAAmC;IACnC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,2BAA2B,EAAE,EAAE,CAAC,CAAC;IAE3D,qBAAqB;IACrB,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,6BAA6B,EAAE,EAAE,CAAC,CAAC;IAE7D,oBAAoB;IACpB,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,2BAA2B,EAAE,EAAE,CAAC,CAAC;IAE3D,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,gCAAgC;IAChC,MAAM,aAAa,GAAG;QACpB,+BAA+B;QAC/B,yBAAyB;KAC1B,CAAC;IAEF,KAAK,MAAM,OAAO,IAAI,aAAa,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACtB,qBAAqB;YACrB,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC5B,+CAA+C;YAC/C,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAAC;YACnD,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,WAAW,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAEhD,gCAAgC;IAChC,IAAI,OAAO,GAAG,QAAQ;SACnB,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC;SAC1B,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;IAE7B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,YAAoB,GAAG;IACjE,yCAAyC;IACzC,IAAI,OAAO,GAAG,IAAI;SACf,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC,qBAAqB;SACpD,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,qBAAqB;SAC7C,OAAO,CAAC,wBAAwB,EAAE,IAAI,CAAC,CAAC,0BAA0B;SAClE,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,yBAAyB;SAC/C,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,0BAA0B;SACjD,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,+BAA+B;SACpD,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,sBAAsB;SAC3C,IAAI,EAAE,CAAC;IAEV,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;QAC/B,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;IACxD,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { DocTopic } from "../types.js";
|
|
2
|
+
export declare const DOCS_BASE_URL = "https://docs.convex.dev";
|
|
3
|
+
export declare const docsSitemap: DocTopic[];
|
|
4
|
+
export declare function getAllTopics(): DocTopic[];
|
|
5
|
+
export declare function getTopicByPath(path: string): DocTopic | undefined;
|
|
6
|
+
export declare function filterTopicsBySection(section: string): DocTopic[];
|
|
7
|
+
export declare function flattenTopics(topics?: DocTopic[]): DocTopic[];
|
|
8
|
+
export declare function searchTopics(query: string): DocTopic[];
|
|
9
|
+
//# sourceMappingURL=sitemap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sitemap.d.ts","sourceRoot":"","sources":["../../src/utils/sitemap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,eAAO,MAAM,aAAa,4BAA4B,CAAC;AAEvD,eAAO,MAAM,WAAW,EAAE,QAAQ,EAmJjC,CAAC;AAEF,wBAAgB,YAAY,IAAI,QAAQ,EAAE,CAEzC;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAiBjE;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,EAAE,CAQjE;AAED,wBAAgB,aAAa,CAAC,MAAM,GAAE,QAAQ,EAAgB,GAAG,QAAQ,EAAE,CAc1E;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,EAAE,CAUtD"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
export const DOCS_BASE_URL = "https://docs.convex.dev";
|
|
2
|
+
export const docsSitemap = [
|
|
3
|
+
{
|
|
4
|
+
title: "Get Started",
|
|
5
|
+
path: "get-started",
|
|
6
|
+
description: "Introduction and getting started with Convex",
|
|
7
|
+
children: [
|
|
8
|
+
{ title: "Welcome", path: "get-started", description: "Introduction to Convex" },
|
|
9
|
+
{ title: "Tutorial", path: "tutorial", description: "Step-by-step Convex tutorial" },
|
|
10
|
+
{
|
|
11
|
+
title: "Quickstarts",
|
|
12
|
+
path: "quickstarts",
|
|
13
|
+
description: "Quick start guides for various frameworks",
|
|
14
|
+
children: [
|
|
15
|
+
{ title: "React", path: "quickstarts/react", description: "Quickstart with React" },
|
|
16
|
+
{ title: "Next.js", path: "quickstarts/nextjs", description: "Quickstart with Next.js" },
|
|
17
|
+
{ title: "React Native", path: "quickstarts/react-native", description: "Quickstart with React Native" },
|
|
18
|
+
{ title: "Vue", path: "quickstarts/vue", description: "Quickstart with Vue" },
|
|
19
|
+
{ title: "Svelte", path: "quickstarts/svelte", description: "Quickstart with Svelte" },
|
|
20
|
+
{ title: "Python", path: "quickstarts/python", description: "Quickstart with Python" },
|
|
21
|
+
{ title: "Rust", path: "quickstarts/rust", description: "Quickstart with Rust" },
|
|
22
|
+
],
|
|
23
|
+
},
|
|
24
|
+
],
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
title: "Functions",
|
|
28
|
+
path: "functions",
|
|
29
|
+
description: "Convex serverless functions",
|
|
30
|
+
children: [
|
|
31
|
+
{ title: "Overview", path: "functions", description: "Introduction to Convex functions" },
|
|
32
|
+
{ title: "Query Functions", path: "functions/query-functions", description: "Read data with query functions" },
|
|
33
|
+
{ title: "Mutation Functions", path: "functions/mutation-functions", description: "Write data with mutation functions" },
|
|
34
|
+
{ title: "Action Functions", path: "functions/actions", description: "Side effects with action functions" },
|
|
35
|
+
{ title: "Internal Functions", path: "functions/internal-functions", description: "Functions only callable from other functions" },
|
|
36
|
+
{ title: "HTTP Actions", path: "functions/http-actions", description: "HTTP endpoint handlers" },
|
|
37
|
+
{ title: "Bundling", path: "functions/bundling", description: "How function bundling works" },
|
|
38
|
+
{ title: "Error Handling", path: "functions/error-handling", description: "Handling errors in functions" },
|
|
39
|
+
],
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
title: "Database",
|
|
43
|
+
path: "database",
|
|
44
|
+
description: "Convex database and data modeling",
|
|
45
|
+
children: [
|
|
46
|
+
{ title: "Overview", path: "database", description: "Introduction to Convex database" },
|
|
47
|
+
{ title: "Reading Data", path: "database/reading-data", description: "Querying data from the database" },
|
|
48
|
+
{ title: "Writing Data", path: "database/writing-data", description: "Inserting and modifying data" },
|
|
49
|
+
{ title: "Document IDs", path: "database/document-ids", description: "Working with document IDs" },
|
|
50
|
+
{ title: "Tables", path: "database/tables", description: "Database tables and collections" },
|
|
51
|
+
{ title: "Schemas", path: "database/schemas", description: "Defining database schemas" },
|
|
52
|
+
{ title: "Indexes", path: "database/indexes", description: "Database indexes for efficient queries" },
|
|
53
|
+
{ title: "Pagination", path: "database/pagination", description: "Paginating query results" },
|
|
54
|
+
{ title: "TypeScript", path: "database/typescript", description: "TypeScript support for database" },
|
|
55
|
+
],
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
title: "File Storage",
|
|
59
|
+
path: "file-storage",
|
|
60
|
+
description: "Storing and serving files",
|
|
61
|
+
children: [
|
|
62
|
+
{ title: "Overview", path: "file-storage", description: "Introduction to file storage" },
|
|
63
|
+
{ title: "Upload Files", path: "file-storage/upload-files", description: "Uploading files to Convex" },
|
|
64
|
+
{ title: "Serve Files", path: "file-storage/serve-files", description: "Serving files from Convex" },
|
|
65
|
+
{ title: "Delete Files", path: "file-storage/delete-files", description: "Deleting stored files" },
|
|
66
|
+
],
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
title: "Authentication",
|
|
70
|
+
path: "auth",
|
|
71
|
+
description: "User authentication and authorization",
|
|
72
|
+
children: [
|
|
73
|
+
{ title: "Overview", path: "auth", description: "Introduction to authentication" },
|
|
74
|
+
{ title: "Clerk", path: "auth/clerk", description: "Authentication with Clerk" },
|
|
75
|
+
{ title: "Auth0", path: "auth/auth0", description: "Authentication with Auth0" },
|
|
76
|
+
{ title: "Custom Auth", path: "auth/custom-auth", description: "Custom authentication setup" },
|
|
77
|
+
{ title: "Functions Auth", path: "auth/functions-auth", description: "Authentication in functions" },
|
|
78
|
+
],
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
title: "Scheduling",
|
|
82
|
+
path: "scheduling",
|
|
83
|
+
description: "Scheduled and cron jobs",
|
|
84
|
+
children: [
|
|
85
|
+
{ title: "Overview", path: "scheduling", description: "Introduction to scheduling" },
|
|
86
|
+
{ title: "Scheduled Functions", path: "scheduling/scheduled-functions", description: "Running functions on a schedule" },
|
|
87
|
+
{ title: "Cron Jobs", path: "scheduling/cron-jobs", description: "Setting up cron jobs" },
|
|
88
|
+
],
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
title: "Search",
|
|
92
|
+
path: "search",
|
|
93
|
+
description: "Full-text and vector search",
|
|
94
|
+
children: [
|
|
95
|
+
{ title: "Overview", path: "search", description: "Introduction to search" },
|
|
96
|
+
{ title: "Full-Text Search", path: "search/full-text-search", description: "Full-text search implementation" },
|
|
97
|
+
{ title: "Vector Search", path: "search/vector-search", description: "Vector/semantic search implementation" },
|
|
98
|
+
],
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
title: "AI",
|
|
102
|
+
path: "ai",
|
|
103
|
+
description: "AI and LLM integration",
|
|
104
|
+
children: [
|
|
105
|
+
{ title: "Overview", path: "ai", description: "AI features in Convex" },
|
|
106
|
+
],
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
title: "Client Libraries",
|
|
110
|
+
path: "client",
|
|
111
|
+
description: "Client-side libraries and SDKs",
|
|
112
|
+
children: [
|
|
113
|
+
{ title: "React", path: "client/react", description: "React client library" },
|
|
114
|
+
{ title: "React Native", path: "client/react-native", description: "React Native client" },
|
|
115
|
+
{ title: "JavaScript", path: "client/javascript", description: "Vanilla JavaScript client" },
|
|
116
|
+
{ title: "Python", path: "client/python", description: "Python client library" },
|
|
117
|
+
],
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
title: "Production",
|
|
121
|
+
path: "production",
|
|
122
|
+
description: "Deployment and production considerations",
|
|
123
|
+
children: [
|
|
124
|
+
{ title: "Overview", path: "production", description: "Production deployment" },
|
|
125
|
+
{ title: "Hosting", path: "production/hosting", description: "Hosting your Convex app" },
|
|
126
|
+
{ title: "Environment Variables", path: "production/environment-variables", description: "Managing environment variables" },
|
|
127
|
+
{ title: "Logging", path: "production/logging", description: "Application logging" },
|
|
128
|
+
{ title: "Error Handling", path: "production/error-handling", description: "Production error handling" },
|
|
129
|
+
{ title: "Debugging", path: "production/debugging", description: "Debugging production issues" },
|
|
130
|
+
{ title: "Best Practices", path: "production/best-practices", description: "Production best practices" },
|
|
131
|
+
],
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
title: "CLI",
|
|
135
|
+
path: "cli",
|
|
136
|
+
description: "Convex CLI reference",
|
|
137
|
+
children: [
|
|
138
|
+
{ title: "Overview", path: "cli", description: "Convex CLI introduction" },
|
|
139
|
+
],
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
title: "API Reference",
|
|
143
|
+
path: "api",
|
|
144
|
+
description: "Complete API reference",
|
|
145
|
+
children: [
|
|
146
|
+
{ title: "Overview", path: "api", description: "API reference overview" },
|
|
147
|
+
],
|
|
148
|
+
},
|
|
149
|
+
];
|
|
150
|
+
export function getAllTopics() {
|
|
151
|
+
return docsSitemap;
|
|
152
|
+
}
|
|
153
|
+
export function getTopicByPath(path) {
|
|
154
|
+
const normalizedPath = path.replace(/^\/+|\/+$/g, "");
|
|
155
|
+
function findTopic(topics) {
|
|
156
|
+
for (const topic of topics) {
|
|
157
|
+
if (topic.path === normalizedPath) {
|
|
158
|
+
return topic;
|
|
159
|
+
}
|
|
160
|
+
if (topic.children) {
|
|
161
|
+
const found = findTopic(topic.children);
|
|
162
|
+
if (found)
|
|
163
|
+
return found;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return undefined;
|
|
167
|
+
}
|
|
168
|
+
return findTopic(docsSitemap);
|
|
169
|
+
}
|
|
170
|
+
export function filterTopicsBySection(section) {
|
|
171
|
+
const normalizedSection = section.toLowerCase().replace(/[\s-]+/g, "-");
|
|
172
|
+
return docsSitemap.filter((topic) => topic.path.toLowerCase().includes(normalizedSection) ||
|
|
173
|
+
topic.title.toLowerCase().replace(/[\s]+/g, "-").includes(normalizedSection));
|
|
174
|
+
}
|
|
175
|
+
export function flattenTopics(topics = docsSitemap) {
|
|
176
|
+
const result = [];
|
|
177
|
+
function flatten(items) {
|
|
178
|
+
for (const item of items) {
|
|
179
|
+
result.push({ title: item.title, path: item.path, description: item.description });
|
|
180
|
+
if (item.children) {
|
|
181
|
+
flatten(item.children);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
flatten(topics);
|
|
186
|
+
return result;
|
|
187
|
+
}
|
|
188
|
+
export function searchTopics(query) {
|
|
189
|
+
const normalizedQuery = query.toLowerCase();
|
|
190
|
+
const allTopics = flattenTopics();
|
|
191
|
+
return allTopics.filter((topic) => topic.title.toLowerCase().includes(normalizedQuery) ||
|
|
192
|
+
topic.path.toLowerCase().includes(normalizedQuery) ||
|
|
193
|
+
(topic.description && topic.description.toLowerCase().includes(normalizedQuery)));
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=sitemap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sitemap.js","sourceRoot":"","sources":["../../src/utils/sitemap.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@zakstam/convex-docs-mcp",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "MCP server providing access to Convex documentation",
|
|
5
|
+
"main": "build/index.js",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/zakstam/convex-docs-mcp.git"
|
|
10
|
+
},
|
|
11
|
+
"publishConfig": {
|
|
12
|
+
"registry": "https://registry.npmjs.org/",
|
|
13
|
+
"provenance": true,
|
|
14
|
+
"access": "public"
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"build"
|
|
18
|
+
],
|
|
19
|
+
"bin": {
|
|
20
|
+
"convex-docs-mcp": "./build/index.js"
|
|
21
|
+
},
|
|
22
|
+
"scripts": {
|
|
23
|
+
"build": "tsc",
|
|
24
|
+
"start": "node build/index.js",
|
|
25
|
+
"dev": "tsc --watch",
|
|
26
|
+
"prepare": "husky"
|
|
27
|
+
},
|
|
28
|
+
"keywords": [
|
|
29
|
+
"mcp",
|
|
30
|
+
"convex",
|
|
31
|
+
"documentation"
|
|
32
|
+
],
|
|
33
|
+
"author": "",
|
|
34
|
+
"license": "MIT",
|
|
35
|
+
"dependencies": {
|
|
36
|
+
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
37
|
+
"turndown": "^7.1.0",
|
|
38
|
+
"zod": "^3.23.0"
|
|
39
|
+
},
|
|
40
|
+
"devDependencies": {
|
|
41
|
+
"@commitlint/cli": "^20.3.1",
|
|
42
|
+
"@commitlint/config-conventional": "^20.3.1",
|
|
43
|
+
"@semantic-release/changelog": "^6.0.3",
|
|
44
|
+
"@semantic-release/commit-analyzer": "^13.0.1",
|
|
45
|
+
"@semantic-release/git": "^10.0.1",
|
|
46
|
+
"@semantic-release/github": "^12.0.2",
|
|
47
|
+
"@semantic-release/npm": "^13.1.3",
|
|
48
|
+
"@semantic-release/release-notes-generator": "^14.1.0",
|
|
49
|
+
"@types/node": "^20.0.0",
|
|
50
|
+
"@types/turndown": "^5.0.0",
|
|
51
|
+
"husky": "^9.1.7",
|
|
52
|
+
"semantic-release": "^25.0.2",
|
|
53
|
+
"typescript": "^5.0.0"
|
|
54
|
+
}
|
|
55
|
+
}
|