@firfi/huly-mcp 0.7.0 → 0.9.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 (37) hide show
  1. package/README.md +17 -5
  2. package/dist/index.cjs +25992 -25310
  3. package/package.json +31 -19
  4. package/dist/index.js +0 -116694
  5. package/dist/src/config/config.d.ts +0 -94
  6. package/dist/src/config/config.d.ts.map +0 -1
  7. package/dist/src/config/config.js +0 -247
  8. package/dist/src/config/config.js.map +0 -1
  9. package/dist/src/domain/schemas.d.ts +0 -256
  10. package/dist/src/domain/schemas.d.ts.map +0 -1
  11. package/dist/src/domain/schemas.js +0 -275
  12. package/dist/src/domain/schemas.js.map +0 -1
  13. package/dist/src/huly/client.d.ts +0 -63
  14. package/dist/src/huly/client.d.ts.map +0 -1
  15. package/dist/src/huly/client.js +0 -149
  16. package/dist/src/huly/client.js.map +0 -1
  17. package/dist/src/huly/errors.d.ts +0 -133
  18. package/dist/src/huly/errors.d.ts.map +0 -1
  19. package/dist/src/huly/errors.js +0 -108
  20. package/dist/src/huly/errors.js.map +0 -1
  21. package/dist/src/huly/operations/issues.d.ts +0 -122
  22. package/dist/src/huly/operations/issues.d.ts.map +0 -1
  23. package/dist/src/huly/operations/issues.js +0 -627
  24. package/dist/src/huly/operations/issues.js.map +0 -1
  25. package/dist/src/index.d.ts +0 -43
  26. package/dist/src/index.d.ts.map +0 -1
  27. package/dist/src/index.js +0 -154
  28. package/dist/src/index.js.map +0 -1
  29. package/dist/src/mcp/error-mapping.d.ts +0 -67
  30. package/dist/src/mcp/error-mapping.d.ts.map +0 -1
  31. package/dist/src/mcp/error-mapping.js +0 -195
  32. package/dist/src/mcp/error-mapping.js.map +0 -1
  33. package/dist/src/mcp/server.d.ts +0 -86
  34. package/dist/src/mcp/server.d.ts.map +0 -1
  35. package/dist/src/mcp/server.js +0 -216
  36. package/dist/src/mcp/server.js.map +0 -1
  37. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -1,216 +0,0 @@
1
- /**
2
- * MCP Server infrastructure for Huly MCP server.
3
- *
4
- * Provides:
5
- * - McpServer service wrapping @modelcontextprotocol/sdk
6
- * - Tool registration with JSON Schema from Effect schemas
7
- * - Transport selection (stdio/HTTP)
8
- * - Graceful shutdown handling
9
- *
10
- * @module
11
- */
12
- import { Server } from "@modelcontextprotocol/sdk/server/index.js";
13
- import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
14
- import { ListToolsRequestSchema, CallToolRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
15
- import { Context, Effect, Layer, Schema, Exit, ParseResult } from "effect";
16
- import { HulyClient } from "../huly/client.js";
17
- import { listIssues, getIssue, createIssue, updateIssue, addLabel, } from "../huly/operations/issues.js";
18
- import { listIssuesParamsJsonSchema, getIssueParamsJsonSchema, createIssueParamsJsonSchema, updateIssueParamsJsonSchema, addLabelParamsJsonSchema, parseListIssuesParams, parseGetIssueParams, parseCreateIssueParams, parseUpdateIssueParams, parseAddLabelParams, } from "../domain/schemas.js";
19
- import { mapCauseToMcp, createSuccessResponse, createUnknownToolError, toMcpResponse, } from "./error-mapping.js";
20
- /**
21
- * MCP server error.
22
- */
23
- export class McpServerError extends Schema.TaggedError()("McpServerError", {
24
- message: Schema.String,
25
- cause: Schema.optional(Schema.Defect),
26
- }) {
27
- }
28
- // --- Tool Definitions ---
29
- /**
30
- * Tool definitions for MCP.
31
- * Maps tool names to their descriptions and JSON schemas.
32
- */
33
- export const TOOL_DEFINITIONS = {
34
- list_issues: {
35
- name: "list_issues",
36
- description: "Query Huly issues with optional filters. Returns issues sorted by modification date (newest first). Supports filtering by project, status, assignee, and milestone.",
37
- inputSchema: listIssuesParamsJsonSchema,
38
- },
39
- get_issue: {
40
- name: "get_issue",
41
- description: "Retrieve full details for a Huly issue including markdown description. Use this to view issue content, comments, or full metadata.",
42
- inputSchema: getIssueParamsJsonSchema,
43
- },
44
- create_issue: {
45
- name: "create_issue",
46
- description: "Create a new issue in a Huly project. Description supports markdown formatting. Returns the created issue identifier.",
47
- inputSchema: createIssueParamsJsonSchema,
48
- },
49
- update_issue: {
50
- name: "update_issue",
51
- description: "Update fields on an existing Huly issue. Only provided fields are modified. Description updates support markdown.",
52
- inputSchema: updateIssueParamsJsonSchema,
53
- },
54
- add_issue_label: {
55
- name: "add_issue_label",
56
- description: "Add a tag/label to a Huly issue. Creates the tag if it doesn't exist in the project.",
57
- inputSchema: addLabelParamsJsonSchema,
58
- },
59
- };
60
- /**
61
- * MCP Server service tag.
62
- */
63
- export class McpServerService extends Context.Tag("@hulymcp/McpServer")() {
64
- /**
65
- * Create the MCP server layer.
66
- * Requires HulyClient to be available.
67
- */
68
- static layer(config) {
69
- return Layer.effect(McpServerService, Effect.gen(function* () {
70
- const hulyClient = yield* HulyClient;
71
- // Create the MCP server instance using low-level Server API
72
- const server = new Server({
73
- name: "huly-mcp",
74
- version: "1.0.0",
75
- }, {
76
- capabilities: {
77
- tools: {},
78
- },
79
- });
80
- // Register tool list handler
81
- server.setRequestHandler(ListToolsRequestSchema, async () => ({
82
- tools: Object.values(TOOL_DEFINITIONS).map((tool) => ({
83
- name: tool.name,
84
- description: tool.description,
85
- inputSchema: tool.inputSchema,
86
- })),
87
- }));
88
- // Register tool call handler
89
- server.setRequestHandler(CallToolRequestSchema, async (request) => {
90
- const { name, arguments: args } = request.params;
91
- const result = await handleToolCall(name, args ?? {}, hulyClient);
92
- // Convert internal response to MCP SDK format
93
- return toMcpResponse(result);
94
- });
95
- // Track server state
96
- let isRunning = false;
97
- const operations = {
98
- run: () => Effect.gen(function* () {
99
- if (isRunning) {
100
- return yield* new McpServerError({
101
- message: "MCP server is already running",
102
- });
103
- }
104
- isRunning = true;
105
- // Create and connect transport based on config
106
- if (config.transport === "stdio") {
107
- const transport = new StdioServerTransport();
108
- yield* Effect.tryPromise({
109
- try: () => server.connect(transport),
110
- catch: (e) => new McpServerError({
111
- message: `Failed to connect stdio transport: ${String(e)}`,
112
- cause: e,
113
- }),
114
- });
115
- // Keep running until stopped
116
- yield* Effect.async((resume) => {
117
- // Set up signal handlers for graceful shutdown
118
- const cleanup = () => {
119
- isRunning = false;
120
- resume(Effect.void);
121
- };
122
- process.on("SIGINT", cleanup);
123
- process.on("SIGTERM", cleanup);
124
- // Return cleanup function for when Effect is interrupted
125
- return Effect.sync(() => {
126
- process.off("SIGINT", cleanup);
127
- process.off("SIGTERM", cleanup);
128
- });
129
- });
130
- // Close server on shutdown
131
- yield* Effect.tryPromise({
132
- try: () => server.close(),
133
- catch: (e) => new McpServerError({
134
- message: `Failed to close server: ${String(e)}`,
135
- cause: e,
136
- }),
137
- });
138
- }
139
- else if (config.transport === "http") {
140
- // HTTP transport - for future implementation
141
- // The MCP SDK provides SSE and StreamableHttp transports
142
- return yield* new McpServerError({
143
- message: "HTTP transport not yet implemented",
144
- });
145
- }
146
- }),
147
- stop: () => Effect.gen(function* () {
148
- if (!isRunning) {
149
- return;
150
- }
151
- isRunning = false;
152
- yield* Effect.tryPromise({
153
- try: () => server.close(),
154
- catch: (e) => new McpServerError({
155
- message: `Failed to stop server: ${String(e)}`,
156
- cause: e,
157
- }),
158
- });
159
- }),
160
- };
161
- return operations;
162
- }));
163
- }
164
- /**
165
- * Create a test layer for unit testing.
166
- */
167
- static testLayer(mockOperations) {
168
- const defaultOps = {
169
- run: () => Effect.void,
170
- stop: () => Effect.void,
171
- };
172
- return Layer.succeed(McpServerService, { ...defaultOps, ...mockOperations });
173
- }
174
- }
175
- // --- Tool Handler ---
176
- /**
177
- * Handle a tool call by routing to the appropriate domain operation.
178
- * Returns MCP protocol response with proper error codes.
179
- */
180
- async function handleToolCall(toolName, args, hulyClient) {
181
- switch (toolName) {
182
- case "list_issues":
183
- return runToolHandler(toolName, args, parseListIssuesParams, (params) => listIssues(params), hulyClient);
184
- case "get_issue":
185
- return runToolHandler(toolName, args, parseGetIssueParams, (params) => getIssue(params), hulyClient);
186
- case "create_issue":
187
- return runToolHandler(toolName, args, parseCreateIssueParams, (params) => createIssue(params), hulyClient);
188
- case "update_issue":
189
- return runToolHandler(toolName, args, parseUpdateIssueParams, (params) => updateIssue(params), hulyClient);
190
- case "add_issue_label":
191
- return runToolHandler(toolName, args, parseAddLabelParams, (params) => addLabel(params), hulyClient);
192
- default:
193
- return createUnknownToolError(toolName);
194
- }
195
- }
196
- // --- Tool Handler Execution ---
197
- /**
198
- * Execute a tool handler with proper error mapping to MCP protocol.
199
- * Uses the error-mapping module for consistent error transformation.
200
- */
201
- async function runToolHandler(toolName, args, parse, operation, hulyClient) {
202
- // Parse and validate input
203
- const parseResult = await Effect.runPromiseExit(parse(args));
204
- if (Exit.isFailure(parseResult)) {
205
- return mapCauseToMcp(parseResult.cause, toolName);
206
- }
207
- const params = parseResult.value;
208
- // Execute the operation with HulyClient provided
209
- const operationResult = await Effect.runPromiseExit(operation(params).pipe(Effect.provideService(HulyClient, hulyClient)));
210
- if (Exit.isFailure(operationResult)) {
211
- return mapCauseToMcp(operationResult.cause, toolName);
212
- }
213
- // Success - create response
214
- return createSuccessResponse(operationResult.value);
215
- }
216
- //# sourceMappingURL=server.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/mcp/server.ts"],"names":[],"mappings":"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"}