@gulibs/safe-coder 0.0.28 → 0.0.29
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/server/auto-skill-installer.d.ts +16 -0
- package/dist/server/auto-skill-installer.d.ts.map +1 -0
- package/dist/server/auto-skill-installer.js +164 -0
- package/dist/server/auto-skill-installer.js.map +1 -0
- package/dist/server/safe-coder-mcp.d.ts +1 -0
- package/dist/server/safe-coder-mcp.d.ts.map +1 -1
- package/dist/server/safe-coder-mcp.js +8 -1
- package/dist/server/safe-coder-mcp.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-install crawl-docs SKILL when MCP server starts
|
|
3
|
+
*/
|
|
4
|
+
export declare class AutoSkillInstaller {
|
|
5
|
+
private readonly SKILL_NAME;
|
|
6
|
+
private readonly CLAUDE_SKILLS_DIR;
|
|
7
|
+
/**
|
|
8
|
+
* Install crawl-docs SKILL if it doesn't exist
|
|
9
|
+
*/
|
|
10
|
+
installCrawlDocsSkill(): Promise<void>;
|
|
11
|
+
/**
|
|
12
|
+
* Generate SKILL.md content
|
|
13
|
+
*/
|
|
14
|
+
private generateSkillContent;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=auto-skill-installer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-skill-installer.d.ts","sourceRoot":"","sources":["../../src/server/auto-skill-installer.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgB;IAC3C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAwC;IAE1E;;OAEG;IACG,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IA8B5C;;OAEG;IACH,OAAO,CAAC,oBAAoB;CAyH7B"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { mkdir, writeFile, access, constants } from 'fs/promises';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import { homedir } from 'os';
|
|
4
|
+
/**
|
|
5
|
+
* Auto-install crawl-docs SKILL when MCP server starts
|
|
6
|
+
*/
|
|
7
|
+
export class AutoSkillInstaller {
|
|
8
|
+
SKILL_NAME = 'crawl-docs';
|
|
9
|
+
CLAUDE_SKILLS_DIR = join(homedir(), '.claude', 'skills');
|
|
10
|
+
/**
|
|
11
|
+
* Install crawl-docs SKILL if it doesn't exist
|
|
12
|
+
*/
|
|
13
|
+
async installCrawlDocsSkill() {
|
|
14
|
+
try {
|
|
15
|
+
const skillDir = join(this.CLAUDE_SKILLS_DIR, this.SKILL_NAME);
|
|
16
|
+
const skillMdPath = join(skillDir, 'SKILL.md');
|
|
17
|
+
// Check if SKILL already exists
|
|
18
|
+
try {
|
|
19
|
+
await access(skillMdPath, constants.F_OK);
|
|
20
|
+
// SKILL already exists, no need to install
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
// SKILL doesn't exist, proceed with installation
|
|
25
|
+
}
|
|
26
|
+
// Create skill directory
|
|
27
|
+
await mkdir(skillDir, { recursive: true });
|
|
28
|
+
// Generate SKILL.md content
|
|
29
|
+
const skillContent = this.generateSkillContent();
|
|
30
|
+
// Write SKILL.md
|
|
31
|
+
await writeFile(skillMdPath, skillContent, 'utf-8');
|
|
32
|
+
console.error(`[Safe Coder MCP] Auto-installed crawl-docs SKILL at: ${skillMdPath}`);
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
// Log error but don't fail MCP startup
|
|
36
|
+
console.error(`[Safe Coder MCP] Failed to auto-install crawl-docs SKILL:`, error);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Generate SKILL.md content
|
|
41
|
+
*/
|
|
42
|
+
generateSkillContent() {
|
|
43
|
+
return `---
|
|
44
|
+
name: crawl-docs
|
|
45
|
+
description: Crawl online documentation and automatically generate Agent SKILLs. Use when user asks to crawl documentation, scrape docs, generate SKILL from URL, or create skill from documentation website. Supports Chinese requests (爬取文档、抓取文档、生成SKILL).
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
# Crawl Documentation and Generate SKILL
|
|
49
|
+
|
|
50
|
+
Automatically crawl documentation websites and generate high-quality Agent SKILLs using the safe-coder MCP server.
|
|
51
|
+
|
|
52
|
+
## When to Use
|
|
53
|
+
|
|
54
|
+
Use this skill when the user requests:
|
|
55
|
+
- "Crawl [documentation URL] and generate SKILL"
|
|
56
|
+
- "Scrape docs from [URL]"
|
|
57
|
+
- "Create a skill from [documentation website]"
|
|
58
|
+
- "Generate SKILL from [URL]"
|
|
59
|
+
- Chinese: "爬取文档"、"抓取文档"、"从文档生成SKILL"
|
|
60
|
+
|
|
61
|
+
## Required Information
|
|
62
|
+
|
|
63
|
+
Gather from the user:
|
|
64
|
+
1. **Documentation URL** - The website to crawl
|
|
65
|
+
2. **Skill name** - Short identifier (e.g., "react", "vue-guide")
|
|
66
|
+
3. **Max pages** (optional) - How many pages to crawl (default: 50)
|
|
67
|
+
|
|
68
|
+
## Implementation Steps
|
|
69
|
+
|
|
70
|
+
### Step 1: Check MCP Availability
|
|
71
|
+
|
|
72
|
+
First, verify the \`user-safe-coder\` MCP server is available by reading its tool schema:
|
|
73
|
+
|
|
74
|
+
\`\`\`
|
|
75
|
+
Read: /Users/wormhole/.cursor/projects/Users-wormhole-Documents-Developments-Our-mcp/mcps/user-safe-coder/tools/crawl_documentation.json
|
|
76
|
+
\`\`\`
|
|
77
|
+
|
|
78
|
+
### Step 2: Call the Tool
|
|
79
|
+
|
|
80
|
+
Use \`CallMcpTool\` to crawl documentation:
|
|
81
|
+
|
|
82
|
+
\`\`\`javascript
|
|
83
|
+
CallMcpTool({
|
|
84
|
+
server: "user-safe-coder",
|
|
85
|
+
toolName: "crawl_documentation",
|
|
86
|
+
arguments: {
|
|
87
|
+
url: "<documentation-url>",
|
|
88
|
+
skillName: "<skill-name>",
|
|
89
|
+
maxPages: <number>, // Optional, default 50
|
|
90
|
+
outputDir: "~/.claude/skills" // Optional, default ~/.claude/skills
|
|
91
|
+
}
|
|
92
|
+
})
|
|
93
|
+
\`\`\`
|
|
94
|
+
|
|
95
|
+
### Step 3: Verify Output
|
|
96
|
+
|
|
97
|
+
After crawling completes:
|
|
98
|
+
1. Check the generated SKILL location (default: \`~/.claude/skills/<skill-name>/\`)
|
|
99
|
+
2. Verify the SKILL.md file and references/ directory were created
|
|
100
|
+
3. Inform the user where the skill was saved
|
|
101
|
+
|
|
102
|
+
## Parameters Reference
|
|
103
|
+
|
|
104
|
+
### Required
|
|
105
|
+
- \`url\` (string) - Documentation website URL to crawl
|
|
106
|
+
- \`skillName\` (string) - Name for the skill directory (e.g., "react", "vue-docs")
|
|
107
|
+
|
|
108
|
+
### Optional
|
|
109
|
+
- \`maxPages\` (number) - Maximum pages to crawl (default: 50)
|
|
110
|
+
- \`depth\` (number) - Maximum crawl depth (default: 3)
|
|
111
|
+
- \`outputDir\` (string) - Output directory (default: ~/.claude/skills)
|
|
112
|
+
- \`useCache\` (boolean) - Use cached results if available (default: true)
|
|
113
|
+
- \`forceRefresh\` (boolean) - Force refresh even if cached (default: false)
|
|
114
|
+
- \`useBrowser\` (boolean) - Force browser automation for SPA sites
|
|
115
|
+
- \`browser\` (string) - "puppeteer" or "playwright"
|
|
116
|
+
- \`spaStrategy\` (string) - "smart", "auto", or "manual"
|
|
117
|
+
|
|
118
|
+
## What the Tool Does
|
|
119
|
+
|
|
120
|
+
The \`crawl_documentation\` tool:
|
|
121
|
+
- Crawls the documentation website automatically
|
|
122
|
+
- Extracts content, code examples, and patterns
|
|
123
|
+
- Analyzes structure and categorizes content
|
|
124
|
+
- Generates a concise SKILL.md (< 500 lines)
|
|
125
|
+
- Creates organized reference files in \`references/\` subdirectory
|
|
126
|
+
- Saves directly to disk (default: ~/.claude/skills/)
|
|
127
|
+
- Returns only a lightweight summary to minimize token usage
|
|
128
|
+
|
|
129
|
+
## Example Usage
|
|
130
|
+
|
|
131
|
+
**User request:**
|
|
132
|
+
\`\`\`
|
|
133
|
+
请爬取 React 文档并生成 SKILL:
|
|
134
|
+
- URL: https://react.dev
|
|
135
|
+
- 最多 20 页
|
|
136
|
+
- 命名为 react
|
|
137
|
+
\`\`\`
|
|
138
|
+
|
|
139
|
+
**Your response:**
|
|
140
|
+
1. Read the tool schema
|
|
141
|
+
2. Call crawl_documentation with:
|
|
142
|
+
- url: "https://react.dev"
|
|
143
|
+
- skillName: "react"
|
|
144
|
+
- maxPages: 20
|
|
145
|
+
3. Inform user: "SKILL has been generated at ~/.claude/skills/react/ with references directory"
|
|
146
|
+
|
|
147
|
+
## Error Handling
|
|
148
|
+
|
|
149
|
+
If the tool fails:
|
|
150
|
+
1. Check if safe-coder-cli is installed
|
|
151
|
+
2. Verify the URL is accessible
|
|
152
|
+
3. Check network connectivity
|
|
153
|
+
4. Review error message and suggest solutions
|
|
154
|
+
|
|
155
|
+
## Notes
|
|
156
|
+
|
|
157
|
+
- The tool uses caching by default to avoid re-crawling
|
|
158
|
+
- Generated SKILLs follow Cursor Agent SKILL best practices
|
|
159
|
+
- Reference files are automatically organized by category
|
|
160
|
+
- The tool is optimized for documentation sites (not general web scraping)
|
|
161
|
+
`;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=auto-skill-installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-skill-installer.js","sourceRoot":"","sources":["../../src/server/auto-skill-installer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAE7B;;GAEG;AACH,MAAM,OAAO,kBAAkB;IACZ,UAAU,GAAG,YAAY,CAAC;IAC1B,iBAAiB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAE1E;;OAEG;IACH,KAAK,CAAC,qBAAqB;QACzB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YAC/D,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YAE/C,gCAAgC;YAChC,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,WAAW,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;gBAC1C,2CAA2C;gBAC3C,OAAO;YACT,CAAC;YAAC,MAAM,CAAC;gBACP,iDAAiD;YACnD,CAAC;YAED,yBAAyB;YACzB,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAE3C,4BAA4B;YAC5B,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAEjD,iBAAiB;YACjB,MAAM,SAAS,CAAC,WAAW,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;YAEpD,OAAO,CAAC,KAAK,CAAC,wDAAwD,WAAW,EAAE,CAAC,CAAC;QACvF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,uCAAuC;YACvC,OAAO,CAAC,KAAK,CAAC,2DAA2D,EAAE,KAAK,CAAC,CAAC;QACpF,CAAC;IACH,CAAC;IAED;;OAEG;IACK,oBAAoB;QAC1B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsHV,CAAC;IACA,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"safe-coder-mcp.d.ts","sourceRoot":"","sources":["../../src/server/safe-coder-mcp.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"safe-coder-mcp.d.ts","sourceRoot":"","sources":["../../src/server/safe-coder-mcp.ts"],"names":[],"mappings":";AAcA;;;GAGG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,kBAAkB,CAAqB;;IAY/C;;OAEG;IACH,OAAO,CAAC,UAAU;IAwKlB;;OAEG;IACG,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAS3B"}
|
|
@@ -2,17 +2,20 @@
|
|
|
2
2
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
3
3
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
4
|
import { crawlDocumentation, CrawlDocumentationSchema, listCachedDocumentation, clearCache, ClearCacheSchema, saveSkill, SaveSkillSchema, } from '../tools/index.js';
|
|
5
|
+
import { AutoSkillInstaller } from './auto-skill-installer.js';
|
|
5
6
|
/**
|
|
6
7
|
* Safe Coder MCP Server
|
|
7
8
|
* Orchestrates safe-coder-cli for documentation crawling and SKILL generation
|
|
8
9
|
*/
|
|
9
10
|
export class SafeCoderMCPServer {
|
|
10
11
|
server;
|
|
12
|
+
autoSkillInstaller;
|
|
11
13
|
constructor() {
|
|
12
14
|
this.server = new McpServer({
|
|
13
15
|
name: 'safe-coder',
|
|
14
16
|
version: '1.0.0',
|
|
15
17
|
});
|
|
18
|
+
this.autoSkillInstaller = new AutoSkillInstaller();
|
|
16
19
|
this.setupTools();
|
|
17
20
|
}
|
|
18
21
|
/**
|
|
@@ -23,7 +26,9 @@ export class SafeCoderMCPServer {
|
|
|
23
26
|
this.server.registerTool('crawl_documentation', {
|
|
24
27
|
title: 'Crawl Documentation and Generate SKILL',
|
|
25
28
|
description: 'Crawl documentation website and automatically generate a complete Agent SKILL. ' +
|
|
26
|
-
'
|
|
29
|
+
'Use this tool when the user asks to: crawl documentation, scrape docs, generate SKILL from URL, ' +
|
|
30
|
+
'create skill from documentation, or similar requests (爬取文档、抓取文档、从文档生成SKILL). ' +
|
|
31
|
+
'\n\nThis tool saves files directly to disk and returns only a lightweight summary. ' +
|
|
27
32
|
'The CLI generates a high-quality SKILL.md (< 500 lines) based on complete content analysis, ' +
|
|
28
33
|
'along with organized reference files. Agent receives only the summary to minimize token cost. ' +
|
|
29
34
|
'\n\nRequired: url, skillName. ' +
|
|
@@ -163,6 +168,8 @@ export class SafeCoderMCPServer {
|
|
|
163
168
|
* Start the MCP server
|
|
164
169
|
*/
|
|
165
170
|
async run() {
|
|
171
|
+
// Auto-install crawl-docs SKILL if it doesn't exist
|
|
172
|
+
await this.autoSkillInstaller.installCrawlDocsSkill();
|
|
166
173
|
const transport = new StdioServerTransport();
|
|
167
174
|
await this.server.connect(transport);
|
|
168
175
|
console.error('Safe Coder MCP Server running on stdio');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"safe-coder-mcp.js","sourceRoot":"","sources":["../../src/server/safe-coder-mcp.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,uBAAuB,EACvB,UAAU,EACV,gBAAgB,EAChB,SAAS,EACT,eAAe,GAChB,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"safe-coder-mcp.js","sourceRoot":"","sources":["../../src/server/safe-coder-mcp.ts"],"names":[],"mappings":"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"}
|