engineering-matrix-explorer 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.
Files changed (3) hide show
  1. package/dist/index.js +161 -0
  2. package/matrix.json +106 -0
  3. package/package.json +29 -0
package/dist/index.js ADDED
@@ -0,0 +1,161 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ const index_js_1 = require("@modelcontextprotocol/sdk/server/index.js");
38
+ const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
39
+ const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
40
+ const fs = __importStar(require("fs"));
41
+ const path = __importStar(require("path"));
42
+ const matrixPath = path.join(__dirname, "..", "matrix.json");
43
+ const matrix = JSON.parse(fs.readFileSync(matrixPath, "utf-8"));
44
+ function scoreTool(tool, query) {
45
+ const q = query.toLowerCase().trim();
46
+ const terms = q.split(/\s+/);
47
+ const name = tool.name.toLowerCase();
48
+ const tags = tool.tags.map((t) => t.toLowerCase());
49
+ const category = tool.category.toLowerCase();
50
+ let score = 0;
51
+ const allText = [name, ...tags, category].join(" ");
52
+ if (allText.includes(q))
53
+ score += 15;
54
+ for (const term of terms) {
55
+ if (name === term)
56
+ score += 10;
57
+ else if (name.includes(term))
58
+ score += 5;
59
+ if (tags.includes(term))
60
+ score += 8;
61
+ else if (tags.some((t) => t.includes(term)))
62
+ score += 3;
63
+ if (category.includes(term))
64
+ score += 4;
65
+ }
66
+ return score;
67
+ }
68
+ const server = new index_js_1.Server({ name: "engineering-matrix-explorer", version: "1.0.0" }, { capabilities: { tools: {} } });
69
+ server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => ({
70
+ tools: [
71
+ {
72
+ name: "list_categories",
73
+ description: "List all engineering tool categories with tool counts",
74
+ inputSchema: { type: "object", properties: {} },
75
+ },
76
+ {
77
+ name: "search_engineering_matrix",
78
+ description: "Search for engineering tools by name, tag, or use case. Supports multi-word queries.",
79
+ inputSchema: {
80
+ type: "object",
81
+ properties: {
82
+ query: { type: "string", description: "Search query e.g. 'python linter', 'react', 'ci cd'" },
83
+ categoryFilter: { type: "string", description: "Optional category id to restrict search" },
84
+ limit: { type: "number", description: "Max results (default 10)" },
85
+ },
86
+ required: ["query"],
87
+ },
88
+ },
89
+ {
90
+ name: "get_repository_boilerplate",
91
+ description: "Get starter boilerplate files for a specific tool or framework",
92
+ inputSchema: {
93
+ type: "object",
94
+ properties: {
95
+ toolName: { type: "string", description: "Tool name e.g. 'TypeScript', 'FastAPI', 'Docker'" },
96
+ },
97
+ required: ["toolName"],
98
+ },
99
+ },
100
+ ],
101
+ }));
102
+ server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
103
+ const { name, arguments: args } = request.params;
104
+ if (name === "list_categories") {
105
+ const counts = {};
106
+ for (const tool of matrix.tools) {
107
+ counts[tool.category] = (counts[tool.category] || 0) + 1;
108
+ }
109
+ const result = matrix.categories.map((cat) => ({
110
+ id: cat.id,
111
+ name: cat.name,
112
+ quadrant: cat.quadrant,
113
+ toolCount: counts[cat.id] || 0,
114
+ }));
115
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
116
+ }
117
+ if (name === "search_engineering_matrix") {
118
+ const query = String(args.query || "");
119
+ const categoryFilter = args.categoryFilter;
120
+ const limit = Number(args.limit || 10);
121
+ if (!query.trim())
122
+ return { content: [{ type: "text", text: JSON.stringify([]) }] };
123
+ let tools = matrix.tools;
124
+ if (categoryFilter)
125
+ tools = tools.filter((t) => t.category === categoryFilter);
126
+ const scored = tools
127
+ .map((tool) => ({ tool, score: scoreTool(tool, query) }))
128
+ .filter((x) => x.score > 0)
129
+ .sort((a, b) => b.score - a.score)
130
+ .slice(0, limit)
131
+ .map(({ tool }) => ({
132
+ name: tool.name,
133
+ category: tool.category,
134
+ url: tool.url,
135
+ tags: tool.tags,
136
+ hasBoilerplate: tool.boilerplate !== null,
137
+ }));
138
+ return { content: [{ type: "text", text: JSON.stringify(scored, null, 2) }] };
139
+ }
140
+ if (name === "get_repository_boilerplate") {
141
+ const toolName = String(args.toolName || "").toLowerCase();
142
+ const tool = matrix.tools.find((t) => t.name.toLowerCase() === toolName);
143
+ if (!tool)
144
+ return { content: [{ type: "text", text: JSON.stringify({ error: `Tool '${toolName}' not found` }) }] };
145
+ if (!tool.boilerplate)
146
+ return { content: [{ type: "text", text: JSON.stringify({ error: `No boilerplate available for '${tool.name}'` }) }] };
147
+ const boilerplate = matrix.boilerplates[tool.boilerplate];
148
+ if (!boilerplate)
149
+ return { content: [{ type: "text", text: JSON.stringify({ error: "Boilerplate config missing" }) }] };
150
+ return { content: [{ type: "text", text: JSON.stringify({ tool: tool.name, files: boilerplate.files }, null, 2) }] };
151
+ }
152
+ return {
153
+ content: [{ type: "text", text: JSON.stringify({ error: `Unknown tool: ${name}` }) }],
154
+ isError: true,
155
+ };
156
+ });
157
+ async function main() {
158
+ const transport = new stdio_js_1.StdioServerTransport();
159
+ await server.connect(transport);
160
+ }
161
+ main().catch(console.error);
package/matrix.json ADDED
@@ -0,0 +1,106 @@
1
+ {
2
+ "categories": [
3
+ { "id": "languages", "name": "Languages & Runtimes", "quadrant": "languages" },
4
+ { "id": "frontend", "name": "Frontend Frameworks", "quadrant": "frontend" },
5
+ { "id": "backend", "name": "Backend Frameworks", "quadrant": "backend" },
6
+ { "id": "databases", "name": "Databases & Storage", "quadrant": "databases" },
7
+ { "id": "devops", "name": "DevOps & Infrastructure", "quadrant": "devops" },
8
+ { "id": "tooling", "name": "Tooling & DX", "quadrant": "tooling" }
9
+ ],
10
+ "tools": [
11
+ { "name": "TypeScript", "category": "languages", "url": "https://www.typescriptlang.org", "tags": ["language","javascript","typed","microsoft","frontend","backend"], "boilerplate": "typescript" },
12
+ { "name": "Python", "category": "languages", "url": "https://www.python.org", "tags": ["language","scripting","ml","ai","backend","data"], "boilerplate": "python" },
13
+ { "name": "Rust", "category": "languages", "url": "https://www.rust-lang.org", "tags": ["language","systems","performance","memory-safe","backend"], "boilerplate": "rust" },
14
+ { "name": "Go", "category": "languages", "url": "https://go.dev", "tags": ["language","backend","performance","concurrent","google"], "boilerplate": "go" },
15
+ { "name": "React", "category": "frontend", "url": "https://react.dev", "tags": ["frontend","ui","javascript","typescript","components","meta"], "boilerplate": "react" },
16
+ { "name": "Next.js", "category": "frontend", "url": "https://nextjs.org", "tags": ["frontend","fullstack","react","ssr","vercel","typescript"], "boilerplate": "nextjs" },
17
+ { "name": "Vue", "category": "frontend", "url": "https://vuejs.org", "tags": ["frontend","ui","javascript","typescript","components"], "boilerplate": null },
18
+ { "name": "Svelte", "category": "frontend", "url": "https://svelte.dev", "tags": ["frontend","ui","javascript","typescript","compiler","performance"],"boilerplate": null },
19
+ { "name": "Tailwind CSS", "category": "frontend", "url": "https://tailwindcss.com", "tags": ["frontend","css","styling","utility","design"], "boilerplate": null },
20
+ { "name": "Vite", "category": "frontend", "url": "https://vitejs.dev", "tags": ["frontend","bundler","build","fast","dev-server"], "boilerplate": null },
21
+ { "name": "Node.js", "category": "backend", "url": "https://nodejs.org", "tags": ["backend","javascript","runtime","server","npm"], "boilerplate": "node" },
22
+ { "name": "Fastify", "category": "backend", "url": "https://fastify.dev", "tags": ["backend","api","javascript","typescript","fast","node"], "boilerplate": null },
23
+ { "name": "Express", "category": "backend", "url": "https://expressjs.com", "tags": ["backend","api","javascript","node","server","middleware"], "boilerplate": null },
24
+ { "name": "FastAPI", "category": "backend", "url": "https://fastapi.tiangolo.com", "tags": ["backend","api","python","async","openapi","typed"], "boilerplate": "fastapi" },
25
+ { "name": "PostgreSQL", "category": "databases", "url": "https://www.postgresql.org", "tags": ["database","sql","relational","postgres","open-source"], "boilerplate": null },
26
+ { "name": "Redis", "category": "databases", "url": "https://redis.io", "tags": ["database","cache","key-value","in-memory","fast"], "boilerplate": null },
27
+ { "name": "MongoDB", "category": "databases", "url": "https://www.mongodb.com", "tags": ["database","nosql","document","json","flexible"], "boilerplate": null },
28
+ { "name": "Prisma", "category": "databases", "url": "https://www.prisma.io", "tags": ["database","orm","typescript","sql","migrations"], "boilerplate": null },
29
+ { "name": "Supabase", "category": "databases", "url": "https://supabase.com", "tags": ["database","postgres","realtime","auth","storage","backend-as-a-service"], "boilerplate": null },
30
+ { "name": "Docker", "category": "devops", "url": "https://www.docker.com", "tags": ["devops","containers","deployment","infrastructure","virtualization"], "boilerplate": "docker" },
31
+ { "name": "Kubernetes", "category": "devops", "url": "https://kubernetes.io", "tags": ["devops","containers","orchestration","deployment","k8s","infrastructure"], "boilerplate": null },
32
+ { "name": "GitHub Actions", "category": "devops", "url": "https://github.com/features/actions", "tags": ["devops","ci","cd","automation","github","pipeline"], "boilerplate": "github-actions" },
33
+ { "name": "Terraform", "category": "devops", "url": "https://www.terraform.io", "tags": ["devops","infrastructure","iac","cloud","automation"], "boilerplate": null },
34
+ { "name": "Vercel", "category": "devops", "url": "https://vercel.com", "tags": ["devops","deployment","hosting","frontend","serverless","cdn"], "boilerplate": null },
35
+ { "name": "ESLint", "category": "tooling", "url": "https://eslint.org", "tags": ["tooling","linter","javascript","typescript","code-quality","dx"],"boilerplate": null },
36
+ { "name": "Prettier", "category": "tooling", "url": "https://prettier.io", "tags": ["tooling","formatter","javascript","typescript","code-quality","dx"], "boilerplate": null },
37
+ { "name": "Ruff", "category": "tooling", "url": "https://docs.astral.sh/ruff", "tags": ["tooling","linter","formatter","python","fast","rust","code-quality","dx"], "boilerplate": null },
38
+ { "name": "Vitest", "category": "tooling", "url": "https://vitest.dev", "tags": ["tooling","testing","javascript","typescript","fast","vite"], "boilerplate": null },
39
+ { "name": "Jest", "category": "tooling", "url": "https://jestjs.io", "tags": ["tooling","testing","javascript","typescript","meta"], "boilerplate": null },
40
+ { "name": "pnpm", "category": "tooling", "url": "https://pnpm.io", "tags": ["tooling","package-manager","javascript","fast","monorepo","dx"], "boilerplate": null }
41
+ ],
42
+ "boilerplates": {
43
+ "typescript": {
44
+ "files": {
45
+ "tsconfig.json": "{\n \"compilerOptions\": {\n \"target\": \"ES2020\",\n \"module\": \"commonjs\",\n \"strict\": true,\n \"outDir\": \"./dist\",\n \"rootDir\": \"./src\",\n \"esModuleInterop\": true\n }\n}",
46
+ "src/index.ts": "const main = (): void => {\n console.log('Hello, TypeScript!');\n};\nmain();",
47
+ "package.json": "{\n \"name\": \"my-ts-app\",\n \"version\": \"1.0.0\",\n \"scripts\": { \"build\": \"tsc\", \"dev\": \"tsx src/index.ts\" }\n}"
48
+ }
49
+ },
50
+ "python": {
51
+ "files": {
52
+ "main.py": "def main() -> None:\n print('Hello, Python!')\n\nif __name__ == '__main__':\n main()",
53
+ "requirements.txt": "# Add dependencies here",
54
+ "pyproject.toml": "[project]\nname = \"my-app\"\nversion = \"0.1.0\"\nrequires-python = \">=3.11\""
55
+ }
56
+ },
57
+ "nextjs": {
58
+ "files": {
59
+ "README.md": "# Next.js App\n\n```bash\nnpx create-next-app@latest my-app --typescript --tailwind\n```",
60
+ "app/page.tsx": "export default function Home() {\n return <main><h1>Hello Next.js</h1></main>;\n}"
61
+ }
62
+ },
63
+ "react": {
64
+ "files": {
65
+ "README.md": "# React App\n\n```bash\nnpm create vite@latest my-app -- --template react-ts\n```",
66
+ "src/App.tsx": "function App() {\n return <h1>Hello React</h1>;\n}\nexport default App;"
67
+ }
68
+ },
69
+ "fastapi": {
70
+ "files": {
71
+ "main.py": "from fastapi import FastAPI\napp = FastAPI()\n\n@app.get('/')\ndef root():\n return {'Hello': 'World'}",
72
+ "requirements.txt": "fastapi>=0.100.0\nuvicorn[standard]>=0.23.0"
73
+ }
74
+ },
75
+ "docker": {
76
+ "files": {
77
+ "Dockerfile": "FROM node:20-alpine\nWORKDIR /app\nCOPY package*.json ./\nRUN npm ci --only=production\nCOPY . .\nEXPOSE 3000\nCMD [\"node\", \"dist/index.js\"]",
78
+ ".dockerignore": "node_modules\ndist\n.env",
79
+ "docker-compose.yml": "version: '3.8'\nservices:\n app:\n build: .\n ports:\n - '3000:3000'"
80
+ }
81
+ },
82
+ "github-actions": {
83
+ "files": {
84
+ ".github/workflows/ci.yml": "name: CI\non:\n push:\n branches: [main]\njobs:\n test:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v4\n - uses: actions/setup-node@v4\n with:\n node-version: '20'\n - run: npm ci\n - run: npm test"
85
+ }
86
+ },
87
+ "node": {
88
+ "files": {
89
+ "index.js": "const http = require('http');\nconst server = http.createServer((req, res) => {\n res.writeHead(200, {'Content-Type': 'application/json'});\n res.end(JSON.stringify({hello: 'world'}));\n});\nserver.listen(3000, () => console.log('Running on 3000'));",
90
+ "package.json": "{\n \"name\": \"my-node-app\",\n \"version\": \"1.0.0\",\n \"scripts\": { \"start\": \"node index.js\" }\n}"
91
+ }
92
+ },
93
+ "rust": {
94
+ "files": {
95
+ "src/main.rs": "fn main() {\n println!(\"Hello, Rust!\");\n}",
96
+ "Cargo.toml": "[package]\nname = \"my-app\"\nversion = \"0.1.0\"\nedition = \"2021\""
97
+ }
98
+ },
99
+ "go": {
100
+ "files": {
101
+ "main.go": "package main\n\nimport \"fmt\"\n\nfunc main() {\n\tfmt.Println(\"Hello, Go!\")\n}",
102
+ "go.mod": "module my-go-app\n\ngo 1.21"
103
+ }
104
+ }
105
+ }
106
+ }
package/package.json ADDED
@@ -0,0 +1,29 @@
1
+ {
2
+ "name": "engineering-matrix-explorer",
3
+ "version": "1.0.0",
4
+ "description": "MCP server for exploring the engineering tools matrix — search, categorize, and get boilerplate for 100+ dev tools",
5
+ "main": "dist/index.js",
6
+ "bin": {
7
+ "engineering-matrix-explorer": "dist/index.js"
8
+ },
9
+ "scripts": {
10
+ "build": "tsc",
11
+ "start": "node dist/index.js",
12
+ "dev": "tsx src/index.ts",
13
+ "test": "node tests/run.js"
14
+ },
15
+ "keywords": ["mcp", "engineering", "tools", "matrix", "claude", "ai"],
16
+ "author": "eliaschouchani",
17
+ "license": "MIT",
18
+ "type": "commonjs",
19
+ "files": ["dist", "matrix.json"],
20
+ "dependencies": {
21
+ "@modelcontextprotocol/sdk": "^1.0.0",
22
+ "zod": "^3.22.0"
23
+ },
24
+ "devDependencies": {
25
+ "@types/node": "^20.0.0",
26
+ "tsx": "^4.0.0",
27
+ "typescript": "^5.0.0"
28
+ }
29
+ }