@rishildi/ldi-process-skills 0.1.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 +133 -0
- package/build/index.d.ts +13 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +24 -0
- package/build/server.d.ts +12 -0
- package/build/server.d.ts.map +1 -0
- package/build/server.js +183 -0
- package/build/skills/embedded.d.ts +10 -0
- package/build/skills/embedded.d.ts.map +1 -0
- package/build/skills/embedded.js +220 -0
- package/build/skills/registry.d.ts +35 -0
- package/build/skills/registry.d.ts.map +1 -0
- package/build/skills/registry.js +90 -0
- package/package.json +48 -0
package/README.md
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# LDI Process Skills MCP Server
|
|
2
|
+
|
|
3
|
+
Brings curated, step-by-step process skills to your AI agents through a local MCP server.
|
|
4
|
+
|
|
5
|
+
Built by [Learn Data Insights](https://learndatainsights.com).
|
|
6
|
+
|
|
7
|
+
## What it does
|
|
8
|
+
|
|
9
|
+
This MCP server exposes a set of curated process skills as tools that your AI agent
|
|
10
|
+
can call. The agent receives step-by-step instructions for data platform tasks —
|
|
11
|
+
then executes them interactively with you.
|
|
12
|
+
|
|
13
|
+
## Quick start
|
|
14
|
+
|
|
15
|
+
### VS Code (with GitHub Copilot or Claude extension)
|
|
16
|
+
|
|
17
|
+
Add to your MCP settings (`.vscode/mcp.json` or user settings):
|
|
18
|
+
|
|
19
|
+
```json
|
|
20
|
+
{
|
|
21
|
+
"servers": {
|
|
22
|
+
"ldi-process-skills": {
|
|
23
|
+
"type": "stdio",
|
|
24
|
+
"command": "npx",
|
|
25
|
+
"args": ["-y", "@rishildi/ldi-process-skills"]
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### Claude Desktop
|
|
32
|
+
|
|
33
|
+
Add to `claude_desktop_config.json`:
|
|
34
|
+
|
|
35
|
+
```json
|
|
36
|
+
{
|
|
37
|
+
"mcpServers": {
|
|
38
|
+
"ldi-process-skills": {
|
|
39
|
+
"command": "npx",
|
|
40
|
+
"args": ["-y", "@rishildi/ldi-process-skills"]
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### Verify
|
|
47
|
+
|
|
48
|
+
Once connected, ask your AI agent:
|
|
49
|
+
|
|
50
|
+
> "What skills are available?"
|
|
51
|
+
|
|
52
|
+
It will call `list_skills` and show you the catalogue.
|
|
53
|
+
|
|
54
|
+
## Prerequisites
|
|
55
|
+
|
|
56
|
+
- **Node.js 18+** (for running the MCP server)
|
|
57
|
+
- Additional prerequisites depend on the specific skills (e.g. Fabric CLI for Fabric skills)
|
|
58
|
+
|
|
59
|
+
## Available tools
|
|
60
|
+
|
|
61
|
+
| Tool | Description |
|
|
62
|
+
|------|-------------|
|
|
63
|
+
| `list_skills` | Lists all available skills with descriptions |
|
|
64
|
+
| `<skill_name>` | Loads a specific skill's instructions (one tool per skill) |
|
|
65
|
+
| `get_skill_file` | Fetch a specific template or reference from a skill |
|
|
66
|
+
| `list_skill_files` | List all files available in a skill package |
|
|
67
|
+
|
|
68
|
+
*(Tools are auto-generated from embedded skills. Each skill you add becomes a tool automatically.)*
|
|
69
|
+
|
|
70
|
+
## How it works
|
|
71
|
+
|
|
72
|
+
1. You ask your AI agent to perform a task
|
|
73
|
+
2. The agent calls the appropriate skill tool on this MCP server
|
|
74
|
+
3. The server returns detailed step-by-step instructions to the agent
|
|
75
|
+
4. The agent follows the instructions, interacting with you along the way
|
|
76
|
+
5. You see all the outputs — the skill instructions themselves stay inside the server
|
|
77
|
+
|
|
78
|
+
## Licence
|
|
79
|
+
|
|
80
|
+
This software is proprietary to Learn Data Insights Ltd.
|
|
81
|
+
Unauthorised redistribution is not permitted.
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## Development guide (maintainers only)
|
|
86
|
+
|
|
87
|
+
### Adding a new skill
|
|
88
|
+
|
|
89
|
+
1. Create a directory under `src/skills/<skill-name>/` with a `SKILL.md` and
|
|
90
|
+
optional `assets/` and `references/` subdirectories
|
|
91
|
+
2. Run `npm run embed` to regenerate the embedded skills module
|
|
92
|
+
3. Run `npm run build` to compile
|
|
93
|
+
4. Test with `npm run inspect`
|
|
94
|
+
|
|
95
|
+
### Build pipeline
|
|
96
|
+
|
|
97
|
+
```
|
|
98
|
+
src/skills/<skill-name>/ ──┐
|
|
99
|
+
SKILL.md │ embed-skills.ts
|
|
100
|
+
assets/ ├──────────────────> src/skills/embedded.ts
|
|
101
|
+
references/ │
|
|
102
|
+
src/skills/<other-skill>/ ──┘
|
|
103
|
+
│
|
|
104
|
+
▼ tsc
|
|
105
|
+
build/index.js
|
|
106
|
+
│
|
|
107
|
+
▼ npm publish
|
|
108
|
+
npm package (JS only)
|
|
109
|
+
|
|
110
|
+
OR
|
|
111
|
+
|
|
112
|
+
▼ bun build --compile
|
|
113
|
+
dist/ldi-process-skills (binary)
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Scripts
|
|
117
|
+
|
|
118
|
+
| Command | Description |
|
|
119
|
+
|---------|-------------|
|
|
120
|
+
| `npm run embed` | Regenerate embedded.ts from skill files |
|
|
121
|
+
| `npm run build` | Embed + compile TypeScript |
|
|
122
|
+
| `npm run build:compile` | Embed + compile to native binary (requires Bun) |
|
|
123
|
+
| `npm run inspect` | Open MCP Inspector for testing |
|
|
124
|
+
| `npm run start` | Run the server directly |
|
|
125
|
+
|
|
126
|
+
### Testing with MCP Inspector
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
npm run build
|
|
130
|
+
npm run inspect
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
This opens a web UI where you can call tools and verify responses.
|
package/build/index.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* LDI Process Skills MCP Server — Entry Point
|
|
4
|
+
*
|
|
5
|
+
* Starts the MCP server over stdio transport.
|
|
6
|
+
* This is the binary that learners run via npx.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* npx @rishildi/ldi-process-skills
|
|
10
|
+
* node build/index.js
|
|
11
|
+
*/
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG"}
|
package/build/index.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* LDI Process Skills MCP Server — Entry Point
|
|
4
|
+
*
|
|
5
|
+
* Starts the MCP server over stdio transport.
|
|
6
|
+
* This is the binary that learners run via npx.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* npx @rishildi/ldi-process-skills
|
|
10
|
+
* node build/index.js
|
|
11
|
+
*/
|
|
12
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
13
|
+
import { createServer } from "./server.js";
|
|
14
|
+
async function main() {
|
|
15
|
+
const server = createServer();
|
|
16
|
+
const transport = new StdioServerTransport();
|
|
17
|
+
await server.connect(transport);
|
|
18
|
+
// Log to stderr (stdout is reserved for MCP JSON-RPC messages)
|
|
19
|
+
console.error("LDI Process Skills MCP Server running on stdio");
|
|
20
|
+
}
|
|
21
|
+
main().catch((err) => {
|
|
22
|
+
console.error("Fatal error:", err);
|
|
23
|
+
process.exit(1);
|
|
24
|
+
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LDI Process Skills MCP Server
|
|
3
|
+
*
|
|
4
|
+
* Exposes each embedded skill as:
|
|
5
|
+
* - A TOOL that returns the full SKILL.md instructions for the LLM to follow
|
|
6
|
+
* - A TOOL to fetch specific asset/reference files from a skill
|
|
7
|
+
* - A PROMPT for each skill as a quick-start entry point
|
|
8
|
+
* - A RESOURCE listing all available skills
|
|
9
|
+
*/
|
|
10
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
11
|
+
export declare function createServer(): McpServer;
|
|
12
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIpE,wBAAgB,YAAY,IAAI,SAAS,CA0NxC"}
|
package/build/server.js
ADDED
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LDI Process Skills MCP Server
|
|
3
|
+
*
|
|
4
|
+
* Exposes each embedded skill as:
|
|
5
|
+
* - A TOOL that returns the full SKILL.md instructions for the LLM to follow
|
|
6
|
+
* - A TOOL to fetch specific asset/reference files from a skill
|
|
7
|
+
* - A PROMPT for each skill as a quick-start entry point
|
|
8
|
+
* - A RESOURCE listing all available skills
|
|
9
|
+
*/
|
|
10
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
11
|
+
import { z } from "zod";
|
|
12
|
+
import { registry } from "./skills/registry.js";
|
|
13
|
+
export function createServer() {
|
|
14
|
+
const server = new McpServer({
|
|
15
|
+
name: "ldi-process-skills",
|
|
16
|
+
version: "0.1.0",
|
|
17
|
+
});
|
|
18
|
+
// ──────────────────────────────────────────────────────────────────
|
|
19
|
+
// TOOL: list_skills
|
|
20
|
+
// Returns a catalogue of all available skills
|
|
21
|
+
// ──────────────────────────────────────────────────────────────────
|
|
22
|
+
server.registerTool("list_skills", {
|
|
23
|
+
title: "List available skills",
|
|
24
|
+
description: "Returns a list of all available LDI process skills with their names and descriptions. " +
|
|
25
|
+
"Call this first to discover what skills are available.",
|
|
26
|
+
inputSchema: {},
|
|
27
|
+
annotations: { readOnlyHint: true },
|
|
28
|
+
}, async () => {
|
|
29
|
+
const skills = registry.getAll();
|
|
30
|
+
const catalogue = skills.map((s) => ({
|
|
31
|
+
tool_name: s.name.replace(/-/g, "_"),
|
|
32
|
+
title: s.title,
|
|
33
|
+
description: s.description,
|
|
34
|
+
}));
|
|
35
|
+
return {
|
|
36
|
+
content: [
|
|
37
|
+
{
|
|
38
|
+
type: "text",
|
|
39
|
+
text: JSON.stringify(catalogue, null, 2),
|
|
40
|
+
},
|
|
41
|
+
],
|
|
42
|
+
};
|
|
43
|
+
});
|
|
44
|
+
// ──────────────────────────────────────────────────────────────────
|
|
45
|
+
// TOOL: Per-skill tools (one per embedded skill)
|
|
46
|
+
// Each returns the full SKILL.md for the LLM to follow
|
|
47
|
+
// ──────────────────────────────────────────────────────────────────
|
|
48
|
+
for (const skill of registry.getAll()) {
|
|
49
|
+
const toolName = skill.name.replace(/-/g, "_");
|
|
50
|
+
server.registerTool(toolName, {
|
|
51
|
+
title: skill.title,
|
|
52
|
+
description: skill.description,
|
|
53
|
+
inputSchema: {
|
|
54
|
+
include_assets: z
|
|
55
|
+
.boolean()
|
|
56
|
+
.optional()
|
|
57
|
+
.default(false)
|
|
58
|
+
.describe("If true, also returns the contents of all asset and reference files."),
|
|
59
|
+
},
|
|
60
|
+
annotations: { readOnlyHint: true },
|
|
61
|
+
}, async ({ include_assets }) => {
|
|
62
|
+
const content = [
|
|
63
|
+
{
|
|
64
|
+
type: "text",
|
|
65
|
+
text: skill.skillMd,
|
|
66
|
+
},
|
|
67
|
+
];
|
|
68
|
+
if (include_assets) {
|
|
69
|
+
// Include assets and references
|
|
70
|
+
const extras = skill.files.filter((f) => f.relativePath !== "SKILL.md" &&
|
|
71
|
+
(f.relativePath.startsWith("assets/") ||
|
|
72
|
+
f.relativePath.startsWith("references/")));
|
|
73
|
+
for (const file of extras) {
|
|
74
|
+
content.push({
|
|
75
|
+
type: "text",
|
|
76
|
+
text: `\n--- FILE: ${file.relativePath} ---\n${file.content}`,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return { content };
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
// ──────────────────────────────────────────────────────────────────
|
|
84
|
+
// TOOL: get_skill_file
|
|
85
|
+
// Fetches a specific file from a skill (asset, reference, template)
|
|
86
|
+
// ──────────────────────────────────────────────────────────────────
|
|
87
|
+
server.registerTool("get_skill_file", {
|
|
88
|
+
title: "Get a file from a skill package",
|
|
89
|
+
description: "Returns the content of a specific file from a skill package. " +
|
|
90
|
+
"Use this to fetch templates, reference docs, or asset files " +
|
|
91
|
+
"referenced in the SKILL.md instructions.",
|
|
92
|
+
inputSchema: {
|
|
93
|
+
skill_name: z
|
|
94
|
+
.string()
|
|
95
|
+
.describe('The skill tool name (e.g. "create_fabric_lakehouse")'),
|
|
96
|
+
file_path: z
|
|
97
|
+
.string()
|
|
98
|
+
.describe('Relative path within the skill (e.g. "assets/notebook-template.py")'),
|
|
99
|
+
},
|
|
100
|
+
annotations: { readOnlyHint: true },
|
|
101
|
+
}, async ({ skill_name, file_path }) => {
|
|
102
|
+
const content = registry.getFile(skill_name, file_path);
|
|
103
|
+
if (!content) {
|
|
104
|
+
return {
|
|
105
|
+
content: [
|
|
106
|
+
{
|
|
107
|
+
type: "text",
|
|
108
|
+
text: `File not found: ${file_path} in skill ${skill_name}`,
|
|
109
|
+
},
|
|
110
|
+
],
|
|
111
|
+
isError: true,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
return {
|
|
115
|
+
content: [
|
|
116
|
+
{
|
|
117
|
+
type: "text",
|
|
118
|
+
text: content,
|
|
119
|
+
},
|
|
120
|
+
],
|
|
121
|
+
};
|
|
122
|
+
});
|
|
123
|
+
// ──────────────────────────────────────────────────────────────────
|
|
124
|
+
// TOOL: list_skill_files
|
|
125
|
+
// Lists all files available in a given skill package
|
|
126
|
+
// ──────────────────────────────────────────────────────────────────
|
|
127
|
+
server.registerTool("list_skill_files", {
|
|
128
|
+
title: "List files in a skill package",
|
|
129
|
+
description: "Returns a list of all files (assets, references, templates) " +
|
|
130
|
+
"available in a specific skill package.",
|
|
131
|
+
inputSchema: {
|
|
132
|
+
skill_name: z
|
|
133
|
+
.string()
|
|
134
|
+
.describe('The skill tool name (e.g. "create_fabric_lakehouse")'),
|
|
135
|
+
},
|
|
136
|
+
annotations: { readOnlyHint: true },
|
|
137
|
+
}, async ({ skill_name }) => {
|
|
138
|
+
const skill = registry.get(skill_name);
|
|
139
|
+
if (!skill) {
|
|
140
|
+
return {
|
|
141
|
+
content: [
|
|
142
|
+
{
|
|
143
|
+
type: "text",
|
|
144
|
+
text: `Skill not found: ${skill_name}`,
|
|
145
|
+
},
|
|
146
|
+
],
|
|
147
|
+
isError: true,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
const fileList = skill.files.map((f) => f.relativePath);
|
|
151
|
+
return {
|
|
152
|
+
content: [
|
|
153
|
+
{
|
|
154
|
+
type: "text",
|
|
155
|
+
text: JSON.stringify(fileList, null, 2),
|
|
156
|
+
},
|
|
157
|
+
],
|
|
158
|
+
};
|
|
159
|
+
});
|
|
160
|
+
// ──────────────────────────────────────────────────────────────────
|
|
161
|
+
// PROMPTS: One per skill as a quick-start entry point
|
|
162
|
+
// ──────────────────────────────────────────────────────────────────
|
|
163
|
+
for (const skill of registry.getAll()) {
|
|
164
|
+
const promptName = skill.name; // keep hyphens for prompt names
|
|
165
|
+
server.registerPrompt(promptName, {
|
|
166
|
+
title: skill.title,
|
|
167
|
+
description: `Quick-start prompt for the ${skill.title} skill`,
|
|
168
|
+
}, () => ({
|
|
169
|
+
messages: [
|
|
170
|
+
{
|
|
171
|
+
role: "user",
|
|
172
|
+
content: {
|
|
173
|
+
type: "text",
|
|
174
|
+
text: `I want to use the "${skill.title}" skill. ` +
|
|
175
|
+
`Please call the ${skill.name.replace(/-/g, "_")} tool to load the skill instructions, ` +
|
|
176
|
+
`then follow them step by step to help me.`,
|
|
177
|
+
},
|
|
178
|
+
},
|
|
179
|
+
],
|
|
180
|
+
}));
|
|
181
|
+
}
|
|
182
|
+
return server;
|
|
183
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedded.d.ts","sourceRoot":"","sources":["../../src/skills/embedded.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,SAAS;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB;AAED,eAAO,MAAM,eAAe,EAAE,aAAa,EAyN1C,CAAC"}
|