skillslap-mcp 1.2.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 atapifire
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,150 @@
1
+ # skillslap-mcp
2
+
3
+ MCP server for the [SkillSlap](https://skillslap.com) agent skill marketplace. Search, install, compose, and publish skills from your AI coding agent.
4
+
5
+ ## Setup
6
+
7
+ ### Claude Code
8
+
9
+ ```bash
10
+ claude mcp add skillslap -- npx skillslap-mcp
11
+ ```
12
+
13
+ ### Cursor
14
+
15
+ Add to `.cursor/mcp.json`:
16
+
17
+ ```json
18
+ {
19
+ "mcpServers": {
20
+ "skillslap": {
21
+ "command": "npx",
22
+ "args": ["skillslap-mcp"],
23
+ "env": {
24
+ "SKILLSLAP_TOKEN": "your-token-here"
25
+ }
26
+ }
27
+ }
28
+ }
29
+ ```
30
+
31
+ ### Cline
32
+
33
+ Add to your MCP settings:
34
+
35
+ ```json
36
+ {
37
+ "mcpServers": {
38
+ "skillslap": {
39
+ "command": "npx",
40
+ "args": ["skillslap-mcp"],
41
+ "env": {
42
+ "SKILLSLAP_TOKEN": "your-token-here"
43
+ }
44
+ }
45
+ }
46
+ }
47
+ ```
48
+
49
+ ## Environment Variables
50
+
51
+ | Variable | Required | Default | Description |
52
+ |----------|----------|---------|-------------|
53
+ | `SKILLSLAP_API_URL` | No | `https://skillslap.com` | API base URL |
54
+ | `SKILLSLAP_TOKEN` | For publish/update/compose of private skills | — | Auth token from your SkillSlap account |
55
+
56
+ ## Tools
57
+
58
+ ### `search_skills`
59
+ Search the marketplace for agent skills. Returns compact results with install URLs.
60
+
61
+ - `query` (string) — Search query (omit to browse all)
62
+ - `tags` (string) — Comma-separated tag filter
63
+ - `invocation_type` (string) — `agent` | `user` | `tool` | `context`
64
+ - `sort` (string) — `relevance` | `trending` | `recent` | `slaps` | `focus_pool`
65
+ - `limit` (number) — Max results (default: 10, max: 50)
66
+ - `verified` (boolean) — Only return verified skills
67
+
68
+ ### `get_skill`
69
+ Get details for a specific skill by ID with tiered data loading.
70
+
71
+ - `id` (string, required) — Skill UUID
72
+ - `tier` (number) — `1` = metadata, `2` = full (default), `3` = with files
73
+
74
+ ### `install_skill`
75
+ Download a skill formatted for your agent, ready to save.
76
+
77
+ - `id` (string, required) — Skill UUID
78
+ - `agent` (string) — Agent name: `claude-code`, `cursor`, `cline`, `codex`, `windsurf`, `aider`, `copilot`, `gemini-cli`, `vscode`
79
+
80
+ ### `list_versions`
81
+ Get version history for a skill with change summaries.
82
+
83
+ - `id` (string, required) — Skill UUID
84
+
85
+ ### `publish_skill`
86
+ Publish a new skill to the marketplace. Requires `SKILLSLAP_TOKEN`.
87
+
88
+ - `title` (string, required) — Skill title (1-100 chars)
89
+ - `content` (string, required) — Skill content in Markdown
90
+ - `description` (string) — Short description (max 500 chars)
91
+ - `tags` (string[]) — Tags (max 10)
92
+ - `invocation_type` (string) — `agent` | `user` | `tool` | `context`
93
+ - `status` (string) — `draft` | `active`
94
+
95
+ ### `update_skill`
96
+ Update a skill you own. Requires `SKILLSLAP_TOKEN`.
97
+
98
+ - `id` (string, required) — Skill UUID
99
+ - `title` (string) — New title
100
+ - `content` (string) — New content in Markdown
101
+ - `description` (string) — New description
102
+ - `tags` (string[]) — New tag list (replaces existing)
103
+ - `status` (string) — `draft` | `active` | `archived`
104
+ - `version` (string) — New version string (e.g. `"1.1.0"`)
105
+ - `change_summary` (string) — What changed (stored in version history)
106
+
107
+ ### `generate_skill`
108
+ Generate a skill from a natural language description using AI. Requires `SKILLSLAP_TOKEN` and a BYOK Anthropic API key configured on your account.
109
+
110
+ - `prompt` (string, required) — Description of the skill to generate (10-2000 chars)
111
+ - `auto_publish` (boolean) — Publish immediately (default: false, returns draft for review)
112
+
113
+ ### `compose_skills`
114
+ Compose multiple skills into a CLAUDE.md + agent_docs structure. No auth required for public skills.
115
+
116
+ - `skill_ids` (string[], required) — Array of skill UUIDs to compose
117
+ - `project_name` (string) — Optional project name for the output
118
+
119
+ ## CLI
120
+
121
+ The package also installs a `skillslap` CLI for use in terminals and scripts.
122
+
123
+ ```bash
124
+ skillslap search "code review"
125
+ skillslap search testing --verified --limit=5
126
+ skillslap install <skill-id>
127
+ skillslap install <skill-id> --agent=claude-code
128
+ skillslap list
129
+ skillslap publish ./SKILL.md --tags="python,testing" --status=active
130
+ ```
131
+
132
+ ## Usage Example
133
+
134
+ ```
135
+ You: Search for testing skills
136
+ Agent: [calls search_skills with query "testing"]
137
+
138
+ You: Install the first one
139
+ Agent: [calls install_skill with the skill ID]
140
+
141
+ You: Update that skill with improved content
142
+ Agent: [calls update_skill with the skill ID and new content]
143
+
144
+ You: Compose these two skills into my project
145
+ Agent: [calls compose_skills with skill IDs]
146
+ ```
147
+
148
+ ## License
149
+
150
+ MIT
@@ -0,0 +1,80 @@
1
+ export interface SearchResult {
2
+ id: string;
3
+ name: string;
4
+ title: string;
5
+ description: string | null;
6
+ version: string;
7
+ tags: string[];
8
+ author: string;
9
+ verification: {
10
+ status: string | null;
11
+ score: number | null;
12
+ };
13
+ slap_count: number;
14
+ invocation_type: string;
15
+ install_url: string;
16
+ export_url: string;
17
+ }
18
+ export interface SearchResponse {
19
+ query: string;
20
+ results: SearchResult[];
21
+ total: number;
22
+ }
23
+ export interface GeneratedSkill {
24
+ title: string;
25
+ description: string;
26
+ content: string;
27
+ tags: string[];
28
+ invocation_type: string;
29
+ }
30
+ export interface SkillVersion {
31
+ id: string;
32
+ skill_id: string;
33
+ version: string;
34
+ change_summary: string | null;
35
+ created_at: string;
36
+ }
37
+ export declare class SkillSlapClient {
38
+ private baseUrl;
39
+ private token?;
40
+ constructor(baseUrl: string, token?: string);
41
+ private fetch;
42
+ searchSkills(q: string, opts?: {
43
+ tags?: string;
44
+ invocationType?: string;
45
+ sort?: string;
46
+ limit?: number;
47
+ verified?: boolean;
48
+ }): Promise<SearchResponse>;
49
+ getSkill(id: string, tier?: number): Promise<any>;
50
+ installSkill(id: string, agent?: string): Promise<string>;
51
+ listVersions(id: string): Promise<{
52
+ versions: SkillVersion[];
53
+ }>;
54
+ composeSkills(skillIds: string[], projectName?: string): Promise<{
55
+ claude_md: string;
56
+ agent_docs: Record<string, string>;
57
+ skills: Array<{
58
+ id: string;
59
+ title: string;
60
+ }>;
61
+ }>;
62
+ generateSkill(prompt: string): Promise<GeneratedSkill>;
63
+ publishSkill(data: {
64
+ title: string;
65
+ content: string;
66
+ description?: string;
67
+ tags?: string[];
68
+ invocation_type?: string;
69
+ status?: string;
70
+ }): Promise<any>;
71
+ updateSkill(id: string, data: {
72
+ title?: string;
73
+ content?: string;
74
+ description?: string | null;
75
+ tags?: string[];
76
+ status?: string;
77
+ version?: string;
78
+ change_summary?: string;
79
+ }): Promise<any>;
80
+ }
@@ -0,0 +1,138 @@
1
+ export class SkillSlapClient {
2
+ baseUrl;
3
+ token;
4
+ constructor(baseUrl, token) {
5
+ // Remove trailing slash
6
+ this.baseUrl = baseUrl.replace(/\/+$/, '');
7
+ this.token = token;
8
+ }
9
+ async fetch(path, options) {
10
+ const url = `${this.baseUrl}${path}`;
11
+ const headers = {
12
+ 'Accept': 'application/json',
13
+ ...(options?.headers || {}),
14
+ };
15
+ if (this.token) {
16
+ headers['Authorization'] = `Bearer ${this.token}`;
17
+ }
18
+ const response = await fetch(url, {
19
+ ...options,
20
+ headers,
21
+ });
22
+ return response;
23
+ }
24
+ async searchSkills(q, opts) {
25
+ const params = new URLSearchParams();
26
+ if (q)
27
+ params.set('q', q);
28
+ if (opts?.tags)
29
+ params.set('tags', opts.tags);
30
+ if (opts?.invocationType)
31
+ params.set('invocation_type', opts.invocationType);
32
+ if (opts?.sort)
33
+ params.set('sort', opts.sort);
34
+ if (opts?.limit)
35
+ params.set('limit', String(opts.limit));
36
+ if (opts?.verified)
37
+ params.set('verified', 'true');
38
+ const res = await this.fetch(`/api/v1/skills/search?${params}`);
39
+ if (!res.ok) {
40
+ const err = await res.json().catch(() => ({ error: res.statusText }));
41
+ throw new Error(`Search failed (${res.status}): ${err.error || res.statusText}`);
42
+ }
43
+ return res.json();
44
+ }
45
+ async getSkill(id, tier) {
46
+ const params = new URLSearchParams();
47
+ if (tier)
48
+ params.set('tier', String(tier));
49
+ const qs = params.toString();
50
+ const res = await this.fetch(`/api/v1/skills/${id}${qs ? `?${qs}` : ''}`);
51
+ if (!res.ok) {
52
+ const err = await res.json().catch(() => ({ error: res.statusText }));
53
+ throw new Error(`Get skill failed (${res.status}): ${err.error || res.statusText}`);
54
+ }
55
+ return res.json();
56
+ }
57
+ async installSkill(id, agent) {
58
+ const params = new URLSearchParams();
59
+ if (agent)
60
+ params.set('agent', agent);
61
+ const qs = params.toString();
62
+ const res = await this.fetch(`/api/v1/skills/${id}/install${qs ? `?${qs}` : ''}`);
63
+ if (!res.ok) {
64
+ const err = await res.json().catch(() => ({ error: res.statusText }));
65
+ throw new Error(`Install failed (${res.status}): ${err.error || res.statusText}`);
66
+ }
67
+ return res.text();
68
+ }
69
+ async listVersions(id) {
70
+ const res = await this.fetch(`/api/v1/skills/${id}/versions`);
71
+ if (!res.ok) {
72
+ const err = await res.json().catch(() => ({ error: res.statusText }));
73
+ throw new Error(`List versions failed (${res.status}): ${err.error || res.statusText}`);
74
+ }
75
+ return res.json();
76
+ }
77
+ async composeSkills(skillIds, projectName) {
78
+ const body = { skill_ids: skillIds };
79
+ if (projectName)
80
+ body.project_name = projectName;
81
+ const res = await this.fetch('/api/v1/skills/compose', {
82
+ method: 'POST',
83
+ headers: { 'Content-Type': 'application/json' },
84
+ body: JSON.stringify(body),
85
+ });
86
+ if (!res.ok) {
87
+ const err = await res.json().catch(() => ({ error: res.statusText }));
88
+ throw new Error(`Compose failed (${res.status}): ${err.error || res.statusText}`);
89
+ }
90
+ return res.json();
91
+ }
92
+ async generateSkill(prompt) {
93
+ if (!this.token) {
94
+ throw new Error('Authentication required to generate skills. Set SKILLSLAP_TOKEN.');
95
+ }
96
+ const res = await this.fetch('/api/v1/skills/generate', {
97
+ method: 'POST',
98
+ headers: { 'Content-Type': 'application/json' },
99
+ body: JSON.stringify({ prompt }),
100
+ });
101
+ if (!res.ok) {
102
+ const err = await res.json().catch(() => ({ error: res.statusText }));
103
+ throw new Error(`Generate failed (${res.status}): ${err.error || res.statusText}`);
104
+ }
105
+ return res.json();
106
+ }
107
+ async publishSkill(data) {
108
+ if (!this.token) {
109
+ throw new Error('Authentication required to publish skills. Set SKILLSLAP_TOKEN.');
110
+ }
111
+ const res = await this.fetch('/api/v1/skills', {
112
+ method: 'POST',
113
+ headers: { 'Content-Type': 'application/json' },
114
+ body: JSON.stringify(data),
115
+ });
116
+ if (!res.ok) {
117
+ const err = await res.json().catch(() => ({ error: res.statusText }));
118
+ throw new Error(`Publish failed (${res.status}): ${err.error || res.statusText}`);
119
+ }
120
+ return res.json();
121
+ }
122
+ async updateSkill(id, data) {
123
+ if (!this.token) {
124
+ throw new Error('Authentication required to update skills. Set SKILLSLAP_TOKEN.');
125
+ }
126
+ const res = await this.fetch(`/api/v1/skills/${id}`, {
127
+ method: 'PUT',
128
+ headers: { 'Content-Type': 'application/json' },
129
+ body: JSON.stringify(data),
130
+ });
131
+ if (!res.ok) {
132
+ const err = await res.json().catch(() => ({ error: res.statusText }));
133
+ throw new Error(`Update failed (${res.status}): ${err.error || res.statusText}`);
134
+ }
135
+ return res.json();
136
+ }
137
+ }
138
+ //# sourceMappingURL=api-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,43 @@
1
+ #!/usr/bin/env node
2
+ import { SkillSlapClient } from './api-client.js';
3
+ export declare function slugify(title: string): string;
4
+ export interface InstalledEntry {
5
+ id: string;
6
+ title: string;
7
+ version: string;
8
+ path: string;
9
+ installedAt: string;
10
+ }
11
+ export interface Manifest {
12
+ installed: InstalledEntry[];
13
+ }
14
+ export declare function readManifest(manifestPath: string): Manifest;
15
+ export declare function list(flags: {
16
+ dir?: string;
17
+ }): void;
18
+ export declare function publish(client: SkillSlapClient, filePath: string, flags: {
19
+ title?: string;
20
+ description?: string;
21
+ tags?: string;
22
+ status?: string;
23
+ }): Promise<{
24
+ id: string;
25
+ title: string;
26
+ }>;
27
+ export declare function install(client: SkillSlapClient, id: string, flags: {
28
+ agent?: string;
29
+ dir?: string;
30
+ }): Promise<{
31
+ outPath: string;
32
+ manifestPath: string;
33
+ title: string;
34
+ }>;
35
+ export declare function search(client: SkillSlapClient, query: string, flags: {
36
+ limit?: number;
37
+ verified?: boolean;
38
+ }): Promise<void>;
39
+ export declare function parseArgs(argv: string[]): {
40
+ cmd: string | undefined;
41
+ positional: string[];
42
+ flags: Record<string, string | boolean>;
43
+ };
package/dist/cli.js ADDED
@@ -0,0 +1,242 @@
1
+ #!/usr/bin/env node
2
+ import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';
3
+ import { resolve, join } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { SkillSlapClient } from './api-client.js';
6
+ const API_URL = process.env.SKILLSLAP_API_URL || 'https://skillslap.com';
7
+ const TOKEN = process.env.SKILLSLAP_TOKEN;
8
+ // ── Helpers ──────────────────────────────────────────────────────────────────
9
+ export function slugify(title) {
10
+ return title.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');
11
+ }
12
+ export function readManifest(manifestPath) {
13
+ if (existsSync(manifestPath)) {
14
+ try {
15
+ return JSON.parse(readFileSync(manifestPath, 'utf8'));
16
+ }
17
+ catch {
18
+ // Corrupted manifest — start fresh
19
+ }
20
+ }
21
+ return { installed: [] };
22
+ }
23
+ // ── Commands ─────────────────────────────────────────────────────────────────
24
+ export function list(flags) {
25
+ const dir = flags.dir ? resolve(flags.dir) : process.cwd();
26
+ const manifestPath = join(dir, '.skillslap', 'installed.json');
27
+ const manifest = readManifest(manifestPath);
28
+ if (manifest.installed.length === 0) {
29
+ console.log('No skills installed. Run "skillslap install <skill-id>" to get started.');
30
+ return;
31
+ }
32
+ console.log(`Installed skills (${manifest.installed.length}):\n`);
33
+ manifest.installed.forEach((s) => {
34
+ const date = new Date(s.installedAt).toISOString().slice(0, 10);
35
+ console.log(` ${s.title} v${s.version}`);
36
+ console.log(` ID: ${s.id}`);
37
+ console.log(` Path: ${s.path} (installed ${date})`);
38
+ console.log();
39
+ });
40
+ }
41
+ export async function publish(client, filePath, flags) {
42
+ if (!existsSync(filePath)) {
43
+ throw new Error(`File not found: ${filePath}`);
44
+ }
45
+ const content = readFileSync(filePath, 'utf8');
46
+ // Derive title from first H1 if not provided
47
+ const title = flags.title || content.match(/^#\s+(.+)/m)?.[1]?.trim();
48
+ if (!title) {
49
+ throw new Error('Could not determine title. Add --title="..." or include a # H1 heading in the file.');
50
+ }
51
+ const tags = flags.tags ? flags.tags.split(',').map((t) => t.trim()).filter(Boolean) : undefined;
52
+ const result = await client.publishSkill({
53
+ title,
54
+ content,
55
+ description: flags.description,
56
+ tags,
57
+ status: flags.status || 'draft',
58
+ });
59
+ return { id: result.id, title };
60
+ }
61
+ export async function install(client, id, flags) {
62
+ const dir = flags.dir ? resolve(flags.dir) : process.cwd();
63
+ // Fetch skill metadata (tier 1 = lightweight)
64
+ const skill = await client.getSkill(id, 1);
65
+ const content = await client.installSkill(id, flags.agent);
66
+ const slug = slugify(skill.title || id);
67
+ const isContext = skill.invocation_type === 'context';
68
+ let outPath;
69
+ if (isContext) {
70
+ outPath = join(dir, 'CLAUDE.md');
71
+ }
72
+ else {
73
+ const agentDocsDir = join(dir, 'agent_docs');
74
+ mkdirSync(agentDocsDir, { recursive: true });
75
+ outPath = join(agentDocsDir, `${slug}.md`);
76
+ }
77
+ writeFileSync(outPath, content, 'utf8');
78
+ // Update .skillslap/installed.json manifest
79
+ const manifestDir = join(dir, '.skillslap');
80
+ const manifestPath = join(manifestDir, 'installed.json');
81
+ mkdirSync(manifestDir, { recursive: true });
82
+ const manifest = readManifest(manifestPath);
83
+ manifest.installed = manifest.installed.filter((s) => s.id !== id);
84
+ manifest.installed.push({
85
+ id,
86
+ title: skill.title || slug,
87
+ version: skill.version || '1.0.0',
88
+ path: isContext ? 'CLAUDE.md' : `agent_docs/${slug}.md`,
89
+ installedAt: new Date().toISOString(),
90
+ });
91
+ writeFileSync(manifestPath, JSON.stringify(manifest, null, 2), 'utf8');
92
+ return { outPath, manifestPath, title: skill.title || slug };
93
+ }
94
+ export async function search(client, query, flags) {
95
+ const result = await client.searchSkills(query, {
96
+ limit: flags.limit,
97
+ verified: flags.verified,
98
+ });
99
+ if (result.results.length === 0) {
100
+ console.log(query ? `No skills found for "${query}"` : 'No skills found.');
101
+ return;
102
+ }
103
+ const header = query
104
+ ? `Found ${result.total} skill${result.total === 1 ? '' : 's'} for "${query}"`
105
+ : `Browsing ${result.total} skill${result.total === 1 ? '' : 's'}`;
106
+ console.log(`${header}${flags.verified ? ' (verified only)' : ''}\n`);
107
+ result.results.forEach((s, i) => {
108
+ const badge = s.verification.status === 'passed' ? '✅' : '⬜';
109
+ console.log(`${i + 1}. ${badge} ${s.title} v${s.version} by @${s.author}`);
110
+ if (s.description)
111
+ console.log(` ${s.description.slice(0, 100)}`);
112
+ console.log(` ID: ${s.id}`);
113
+ console.log(` Install: skillslap install ${s.id}`);
114
+ console.log();
115
+ });
116
+ }
117
+ // ── Help ──────────────────────────────────────────────────────────────────────
118
+ function printHelp() {
119
+ console.log(`
120
+ SkillSlap CLI — discover and install agent skills
121
+
122
+ Commands:
123
+ skillslap install <skill-id> Install a skill into the current project
124
+ skillslap list Show all installed skills in this project
125
+ skillslap search <query> Search the marketplace (omit query to browse all)
126
+ skillslap publish <file> Publish a skill from a local markdown file
127
+ skillslap help Show this help
128
+
129
+ Install options:
130
+ --agent=<name> Agent type (claude-code, cursor, cline, etc.) — auto-detected
131
+ --dir=<path> Target directory (default: current directory)
132
+
133
+ List options:
134
+ --dir=<path> Project directory to read manifest from (default: current directory)
135
+
136
+ Search options:
137
+ --limit=<n> Max results (default: 10, max: 50)
138
+ --verified Only show verified skills
139
+
140
+ Publish options:
141
+ --title=<title> Skill title (auto-detected from # H1 if omitted)
142
+ --description=<desc> Short description
143
+ --tags=<a,b,c> Comma-separated tags
144
+ --status=draft|active Publication status (default: draft)
145
+
146
+ Environment:
147
+ SKILLSLAP_API_URL API base URL (default: https://skillslap.com)
148
+ SKILLSLAP_TOKEN Auth token for authenticated skills
149
+
150
+ Examples:
151
+ skillslap search "code review"
152
+ skillslap search testing --verified --limit=5
153
+ skillslap install 550e8400-e29b-41d4-a716-446655440000
154
+ skillslap install 550e8400-... --agent=claude-code --dir=./my-project
155
+ skillslap list
156
+ skillslap publish ./SKILL.md --tags="python,testing" --status=active
157
+ `.trim());
158
+ }
159
+ // ── Arg parser ────────────────────────────────────────────────────────────────
160
+ export function parseArgs(argv) {
161
+ const [, , cmd, ...rest] = argv;
162
+ const flags = {};
163
+ const positional = [];
164
+ for (const arg of rest) {
165
+ if (arg.startsWith('--')) {
166
+ const eqIdx = arg.indexOf('=');
167
+ if (eqIdx !== -1) {
168
+ flags[arg.slice(2, eqIdx)] = arg.slice(eqIdx + 1);
169
+ }
170
+ else {
171
+ flags[arg.slice(2)] = true;
172
+ }
173
+ }
174
+ else {
175
+ positional.push(arg);
176
+ }
177
+ }
178
+ return { cmd, positional, flags };
179
+ }
180
+ // ── Main entry ────────────────────────────────────────────────────────────────
181
+ async function main() {
182
+ const { cmd, positional, flags } = parseArgs(process.argv);
183
+ const client = new SkillSlapClient(API_URL, TOKEN);
184
+ if (!cmd || cmd === 'help' || cmd === '--help' || cmd === '-h') {
185
+ printHelp();
186
+ return;
187
+ }
188
+ if (cmd === 'install') {
189
+ const id = positional[0];
190
+ if (!id) {
191
+ console.error('Error: skill ID required\n\nUsage: skillslap install <skill-id>');
192
+ process.exit(1);
193
+ }
194
+ const { outPath, manifestPath, title } = await install(client, id, {
195
+ agent: flags.agent,
196
+ dir: flags.dir,
197
+ });
198
+ console.log(`✅ Installed: ${title}`);
199
+ console.log(` File: ${outPath}`);
200
+ console.log(` Manifest: ${manifestPath}`);
201
+ return;
202
+ }
203
+ if (cmd === 'search') {
204
+ await search(client, positional.join(' '), {
205
+ limit: flags.limit ? parseInt(flags.limit, 10) : undefined,
206
+ verified: !!flags.verified,
207
+ });
208
+ return;
209
+ }
210
+ if (cmd === 'list') {
211
+ list({ dir: flags.dir });
212
+ return;
213
+ }
214
+ if (cmd === 'publish') {
215
+ const filePath = positional[0];
216
+ if (!filePath) {
217
+ console.error('Error: file path required\n\nUsage: skillslap publish <file>');
218
+ process.exit(1);
219
+ }
220
+ const { id, title } = await publish(client, resolve(filePath), {
221
+ title: flags.title,
222
+ description: flags.description,
223
+ tags: flags.tags,
224
+ status: flags.status,
225
+ });
226
+ console.log(`✅ Published: ${title}`);
227
+ console.log(` ID: ${id}`);
228
+ console.log(` View: https://skillslap.com/skill/${id}`);
229
+ return;
230
+ }
231
+ console.error(`Unknown command: "${cmd}"\n\nRun "skillslap help" for usage.`);
232
+ process.exit(1);
233
+ }
234
+ // Only run when executed directly (not when imported by tests)
235
+ const isMain = process.argv[1] === fileURLToPath(import.meta.url);
236
+ if (isMain) {
237
+ main().catch((err) => {
238
+ console.error(`Error: ${err.message}`);
239
+ process.exit(1);
240
+ });
241
+ }
242
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env node
2
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
3
+ import { SkillSlapClient } from './api-client.js';
4
+ import { createMcpServer } from './server.js';
5
+ const API_URL = process.env.SKILLSLAP_API_URL || 'https://skillslap.com';
6
+ const TOKEN = process.env.SKILLSLAP_TOKEN;
7
+ const client = new SkillSlapClient(API_URL, TOKEN);
8
+ const server = createMcpServer(client);
9
+ async function main() {
10
+ const transport = new StdioServerTransport();
11
+ await server.connect(transport);
12
+ }
13
+ main().catch((error) => {
14
+ console.error('MCP server error:', error);
15
+ process.exit(1);
16
+ });
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAA;AAChF,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAE7C,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,uBAAuB,CAAA;AACxE,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAA;AAEzC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;AAClD,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,CAAA;AAEtC,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAA;IAC5C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;AACjC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAA;IACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA"}
@@ -0,0 +1,3 @@
1
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
+ import type { SkillSlapClient } from './api-client.js';
3
+ export declare function createMcpServer(client: SkillSlapClient): Server;
package/dist/server.js ADDED
@@ -0,0 +1,52 @@
1
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
3
+ import { tools } from './tools.js';
4
+ export function createMcpServer(client) {
5
+ const server = new Server({
6
+ name: 'skillslap-mcp',
7
+ version: '1.0.0',
8
+ }, {
9
+ capabilities: {
10
+ tools: {},
11
+ },
12
+ });
13
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
14
+ return {
15
+ tools: tools.map((t) => ({
16
+ name: t.name,
17
+ description: t.description,
18
+ inputSchema: t.inputSchema,
19
+ })),
20
+ };
21
+ });
22
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
23
+ const { name, arguments: args } = request.params;
24
+ const tool = tools.find((t) => t.name === name);
25
+ if (!tool) {
26
+ return {
27
+ content: [{ type: 'text', text: `Unknown tool: ${name}` }],
28
+ isError: true,
29
+ };
30
+ }
31
+ try {
32
+ const result = await tool.handler(args || {}, client);
33
+ return {
34
+ content: [
35
+ {
36
+ type: 'text',
37
+ text: typeof result === 'string' ? result : JSON.stringify(result, null, 2),
38
+ },
39
+ ],
40
+ };
41
+ }
42
+ catch (error) {
43
+ const message = error instanceof Error ? error.message : String(error);
44
+ return {
45
+ content: [{ type: 'text', text: `Error: ${message}` }],
46
+ isError: true,
47
+ };
48
+ }
49
+ });
50
+ return server;
51
+ }
52
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAA;AAClE,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oCAAoC,CAAA;AAE3C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAElC,MAAM,UAAU,eAAe,CAAC,MAAuB;IACrD,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB;QACE,IAAI,EAAE,eAAe;QACrB,OAAO,EAAE,OAAO;KACjB,EACD;QACE,YAAY,EAAE;YACZ,KAAK,EAAE,EAAE;SACV;KACF,CACF,CAAA;IAED,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;QAC1D,OAAO;YACL,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACvB,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,WAAW,EAAE,CAAC,CAAC,WAAW;aAC3B,CAAC,CAAC;SACJ,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAChE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAA;QAEhD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAA;QAC/C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,IAAI,EAAE,EAAE,CAAC;gBAC1D,OAAO,EAAE,IAAI;aACd,CAAA;QACH,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,EAAE,MAAM,CAAC,CAAA;YACrD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;qBAC5E;iBACF;aACF,CAAA;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YACtE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC;gBACtD,OAAO,EAAE,IAAI;aACd,CAAA;QACH,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,OAAO,MAAM,CAAA;AACf,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { SkillSlapClient } from './api-client.js';
2
+ export interface ToolDefinition {
3
+ name: string;
4
+ description: string;
5
+ inputSchema: Record<string, unknown>;
6
+ handler: (args: Record<string, unknown>, client: SkillSlapClient) => Promise<unknown>;
7
+ }
8
+ export declare const tools: ToolDefinition[];
package/dist/tools.js ADDED
@@ -0,0 +1,361 @@
1
+ import { z } from 'zod';
2
+ // ── Output formatters (D.2: markdown for LLM consumption) ────────────────────
3
+ function verificationBadge(status, score) {
4
+ if (status === 'passed' && score !== null)
5
+ return `✅ Verified ${Math.round(score * 100)}%`;
6
+ if (status === 'failed')
7
+ return '❌ Failed verification';
8
+ if (status === 'running')
9
+ return '⏳ Verifying...';
10
+ return '⬜ Unverified';
11
+ }
12
+ function formatSearchResults(data, opts = {}) {
13
+ const { results, total, query } = data;
14
+ if (results.length === 0) {
15
+ const subject = query ? `"${query}"` : 'your filters';
16
+ return `No skills found for ${subject}.`;
17
+ }
18
+ const header = query
19
+ ? `Found ${total} skill${total === 1 ? '' : 's'} for "${query}"${opts.verified ? ' · verified only' : ''}`
20
+ : `Browsing ${total} skill${total === 1 ? '' : 's'}${opts.verified ? ' · verified only' : ''}`;
21
+ const lines = [header, ''];
22
+ results.forEach((s, i) => {
23
+ const tags = s.tags.length > 0 ? s.tags.map((t) => `\`${t}\``).join(' ') : 'none';
24
+ const desc = s.description ? `> ${s.description.slice(0, 120)}${s.description.length > 120 ? '…' : ''}` : '';
25
+ lines.push(`${i + 1}. **${s.title}** v${s.version} · by @${s.author}`);
26
+ lines.push(` ${verificationBadge(s.verification.status, s.verification.score)} · ${s.slap_count} slaps · ${s.invocation_type}`);
27
+ lines.push(` Tags: ${tags}`);
28
+ if (desc)
29
+ lines.push(` ${desc}`);
30
+ lines.push(` To install: use \`install_skill\` with id \`${s.id}\``);
31
+ lines.push('');
32
+ });
33
+ return lines.join('\n').trim();
34
+ }
35
+ function formatSkillDetail(skill, tier) {
36
+ const vBadge = verificationBadge(skill.latest_verification_status ?? null, skill.latest_verification_score ?? null);
37
+ const tags = (skill.tags || []).map((t) => `\`${t}\``).join(' ') || 'none';
38
+ const author = skill.author?.username ?? 'unknown';
39
+ const lines = [
40
+ `# ${skill.title} v${skill.version ?? '1.0.0'}`,
41
+ '',
42
+ `**Author:** @${author} | **Status:** ${skill.status ?? 'active'} | **Invocation:** ${skill.invocation_type ?? 'agent'}`,
43
+ `**${vBadge}** | **Slaps:** ${skill.slap_count ?? 0} | **Focus Pool:** $${skill.focus_pool ?? 0}`,
44
+ `**Tags:** ${tags}`,
45
+ '',
46
+ ];
47
+ if (skill.description) {
48
+ lines.push(`> ${skill.description}`, '');
49
+ }
50
+ if (tier >= 2 && skill.content) {
51
+ lines.push('---', '', skill.content, '', '---', '');
52
+ }
53
+ if (tier >= 3 && skill.skill_files?.length > 0) {
54
+ lines.push(`**Files (${skill.skill_files.length}):**`);
55
+ skill.skill_files.forEach((f) => lines.push(`- \`${f.file_name}\` (${f.mime_type})`));
56
+ lines.push('');
57
+ }
58
+ lines.push(`**Install:** \`install_skill\` with id \`${skill.id}\``);
59
+ lines.push(`**ID:** \`${skill.id}\``);
60
+ return lines.join('\n');
61
+ }
62
+ function formatComposeResult(result, skillIds) {
63
+ const { claude_md, agent_docs, skills } = result;
64
+ const fileCount = Object.keys(agent_docs).length;
65
+ const total = 1 + fileCount;
66
+ const lines = [
67
+ `# Composed ${skillIds.length} Skill${skillIds.length === 1 ? '' : 's'} → ${total} File${total === 1 ? '' : 's'}`,
68
+ '',
69
+ ];
70
+ // Skills summary
71
+ if (skills && skills.length > 0) {
72
+ lines.push('**Skills included:**');
73
+ for (const s of skills) {
74
+ lines.push(`- **${s.title}** · \`${s.id}\``);
75
+ }
76
+ lines.push('');
77
+ }
78
+ lines.push('## Option A — Full project structure (CLAUDE.md + agent_docs)', '', '**Step 1:** Write the following to `CLAUDE.md` in your project root:', '', '```markdown', claude_md, '```', '');
79
+ if (fileCount > 0) {
80
+ lines.push(`**Step 2:** Create ${fileCount} file${fileCount === 1 ? '' : 's'} in \`agent_docs/\`:`);
81
+ lines.push('');
82
+ for (const [filename, content] of Object.entries(agent_docs)) {
83
+ lines.push(`### \`agent_docs/${filename}\``);
84
+ lines.push('');
85
+ lines.push('```markdown');
86
+ lines.push(content);
87
+ lines.push('```');
88
+ lines.push('');
89
+ }
90
+ }
91
+ lines.push('---', '');
92
+ lines.push('## Option B — Install each skill individually (simpler)', '');
93
+ lines.push('Run these commands in your project directory:', '', '```bash');
94
+ if (skills && skills.length > 0) {
95
+ for (const s of skills) {
96
+ lines.push(`skillslap install ${s.id} # ${s.title}`);
97
+ }
98
+ }
99
+ else {
100
+ for (const id of skillIds) {
101
+ lines.push(`skillslap install ${id}`);
102
+ }
103
+ }
104
+ lines.push('```', '');
105
+ lines.push('---', '');
106
+ lines.push(`✅ Your agent will have access to all ${skillIds.length} composed skill${skillIds.length === 1 ? '' : 's'}.`);
107
+ return lines.join('\n');
108
+ }
109
+ function formatVersions(data, skillId) {
110
+ const { versions } = data;
111
+ if (versions.length === 0)
112
+ return `No version history for skill \`${skillId}\`.`;
113
+ const lines = [`# Version History (${versions.length} version${versions.length === 1 ? '' : 's'})`, ''];
114
+ for (const v of versions) {
115
+ const date = new Date(v.created_at).toISOString().slice(0, 10);
116
+ lines.push(`## v${v.version} · ${date}`);
117
+ if (v.change_summary)
118
+ lines.push(`> ${v.change_summary}`);
119
+ lines.push(`ID: \`${v.id}\``, '');
120
+ }
121
+ return lines.join('\n').trim();
122
+ }
123
+ export const tools = [
124
+ {
125
+ name: 'search_skills',
126
+ description: 'Search or browse the SkillSlap marketplace for agent skills. Omit query to browse all skills. Returns formatted markdown results.',
127
+ inputSchema: {
128
+ type: 'object',
129
+ properties: {
130
+ query: { type: 'string', description: 'Search query (optional — omit to browse all skills)' },
131
+ tags: { type: 'string', description: 'Comma-separated tag filter (optional)' },
132
+ invocation_type: {
133
+ type: 'string',
134
+ enum: ['agent', 'user', 'tool', 'context'],
135
+ description: 'Filter by invocation type (optional)',
136
+ },
137
+ sort: {
138
+ type: 'string',
139
+ enum: ['relevance', 'trending', 'recent', 'slaps', 'focus_pool'],
140
+ description: 'Sort order (default: relevance)',
141
+ },
142
+ limit: { type: 'number', description: 'Max results (default: 10, max: 50)' },
143
+ verified: { type: 'boolean', description: 'If true, return only verified skills' },
144
+ },
145
+ required: [],
146
+ },
147
+ handler: async (args, client) => {
148
+ const query = args.query ? z.string().parse(args.query) : '';
149
+ const tags = args.tags ? z.string().parse(args.tags) : undefined;
150
+ const invocationType = args.invocation_type ? z.string().parse(args.invocation_type) : undefined;
151
+ const sort = args.sort ? z.string().parse(args.sort) : undefined;
152
+ const limit = args.limit ? z.number().int().min(1).max(50).parse(args.limit) : undefined;
153
+ const verified = args.verified ? z.boolean().parse(args.verified) : undefined;
154
+ const result = await client.searchSkills(query, { tags, invocationType, sort, limit, verified });
155
+ return formatSearchResults(result, { verified: verified ?? false });
156
+ },
157
+ },
158
+ {
159
+ name: 'get_skill',
160
+ description: 'Get details for a specific skill by ID. Use tier 1 for metadata only, tier 2 for full content, tier 3 for content + files.',
161
+ inputSchema: {
162
+ type: 'object',
163
+ properties: {
164
+ id: { type: 'string', description: 'Skill UUID' },
165
+ tier: {
166
+ type: 'number',
167
+ enum: [1, 2, 3],
168
+ description: 'Data tier: 1=metadata, 2=full (default), 3=with files',
169
+ },
170
+ },
171
+ required: ['id'],
172
+ },
173
+ handler: async (args, client) => {
174
+ const id = z.string().uuid().parse(args.id);
175
+ const tier = args.tier ? z.number().int().min(1).max(3).parse(args.tier) : undefined;
176
+ const result = await client.getSkill(id, tier);
177
+ return formatSkillDetail(result, tier ?? 2);
178
+ },
179
+ },
180
+ {
181
+ name: 'install_skill',
182
+ description: 'Download a skill in the best format for your agent. Returns the formatted skill content ready to save.',
183
+ inputSchema: {
184
+ type: 'object',
185
+ properties: {
186
+ id: { type: 'string', description: 'Skill UUID' },
187
+ agent: {
188
+ type: 'string',
189
+ description: 'Agent name (auto-detected from User-Agent if omitted). Options: claude-code, cursor, cline, codex, windsurf, aider, copilot, gemini-cli, vscode',
190
+ },
191
+ },
192
+ required: ['id'],
193
+ },
194
+ handler: async (args, client) => {
195
+ const id = z.string().uuid().parse(args.id);
196
+ const agent = args.agent ? z.string().parse(args.agent) : undefined;
197
+ return client.installSkill(id, agent);
198
+ },
199
+ },
200
+ {
201
+ name: 'list_versions',
202
+ description: 'Get version history for a skill. Shows all past versions with change summaries.',
203
+ inputSchema: {
204
+ type: 'object',
205
+ properties: {
206
+ id: { type: 'string', description: 'Skill UUID' },
207
+ },
208
+ required: ['id'],
209
+ },
210
+ handler: async (args, client) => {
211
+ const id = z.string().uuid().parse(args.id);
212
+ const result = await client.listVersions(id);
213
+ return formatVersions(result, id);
214
+ },
215
+ },
216
+ {
217
+ name: 'publish_skill',
218
+ description: 'Publish a new skill to the SkillSlap marketplace. Requires SKILLSLAP_TOKEN for authentication.',
219
+ inputSchema: {
220
+ type: 'object',
221
+ properties: {
222
+ title: { type: 'string', description: 'Skill title (1-100 chars)' },
223
+ content: { type: 'string', description: 'Skill content in Markdown' },
224
+ description: { type: 'string', description: 'Short description (max 500 chars)' },
225
+ tags: {
226
+ type: 'array',
227
+ items: { type: 'string' },
228
+ description: 'Tags (max 10)',
229
+ },
230
+ invocation_type: {
231
+ type: 'string',
232
+ enum: ['agent', 'user', 'tool', 'context'],
233
+ description: 'How the skill is invoked (default: agent)',
234
+ },
235
+ status: {
236
+ type: 'string',
237
+ enum: ['draft', 'active'],
238
+ description: 'Initial status (default: draft)',
239
+ },
240
+ },
241
+ required: ['title', 'content'],
242
+ },
243
+ handler: async (args, client) => {
244
+ const data = {
245
+ title: z.string().min(1).max(100).parse(args.title),
246
+ content: z.string().min(1).parse(args.content),
247
+ description: args.description ? z.string().max(500).parse(args.description) : undefined,
248
+ tags: args.tags ? z.array(z.string()).max(10).parse(args.tags) : undefined,
249
+ invocation_type: args.invocation_type ? z.string().parse(args.invocation_type) : undefined,
250
+ status: args.status ? z.string().parse(args.status) : undefined,
251
+ };
252
+ return client.publishSkill(data);
253
+ },
254
+ },
255
+ {
256
+ name: 'update_skill',
257
+ description: 'Update an existing skill you own. Requires SKILLSLAP_TOKEN. Use change_summary to document what changed (shown in version history).',
258
+ inputSchema: {
259
+ type: 'object',
260
+ properties: {
261
+ id: { type: 'string', description: 'Skill UUID to update' },
262
+ title: { type: 'string', description: 'New title (1-100 chars)' },
263
+ content: { type: 'string', description: 'New skill content in Markdown' },
264
+ description: { type: 'string', description: 'New short description (max 500 chars)' },
265
+ tags: {
266
+ type: 'array',
267
+ items: { type: 'string' },
268
+ description: 'New tag list (max 10, replaces existing)',
269
+ },
270
+ status: {
271
+ type: 'string',
272
+ enum: ['draft', 'active', 'archived'],
273
+ description: 'New status',
274
+ },
275
+ version: { type: 'string', description: 'New version string (e.g. "1.1.0")' },
276
+ change_summary: { type: 'string', description: 'What changed in this update (max 500 chars, stored in version history)' },
277
+ },
278
+ required: ['id'],
279
+ },
280
+ handler: async (args, client) => {
281
+ const id = z.string().uuid().parse(args.id);
282
+ const data = {
283
+ title: args.title ? z.string().min(1).max(100).parse(args.title) : undefined,
284
+ content: args.content ? z.string().min(1).parse(args.content) : undefined,
285
+ description: args.description !== undefined ? z.string().max(500).nullable().parse(args.description) : undefined,
286
+ tags: args.tags ? z.array(z.string()).max(10).parse(args.tags) : undefined,
287
+ status: args.status ? z.string().parse(args.status) : undefined,
288
+ version: args.version ? z.string().max(50).parse(args.version) : undefined,
289
+ change_summary: args.change_summary ? z.string().max(500).parse(args.change_summary) : undefined,
290
+ };
291
+ // Strip keys that are undefined to avoid sending them
292
+ const payload = Object.fromEntries(Object.entries(data).filter(([, v]) => v !== undefined));
293
+ const result = await client.updateSkill(id, payload);
294
+ const lines = [
295
+ `✅ Updated: **${result.title}** v${result.version}`,
296
+ `**Status:** ${result.status} | **Tags:** ${(result.tags || []).map((t) => `\`${t}\``).join(' ') || 'none'}`,
297
+ `**ID:** \`${result.id}\``,
298
+ `**View:** https://skillslap.com/skill/${result.id}`,
299
+ ];
300
+ return lines.join('\n');
301
+ },
302
+ },
303
+ {
304
+ name: 'generate_skill',
305
+ description: 'Generate a complete skill from a natural language description using AI. Requires SKILLSLAP_TOKEN and a BYOK Anthropic API key configured on the account. Optionally auto-publish the generated skill.',
306
+ inputSchema: {
307
+ type: 'object',
308
+ properties: {
309
+ prompt: { type: 'string', description: 'Natural language description of the skill to generate (10-2000 chars)' },
310
+ auto_publish: {
311
+ type: 'boolean',
312
+ description: 'If true, automatically publish the generated skill (default: false — returns draft for review)',
313
+ },
314
+ },
315
+ required: ['prompt'],
316
+ },
317
+ handler: async (args, client) => {
318
+ const prompt = z.string().min(10).max(2000).parse(args.prompt);
319
+ const autoPublish = args.auto_publish ? z.boolean().parse(args.auto_publish) : false;
320
+ const generated = await client.generateSkill(prompt);
321
+ if (!autoPublish) {
322
+ return { draft: true, ...generated };
323
+ }
324
+ const published = await client.publishSkill({
325
+ title: generated.title,
326
+ content: generated.content,
327
+ description: generated.description,
328
+ tags: generated.tags,
329
+ invocation_type: generated.invocation_type,
330
+ status: 'active',
331
+ });
332
+ return { draft: false, ...generated, published };
333
+ },
334
+ },
335
+ {
336
+ name: 'compose_skills',
337
+ description: 'Compose multiple skills into a CLAUDE.md + agent_docs structure. Works without auth for public skills. Requires SKILLSLAP_TOKEN to include your own draft skills.',
338
+ inputSchema: {
339
+ type: 'object',
340
+ properties: {
341
+ skill_ids: {
342
+ type: 'array',
343
+ items: { type: 'string' },
344
+ description: 'Array of skill UUIDs to compose together',
345
+ },
346
+ project_name: {
347
+ type: 'string',
348
+ description: 'Optional project name for the composed output',
349
+ },
350
+ },
351
+ required: ['skill_ids'],
352
+ },
353
+ handler: async (args, client) => {
354
+ const skillIds = z.array(z.string().uuid()).min(1).parse(args.skill_ids);
355
+ const projectName = args.project_name ? z.string().parse(args.project_name) : undefined;
356
+ const result = await client.composeSkills(skillIds, projectName);
357
+ return formatComposeResult(result, skillIds);
358
+ },
359
+ },
360
+ ];
361
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "skillslap-mcp",
3
+ "version": "1.2.0",
4
+ "description": "SkillSlap MCP server for agent skill marketplace integration",
5
+ "type": "module",
6
+ "bin": {
7
+ "skillslap-mcp": "dist/index.js",
8
+ "skillslap": "dist/cli.js"
9
+ },
10
+ "main": "./dist/index.js",
11
+ "files": [
12
+ "dist",
13
+ "README.md",
14
+ "LICENSE"
15
+ ],
16
+ "scripts": {
17
+ "build": "tsc && chmod +x dist/index.js dist/cli.js",
18
+ "dev": "tsc --watch",
19
+ "start": "node dist/index.js",
20
+ "test": "vitest run",
21
+ "prepublishOnly": "npm run build"
22
+ },
23
+ "repository": {
24
+ "type": "git",
25
+ "url": "git+https://github.com/atapifire/skillslap.git",
26
+ "directory": "skillslap/mcp-server"
27
+ },
28
+ "homepage": "https://github.com/atapifire/skillslap/tree/main/skillslap/mcp-server#readme",
29
+ "bugs": {
30
+ "url": "https://github.com/atapifire/skillslap/issues"
31
+ },
32
+ "author": "atapifire",
33
+ "dependencies": {
34
+ "@modelcontextprotocol/sdk": "^1.0.0",
35
+ "zod": "^3.23.0"
36
+ },
37
+ "devDependencies": {
38
+ "typescript": "^5.7.0",
39
+ "vitest": "^4.0.18"
40
+ },
41
+ "engines": {
42
+ "node": ">=18.0.0"
43
+ },
44
+ "keywords": [
45
+ "mcp",
46
+ "skillslap",
47
+ "agent",
48
+ "skills",
49
+ "marketplace"
50
+ ],
51
+ "license": "MIT"
52
+ }