staff-mcp 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 (70) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +89 -0
  3. package/README_zh.md +89 -0
  4. package/dist/constants.d.ts +2 -0
  5. package/dist/constants.js +3 -0
  6. package/dist/constants.js.map +1 -0
  7. package/dist/index.d.ts +1 -0
  8. package/dist/index.js +26 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/security.d.ts +16 -0
  11. package/dist/security.js +43 -0
  12. package/dist/security.js.map +1 -0
  13. package/dist/server.d.ts +9 -0
  14. package/dist/server.js +25 -0
  15. package/dist/server.js.map +1 -0
  16. package/dist/src/constants.d.ts +2 -0
  17. package/dist/src/constants.js +3 -0
  18. package/dist/src/constants.js.map +1 -0
  19. package/dist/src/index.d.ts +2 -0
  20. package/dist/src/index.js +29 -0
  21. package/dist/src/index.js.map +1 -0
  22. package/dist/src/security.d.ts +21 -0
  23. package/dist/src/security.js +51 -0
  24. package/dist/src/security.js.map +1 -0
  25. package/dist/src/server.d.ts +10 -0
  26. package/dist/src/server.js +34 -0
  27. package/dist/src/server.js.map +1 -0
  28. package/dist/src/tools/file-tools.d.ts +6 -0
  29. package/dist/src/tools/file-tools.js +230 -0
  30. package/dist/src/tools/file-tools.js.map +1 -0
  31. package/dist/src/tools/lsp-tools.d.ts +10 -0
  32. package/dist/src/tools/lsp-tools.js +124 -0
  33. package/dist/src/tools/lsp-tools.js.map +1 -0
  34. package/dist/src/tools/shell-tools.d.ts +6 -0
  35. package/dist/src/tools/shell-tools.js +138 -0
  36. package/dist/src/tools/shell-tools.js.map +1 -0
  37. package/dist/src/tools/skill-manager.d.ts +14 -0
  38. package/dist/src/tools/skill-manager.js +97 -0
  39. package/dist/src/tools/skill-manager.js.map +1 -0
  40. package/dist/src/tools/skill-tools.d.ts +3 -0
  41. package/dist/src/tools/skill-tools.js +117 -0
  42. package/dist/src/tools/skill-tools.js.map +1 -0
  43. package/dist/src/tools/system-tools.d.ts +6 -0
  44. package/dist/src/tools/system-tools.js +36 -0
  45. package/dist/src/tools/system-tools.js.map +1 -0
  46. package/dist/src/transports/http.d.ts +5 -0
  47. package/dist/src/transports/http.js +58 -0
  48. package/dist/src/transports/http.js.map +1 -0
  49. package/dist/src/transports/stdio.d.ts +2 -0
  50. package/dist/src/transports/stdio.js +18 -0
  51. package/dist/src/transports/stdio.js.map +1 -0
  52. package/dist/tests/security.test.d.ts +1 -0
  53. package/dist/tests/security.test.js +21 -0
  54. package/dist/tests/security.test.js.map +1 -0
  55. package/dist/tools/file-tools.d.ts +6 -0
  56. package/dist/tools/file-tools.js +102 -0
  57. package/dist/tools/file-tools.js.map +1 -0
  58. package/dist/tools/lsp-tools.d.ts +6 -0
  59. package/dist/tools/lsp-tools.js +70 -0
  60. package/dist/tools/lsp-tools.js.map +1 -0
  61. package/dist/tools/shell-tools.d.ts +6 -0
  62. package/dist/tools/shell-tools.js +39 -0
  63. package/dist/tools/shell-tools.js.map +1 -0
  64. package/dist/transports/http.d.ts +5 -0
  65. package/dist/transports/http.js +58 -0
  66. package/dist/transports/http.js.map +1 -0
  67. package/dist/transports/stdio.d.ts +2 -0
  68. package/dist/transports/stdio.js +18 -0
  69. package/dist/transports/stdio.js.map +1 -0
  70. package/package.json +37 -0
@@ -0,0 +1,39 @@
1
+ import { exec } from "child_process";
2
+ import { promisify } from "util";
3
+ import { z } from "zod";
4
+ import { DEFAULT_TIMEOUT } from "../constants.js";
5
+ const execAsync = promisify(exec);
6
+ /**
7
+ * Registers shell-related tools using the latest registerTool API.
8
+ */
9
+ export function registerShellTools(server, security) {
10
+ server.registerTool("execute_command", {
11
+ description: "Execute a shell command in a specified directory (sandboxed).",
12
+ inputSchema: z.object({
13
+ command: z.string().describe("The shell command to execute."),
14
+ cwd: z.string().optional().describe("Directory to execute command from (must be allowed). Defaults to the workspace root."),
15
+ }).strict(),
16
+ }, async ({ command, cwd }) => {
17
+ try {
18
+ const validatedCwd = security.validateDirectory(cwd || ".");
19
+ const { stdout, stderr } = await execAsync(command, {
20
+ cwd: validatedCwd,
21
+ timeout: DEFAULT_TIMEOUT,
22
+ });
23
+ const output = [
24
+ stdout ? `STDOUT:\n${stdout}` : "",
25
+ stderr ? `STDERR:\n${stderr}` : "",
26
+ ].filter(Boolean).join("\n\n");
27
+ return {
28
+ content: [{ type: "text", text: output || "(No output from command)" }],
29
+ };
30
+ }
31
+ catch (error) {
32
+ return {
33
+ content: [{ type: "text", text: `Command execution failed: ${error.message}` }],
34
+ isError: true,
35
+ };
36
+ }
37
+ });
38
+ }
39
+ //# sourceMappingURL=shell-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell-tools.js","sourceRoot":"","sources":["../../src/tools/shell-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEjC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAiB,EAAE,QAAyB;IAC7E,MAAM,CAAC,YAAY,CACjB,iBAAiB,EACjB;QACE,WAAW,EAAE,+DAA+D;QAC5E,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;YAC7D,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sFAAsF,CAAC;SAC5H,CAAC,CAAC,MAAM,EAAE;KACZ,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE;QACzB,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,QAAQ,CAAC,iBAAiB,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;YAE5D,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE;gBAClD,GAAG,EAAE,YAAY;gBACjB,OAAO,EAAE,eAAe;aACzB,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG;gBACb,MAAM,CAAC,CAAC,CAAC,YAAY,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE;gBAClC,MAAM,CAAC,CAAC,CAAC,YAAY,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE;aACnC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAE/B,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,0BAA0B,EAAE,CAAC;aACxE,CAAC;QACJ,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,6BAA6B,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC/E,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ /**
3
+ * Starts an Express server that hosts the MCP server over Streamable HTTP.
4
+ */
5
+ export declare function startHttpServer(server: McpServer, port: number, host?: string): Promise<void>;
@@ -0,0 +1,58 @@
1
+ import express from "express";
2
+ import cors from "cors";
3
+ import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
4
+ import { randomUUID } from "node:crypto";
5
+ /**
6
+ * Starts an Express server that hosts the MCP server over Streamable HTTP.
7
+ */
8
+ export async function startHttpServer(server, port, host = "0.0.0.0") {
9
+ const app = express();
10
+ // Enable CORS for all origins, including the MCP Inspector
11
+ app.use(cors());
12
+ // Necessary for processing JSON-RPC messages (POST)
13
+ // We use express.json() but also need to be careful not to consume the stream if transport needs it.
14
+ // However, StreamableHTTPServerTransport.handleRequest accepts parsedBody.
15
+ app.use(express.json());
16
+ // Use a single transport instance for the lifetime of the HTTP server.
17
+ const transport = new StreamableHTTPServerTransport({
18
+ sessionIdGenerator: () => randomUUID(),
19
+ // VERY IMPORTANT: Enable JSON responses for POST requests.
20
+ // This allows the client to receive tool lists and call results directly in the POST response,
21
+ // which is what the Anthropic Inspector and many other clients expect.
22
+ enableJsonResponse: true,
23
+ });
24
+ // Connect the MCP server instance to this transport.
25
+ await server.connect(transport);
26
+ /**
27
+ * Unified handler for MCP requests.
28
+ * Handles GET (SSE) and POST (JSON-RPC).
29
+ */
30
+ const mcpHandler = async (req, res) => {
31
+ try {
32
+ // In Streamable HTTP, handleRequest handles the full lifecycle based on method.
33
+ await transport.handleRequest(req, res, req.body);
34
+ }
35
+ catch (error) {
36
+ console.error("[MCP HTTP Error]:", error);
37
+ if (!res.headersSent) {
38
+ res.status(500).json({
39
+ error: "Internal Server Error",
40
+ message: error instanceof Error ? error.message : String(error)
41
+ });
42
+ }
43
+ }
44
+ };
45
+ // Route for all MCP interactions.
46
+ app.all("/mcp", mcpHandler);
47
+ // Standard fallbacks
48
+ app.get("/sse", mcpHandler);
49
+ app.post("/messages", mcpHandler);
50
+ return new Promise((resolve) => {
51
+ app.listen(port, host, () => {
52
+ console.error(`[MCP HTTP] Server listening on http://${host}:${port}/mcp`);
53
+ console.error(`[MCP HTTP] JSON Response enabled: true`);
54
+ resolve();
55
+ });
56
+ });
57
+ }
58
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/transports/http.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACnG,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAAiB,EAAE,IAAY,EAAE,OAAe,SAAS;IAC7F,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;IAEtB,2DAA2D;IAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAEhB,oDAAoD;IACpD,qGAAqG;IACrG,2EAA2E;IAC3E,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAExB,uEAAuE;IACvE,MAAM,SAAS,GAAG,IAAI,6BAA6B,CAAC;QAClD,kBAAkB,EAAE,GAAG,EAAE,CAAC,UAAU,EAAE;QACtC,4DAA4D;QAC5D,+FAA+F;QAC/F,uEAAuE;QACvE,kBAAkB,EAAE,IAAI;KACzB,CAAC,CAAC;IAEH,qDAAqD;IACrD,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC;;;OAGG;IACH,MAAM,UAAU,GAAG,KAAK,EAAE,GAAoB,EAAE,GAAqB,EAAE,EAAE;QACvE,IAAI,CAAC;YACH,gFAAgF;YAChF,MAAM,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;YAC1C,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;gBACrB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,KAAK,EAAE,uBAAuB;oBAC9B,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;iBAChE,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IAEF,kCAAkC;IAClC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAE5B,qBAAqB;IACrB,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC5B,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IAElC,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QACnC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE;YAC1B,OAAO,CAAC,KAAK,CAAC,yCAAyC,IAAI,IAAI,IAAI,MAAM,CAAC,CAAC;YAC3E,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;YACxD,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function startStdioServer(server: McpServer): Promise<void>;
@@ -0,0 +1,18 @@
1
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
2
+ export async function startStdioServer(server) {
3
+ const transport = new StdioServerTransport();
4
+ // Redirect stdout to stderr so console.log doesn't break protocol
5
+ const originalLog = console.log;
6
+ console.log = (...args) => {
7
+ console.error(...args);
8
+ };
9
+ try {
10
+ await server.connect(transport);
11
+ console.error("MCP Server (Stdio) is running.");
12
+ }
13
+ catch (error) {
14
+ console.error("Stdio connection failed:", error);
15
+ process.exit(1);
16
+ }
17
+ }
18
+ //# sourceMappingURL=stdio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdio.js","sourceRoot":"","sources":["../../src/transports/stdio.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAiB;IACtD,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAE7C,kEAAkE;IAClE,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC;IAChC,OAAO,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE;QACxB,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;IACzB,CAAC,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAChC,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
package/package.json ADDED
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "staff-mcp",
3
+ "version": "1.0.0",
4
+ "type": "module",
5
+ "main": "dist/src/index.js",
6
+ "bin": {
7
+ "staff-mcp": "./dist/src/index.js"
8
+ },
9
+ "files": [
10
+ "dist",
11
+ "README.md",
12
+ "README_zh.md",
13
+ "LICENSE"
14
+ ],
15
+ "scripts": {
16
+ "build": "tsc",
17
+ "start": "node dist/src/index.js",
18
+ "dev": "tsx src/index.ts",
19
+ "test": "node --test dist/tests/**/*.test.js",
20
+ "prepublishOnly": "npm run build"
21
+ },
22
+ "dependencies": {
23
+ "@modelcontextprotocol/sdk": "^1.1.0",
24
+ "commander": "^12.1.0",
25
+ "cors": "^2.8.5",
26
+ "express": "^4.21.1",
27
+ "ts-morph": "^24.0.0",
28
+ "zod": "^3.23.8"
29
+ },
30
+ "devDependencies": {
31
+ "@types/cors": "^2.8.19",
32
+ "@types/express": "^5.0.0",
33
+ "@types/node": "^22.9.0",
34
+ "tsx": "^4.19.2",
35
+ "typescript": "^5.6.3"
36
+ }
37
+ }