@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 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.
@@ -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"}
@@ -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,10 @@
1
+ export interface SkillFile {
2
+ relativePath: string;
3
+ content: string;
4
+ }
5
+ export interface EmbeddedSkill {
6
+ name: string;
7
+ files: SkillFile[];
8
+ }
9
+ export declare const EMBEDDED_SKILLS: EmbeddedSkill[];
10
+ //# sourceMappingURL=embedded.d.ts.map
@@ -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"}