@padua/cli 1.13.1 → 2.0.1
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 +121 -6
- package/dist/commands/doctor/index.d.ts.map +1 -1
- package/dist/commands/doctor/index.js +85 -0
- package/dist/commands/doctor/index.js.map +1 -1
- package/dist/commands/doctor/mcp-checks.d.ts +36 -0
- package/dist/commands/doctor/mcp-checks.d.ts.map +1 -0
- package/dist/commands/doctor/mcp-checks.js +235 -0
- package/dist/commands/doctor/mcp-checks.js.map +1 -0
- package/dist/commands/doctor/mcp-service-checks.d.ts +35 -0
- package/dist/commands/doctor/mcp-service-checks.d.ts.map +1 -0
- package/dist/commands/doctor/mcp-service-checks.js +146 -0
- package/dist/commands/doctor/mcp-service-checks.js.map +1 -0
- package/dist/commands/doctor/types.d.ts +4 -1
- package/dist/commands/doctor/types.d.ts.map +1 -1
- package/dist/commands/doctor/types.js +1 -0
- package/dist/commands/doctor/types.js.map +1 -1
- package/dist/commands/login/index.d.ts +1 -1
- package/dist/commands/login/index.d.ts.map +1 -1
- package/dist/commands/login/index.js +44 -185
- package/dist/commands/login/index.js.map +1 -1
- package/dist/commands/login/mcp-steps.d.ts +38 -0
- package/dist/commands/login/mcp-steps.d.ts.map +1 -0
- package/dist/commands/login/mcp-steps.js +176 -0
- package/dist/commands/login/mcp-steps.js.map +1 -0
- package/dist/commands/login/orchestrator.d.ts +9 -0
- package/dist/commands/login/orchestrator.d.ts.map +1 -0
- package/dist/commands/login/orchestrator.js +251 -0
- package/dist/commands/login/orchestrator.js.map +1 -0
- package/dist/commands/login/types.d.ts +11 -0
- package/dist/commands/login/types.d.ts.map +1 -1
- package/dist/commands/login/types.js.map +1 -1
- package/dist/commands/status/aws-checks.d.ts +14 -0
- package/dist/commands/status/aws-checks.d.ts.map +1 -0
- package/dist/commands/status/aws-checks.js +145 -0
- package/dist/commands/status/aws-checks.js.map +1 -0
- package/dist/commands/status/checks.d.ts +9 -25
- package/dist/commands/status/checks.d.ts.map +1 -1
- package/dist/commands/status/checks.js +52 -254
- package/dist/commands/status/checks.js.map +1 -1
- package/dist/commands/status/index.d.ts.map +1 -1
- package/dist/commands/status/index.js +53 -1
- package/dist/commands/status/index.js.map +1 -1
- package/dist/commands/status/mcp-checks.d.ts +35 -0
- package/dist/commands/status/mcp-checks.d.ts.map +1 -0
- package/dist/commands/status/mcp-checks.js +175 -0
- package/dist/commands/status/mcp-checks.js.map +1 -0
- package/dist/commands/status/types.d.ts +34 -0
- package/dist/commands/status/types.d.ts.map +1 -1
- package/dist/mcp/config/index.d.ts +4 -0
- package/dist/mcp/config/index.d.ts.map +1 -0
- package/dist/mcp/config/index.js +14 -0
- package/dist/mcp/config/index.js.map +1 -0
- package/dist/mcp/config/loaders.d.ts +45 -0
- package/dist/mcp/config/loaders.d.ts.map +1 -0
- package/dist/mcp/config/loaders.js +149 -0
- package/dist/mcp/config/loaders.js.map +1 -0
- package/dist/mcp/config/types.d.ts +234 -0
- package/dist/mcp/config/types.d.ts.map +1 -0
- package/dist/mcp/config/types.js +45 -0
- package/dist/mcp/config/types.js.map +1 -0
- package/dist/mcp/daemon/entry-logic.d.ts +28 -0
- package/dist/mcp/daemon/entry-logic.d.ts.map +1 -0
- package/dist/mcp/daemon/entry-logic.js +82 -0
- package/dist/mcp/daemon/entry-logic.js.map +1 -0
- package/dist/mcp/daemon/entry.d.ts +8 -0
- package/dist/mcp/daemon/entry.d.ts.map +1 -0
- package/dist/mcp/daemon/entry.js +34 -0
- package/dist/mcp/daemon/entry.js.map +1 -0
- package/dist/mcp/daemon/fork.d.ts +21 -0
- package/dist/mcp/daemon/fork.d.ts.map +1 -0
- package/dist/mcp/daemon/fork.js +188 -0
- package/dist/mcp/daemon/fork.js.map +1 -0
- package/dist/mcp/daemon/health.d.ts +8 -0
- package/dist/mcp/daemon/health.d.ts.map +1 -0
- package/dist/mcp/daemon/health.js +50 -0
- package/dist/mcp/daemon/health.js.map +1 -0
- package/dist/mcp/daemon/index.d.ts +6 -0
- package/dist/mcp/daemon/index.d.ts.map +1 -0
- package/dist/mcp/daemon/index.js +22 -0
- package/dist/mcp/daemon/index.js.map +1 -0
- package/dist/mcp/daemon/types.d.ts +63 -0
- package/dist/mcp/daemon/types.d.ts.map +1 -0
- package/dist/mcp/daemon/types.js +18 -0
- package/dist/mcp/daemon/types.js.map +1 -0
- package/dist/mcp/errors/index.d.ts +3 -0
- package/dist/mcp/errors/index.d.ts.map +1 -0
- package/dist/mcp/errors/index.js +13 -0
- package/dist/mcp/errors/index.js.map +1 -0
- package/dist/mcp/errors/types.d.ts +83 -0
- package/dist/mcp/errors/types.d.ts.map +1 -0
- package/dist/mcp/errors/types.js +148 -0
- package/dist/mcp/errors/types.js.map +1 -0
- package/dist/mcp/providers/atlassian/auth.d.ts +34 -0
- package/dist/mcp/providers/atlassian/auth.d.ts.map +1 -0
- package/dist/mcp/providers/atlassian/auth.js +107 -0
- package/dist/mcp/providers/atlassian/auth.js.map +1 -0
- package/dist/mcp/providers/atlassian/client.d.ts +15 -0
- package/dist/mcp/providers/atlassian/client.d.ts.map +1 -0
- package/dist/mcp/providers/atlassian/client.js +38 -0
- package/dist/mcp/providers/atlassian/client.js.map +1 -0
- package/dist/mcp/providers/atlassian/index.d.ts +6 -0
- package/dist/mcp/providers/atlassian/index.d.ts.map +1 -0
- package/dist/mcp/providers/atlassian/index.js +11 -0
- package/dist/mcp/providers/atlassian/index.js.map +1 -0
- package/dist/mcp/providers/atlassian/markdown-to-adf/index.d.ts +17 -0
- package/dist/mcp/providers/atlassian/markdown-to-adf/index.d.ts.map +1 -0
- package/dist/mcp/providers/atlassian/markdown-to-adf/index.js +29 -0
- package/dist/mcp/providers/atlassian/markdown-to-adf/index.js.map +1 -0
- package/dist/mcp/providers/atlassian/markdown-to-adf/nodes.d.ts +43 -0
- package/dist/mcp/providers/atlassian/markdown-to-adf/nodes.d.ts.map +1 -0
- package/dist/mcp/providers/atlassian/markdown-to-adf/nodes.js +101 -0
- package/dist/mcp/providers/atlassian/markdown-to-adf/nodes.js.map +1 -0
- package/dist/mcp/providers/atlassian/markdown-to-adf/parser.d.ts +14 -0
- package/dist/mcp/providers/atlassian/markdown-to-adf/parser.d.ts.map +1 -0
- package/dist/mcp/providers/atlassian/markdown-to-adf/parser.js +250 -0
- package/dist/mcp/providers/atlassian/markdown-to-adf/parser.js.map +1 -0
- package/dist/mcp/providers/atlassian/provider.d.ts +38 -0
- package/dist/mcp/providers/atlassian/provider.d.ts.map +1 -0
- package/dist/mcp/providers/atlassian/provider.js +101 -0
- package/dist/mcp/providers/atlassian/provider.js.map +1 -0
- package/dist/mcp/providers/atlassian/resources.d.ts +4 -0
- package/dist/mcp/providers/atlassian/resources.d.ts.map +1 -0
- package/dist/mcp/providers/atlassian/resources.js +67 -0
- package/dist/mcp/providers/atlassian/resources.js.map +1 -0
- package/dist/mcp/providers/atlassian/tools/confluence.d.ts +4 -0
- package/dist/mcp/providers/atlassian/tools/confluence.d.ts.map +1 -0
- package/dist/mcp/providers/atlassian/tools/confluence.js +169 -0
- package/dist/mcp/providers/atlassian/tools/confluence.js.map +1 -0
- package/dist/mcp/providers/atlassian/tools/jira.d.ts +4 -0
- package/dist/mcp/providers/atlassian/tools/jira.d.ts.map +1 -0
- package/dist/mcp/providers/atlassian/tools/jira.js +274 -0
- package/dist/mcp/providers/atlassian/tools/jira.js.map +1 -0
- package/dist/mcp/providers/gitlab/auth.d.ts +10 -0
- package/dist/mcp/providers/gitlab/auth.d.ts.map +1 -0
- package/dist/mcp/providers/gitlab/auth.js +23 -0
- package/dist/mcp/providers/gitlab/auth.js.map +1 -0
- package/dist/mcp/providers/gitlab/client.d.ts +23 -0
- package/dist/mcp/providers/gitlab/client.d.ts.map +1 -0
- package/dist/mcp/providers/gitlab/client.js +17 -0
- package/dist/mcp/providers/gitlab/client.js.map +1 -0
- package/dist/mcp/providers/gitlab/index.d.ts +5 -0
- package/dist/mcp/providers/gitlab/index.d.ts.map +1 -0
- package/dist/mcp/providers/gitlab/index.js +10 -0
- package/dist/mcp/providers/gitlab/index.js.map +1 -0
- package/dist/mcp/providers/gitlab/provider.d.ts +25 -0
- package/dist/mcp/providers/gitlab/provider.d.ts.map +1 -0
- package/dist/mcp/providers/gitlab/provider.js +48 -0
- package/dist/mcp/providers/gitlab/provider.js.map +1 -0
- package/dist/mcp/providers/gitlab/resources.d.ts +11 -0
- package/dist/mcp/providers/gitlab/resources.d.ts.map +1 -0
- package/dist/mcp/providers/gitlab/resources.js +54 -0
- package/dist/mcp/providers/gitlab/resources.js.map +1 -0
- package/dist/mcp/providers/gitlab/tools/issues.d.ts +4 -0
- package/dist/mcp/providers/gitlab/tools/issues.d.ts.map +1 -0
- package/dist/mcp/providers/gitlab/tools/issues.js +120 -0
- package/dist/mcp/providers/gitlab/tools/issues.js.map +1 -0
- package/dist/mcp/providers/gitlab/tools/merge-requests.d.ts +11 -0
- package/dist/mcp/providers/gitlab/tools/merge-requests.d.ts.map +1 -0
- package/dist/mcp/providers/gitlab/tools/merge-requests.js +282 -0
- package/dist/mcp/providers/gitlab/tools/merge-requests.js.map +1 -0
- package/dist/mcp/providers/gitlab/tools/pipelines.d.ts +10 -0
- package/dist/mcp/providers/gitlab/tools/pipelines.d.ts.map +1 -0
- package/dist/mcp/providers/gitlab/tools/pipelines.js +173 -0
- package/dist/mcp/providers/gitlab/tools/pipelines.js.map +1 -0
- package/dist/mcp/providers/gitlab/tools/repository.d.ts +4 -0
- package/dist/mcp/providers/gitlab/tools/repository.d.ts.map +1 -0
- package/dist/mcp/providers/gitlab/tools/repository.js +191 -0
- package/dist/mcp/providers/gitlab/tools/repository.js.map +1 -0
- package/dist/mcp/providers/index.d.ts +4 -0
- package/dist/mcp/providers/index.d.ts.map +1 -0
- package/dist/mcp/providers/index.js +6 -0
- package/dist/mcp/providers/index.js.map +1 -0
- package/dist/mcp/providers/registry.d.ts +90 -0
- package/dist/mcp/providers/registry.d.ts.map +1 -0
- package/dist/mcp/providers/registry.js +128 -0
- package/dist/mcp/providers/registry.js.map +1 -0
- package/dist/mcp/providers/tool-helpers.d.ts +14 -0
- package/dist/mcp/providers/tool-helpers.d.ts.map +1 -0
- package/dist/mcp/providers/tool-helpers.js +12 -0
- package/dist/mcp/providers/tool-helpers.js.map +1 -0
- package/dist/mcp/providers/types.d.ts +80 -0
- package/dist/mcp/providers/types.d.ts.map +1 -0
- package/dist/mcp/providers/types.js +13 -0
- package/dist/mcp/providers/types.js.map +1 -0
- package/dist/mcp/server/auth.d.ts +8 -0
- package/dist/mcp/server/auth.d.ts.map +1 -0
- package/dist/mcp/server/auth.js +36 -0
- package/dist/mcp/server/auth.js.map +1 -0
- package/dist/mcp/server/health.d.ts +24 -0
- package/dist/mcp/server/health.d.ts.map +1 -0
- package/dist/mcp/server/health.js +37 -0
- package/dist/mcp/server/health.js.map +1 -0
- package/dist/mcp/server/index.d.ts +11 -0
- package/dist/mcp/server/index.d.ts.map +1 -0
- package/dist/mcp/server/index.js +27 -0
- package/dist/mcp/server/index.js.map +1 -0
- package/dist/mcp/server/logging.d.ts +46 -0
- package/dist/mcp/server/logging.d.ts.map +1 -0
- package/dist/mcp/server/logging.js +109 -0
- package/dist/mcp/server/logging.js.map +1 -0
- package/dist/mcp/server/ratelimit.d.ts +3 -0
- package/dist/mcp/server/ratelimit.d.ts.map +1 -0
- package/dist/mcp/server/ratelimit.js +70 -0
- package/dist/mcp/server/ratelimit.js.map +1 -0
- package/dist/mcp/server/routes.d.ts +3 -0
- package/dist/mcp/server/routes.d.ts.map +1 -0
- package/dist/mcp/server/routes.js +8 -0
- package/dist/mcp/server/routes.js.map +1 -0
- package/dist/mcp/server/server.d.ts +21 -0
- package/dist/mcp/server/server.d.ts.map +1 -0
- package/dist/mcp/server/server.js +114 -0
- package/dist/mcp/server/server.js.map +1 -0
- package/dist/mcp/server/validation.d.ts +22 -0
- package/dist/mcp/server/validation.d.ts.map +1 -0
- package/dist/mcp/server/validation.js +32 -0
- package/dist/mcp/server/validation.js.map +1 -0
- package/dist/mcp/store/encrypt.d.ts +22 -0
- package/dist/mcp/store/encrypt.d.ts.map +1 -0
- package/dist/mcp/store/encrypt.js +66 -0
- package/dist/mcp/store/encrypt.js.map +1 -0
- package/dist/mcp/store/index.d.ts +12 -0
- package/dist/mcp/store/index.d.ts.map +1 -0
- package/dist/mcp/store/index.js +16 -0
- package/dist/mcp/store/index.js.map +1 -0
- package/dist/mcp/store/migrate.d.ts +70 -0
- package/dist/mcp/store/migrate.d.ts.map +1 -0
- package/dist/mcp/store/migrate.js +211 -0
- package/dist/mcp/store/migrate.js.map +1 -0
- package/dist/mcp/store/null-token-store.d.ts +22 -0
- package/dist/mcp/store/null-token-store.d.ts.map +1 -0
- package/dist/mcp/store/null-token-store.js +40 -0
- package/dist/mcp/store/null-token-store.js.map +1 -0
- package/dist/mcp/store/sqlite.d.ts +27 -0
- package/dist/mcp/store/sqlite.d.ts.map +1 -0
- package/dist/mcp/store/sqlite.js +100 -0
- package/dist/mcp/store/sqlite.js.map +1 -0
- package/dist/mcp/store/types.d.ts +183 -0
- package/dist/mcp/store/types.d.ts.map +1 -0
- package/dist/mcp/store/types.js +13 -0
- package/dist/mcp/store/types.js.map +1 -0
- package/dist/mcp/token/http-client.d.ts +3 -0
- package/dist/mcp/token/http-client.d.ts.map +1 -0
- package/dist/mcp/token/http-client.js +186 -0
- package/dist/mcp/token/http-client.js.map +1 -0
- package/dist/mcp/token/index.d.ts +5 -0
- package/dist/mcp/token/index.d.ts.map +1 -0
- package/dist/mcp/token/index.js +15 -0
- package/dist/mcp/token/index.js.map +1 -0
- package/dist/mcp/token/manager.d.ts +54 -0
- package/dist/mcp/token/manager.d.ts.map +1 -0
- package/dist/mcp/token/manager.js +194 -0
- package/dist/mcp/token/manager.js.map +1 -0
- package/dist/mcp/token/null-token-manager.d.ts +19 -0
- package/dist/mcp/token/null-token-manager.d.ts.map +1 -0
- package/dist/mcp/token/null-token-manager.js +50 -0
- package/dist/mcp/token/null-token-manager.js.map +1 -0
- package/dist/mcp/token/oauth.d.ts +44 -0
- package/dist/mcp/token/oauth.d.ts.map +1 -0
- package/dist/mcp/token/oauth.js +257 -0
- package/dist/mcp/token/oauth.js.map +1 -0
- package/dist/mcp/token/types.d.ts +81 -0
- package/dist/mcp/token/types.d.ts.map +1 -0
- package/dist/mcp/token/types.js +6 -0
- package/dist/mcp/token/types.js.map +1 -0
- package/package.json +10 -3
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** Shared helpers for MCP tool result formatting. */
|
|
2
|
+
export declare function toMcpResult(data: unknown): {
|
|
3
|
+
content: Array<{
|
|
4
|
+
type: string;
|
|
5
|
+
text: string;
|
|
6
|
+
}>;
|
|
7
|
+
};
|
|
8
|
+
export declare function toRawTextResult(text: string): {
|
|
9
|
+
content: Array<{
|
|
10
|
+
type: string;
|
|
11
|
+
text: string;
|
|
12
|
+
}>;
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=tool-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-helpers.d.ts","sourceRoot":"","sources":["../../../src/mcp/providers/tool-helpers.ts"],"names":[],"mappings":"AAAA,qDAAqD;AAErD,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAE7F;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAEhG"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/** Shared helpers for MCP tool result formatting. */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.toMcpResult = toMcpResult;
|
|
5
|
+
exports.toRawTextResult = toRawTextResult;
|
|
6
|
+
function toMcpResult(data) {
|
|
7
|
+
return { content: [{ type: 'text', text: JSON.stringify(data) }] };
|
|
8
|
+
}
|
|
9
|
+
function toRawTextResult(text) {
|
|
10
|
+
return { content: [{ type: 'text', text }] };
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=tool-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-helpers.js","sourceRoot":"","sources":["../../../src/mcp/providers/tool-helpers.ts"],"names":[],"mappings":";AAAA,qDAAqD;;AAErD,kCAEC;AAED,0CAEC;AAND,SAAgB,WAAW,CAAC,IAAa;IACvC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;AACrE,CAAC;AAED,SAAgB,eAAe,CAAC,IAAY;IAC1C,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider port interfaces.
|
|
3
|
+
*
|
|
4
|
+
* ToolRegistrar is the port that decouples providers from the concrete MCP SDK
|
|
5
|
+
* McpServer class. Providers register their tools and resources against this
|
|
6
|
+
* interface; the MCP server adapter (wired in Phase 4's composition root)
|
|
7
|
+
* implements it.
|
|
8
|
+
*
|
|
9
|
+
* No import from @modelcontextprotocol/sdk must ever appear in this file.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Port interface for registering MCP tools and resource templates.
|
|
13
|
+
*
|
|
14
|
+
* Providers depend on this abstraction, not on the MCP SDK's McpServer
|
|
15
|
+
* directly. The concrete McpServer implements ToolRegistrar and is wired in
|
|
16
|
+
* Phase 4's composition root.
|
|
17
|
+
*
|
|
18
|
+
* `schema` and `handler` are typed as `unknown` so providers can pass Zod
|
|
19
|
+
* schemas and typed MCP handlers without this interface importing from the
|
|
20
|
+
* MCP SDK.
|
|
21
|
+
*/
|
|
22
|
+
export interface ToolRegistrar {
|
|
23
|
+
/**
|
|
24
|
+
* Register an MCP tool.
|
|
25
|
+
*
|
|
26
|
+
* @param name - Tool identifier exposed to MCP clients (e.g. 'gitlab_list_issues')
|
|
27
|
+
* @param schema - Input schema (Zod schema in practice; typed as unknown to avoid SDK import)
|
|
28
|
+
* @param handler - Request handler (typed as unknown to avoid SDK import)
|
|
29
|
+
*/
|
|
30
|
+
registerTool(name: string, schema: unknown, handler: unknown): void;
|
|
31
|
+
/**
|
|
32
|
+
* Register an MCP resource template.
|
|
33
|
+
*
|
|
34
|
+
* @param template - URI template or metadata describing the resource
|
|
35
|
+
* @param handler - Resource handler (typed as unknown to avoid SDK import)
|
|
36
|
+
*/
|
|
37
|
+
registerResource(template: unknown, handler: unknown): void;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Interface that all MCP providers must implement.
|
|
41
|
+
*
|
|
42
|
+
* A provider owns one external service integration (e.g. GitLab, Atlassian).
|
|
43
|
+
* It registers its tools and resources via the ToolRegistrar port so it
|
|
44
|
+
* remains independent of the MCP SDK.
|
|
45
|
+
*/
|
|
46
|
+
export interface Provider {
|
|
47
|
+
/** Stable identifier for this provider (e.g. 'gitlab', 'atlassian'). */
|
|
48
|
+
readonly name: string;
|
|
49
|
+
/**
|
|
50
|
+
* Register all MCP tools this provider exposes.
|
|
51
|
+
*
|
|
52
|
+
* Called once at server startup before the first client connects.
|
|
53
|
+
*
|
|
54
|
+
* @param registrar - ToolRegistrar port — never the raw McpServer
|
|
55
|
+
*/
|
|
56
|
+
registerTools(registrar: ToolRegistrar): void;
|
|
57
|
+
/**
|
|
58
|
+
* Register all MCP resource templates this provider exposes.
|
|
59
|
+
*
|
|
60
|
+
* Called once at server startup before the first client connects.
|
|
61
|
+
*
|
|
62
|
+
* @param registrar - ToolRegistrar port — never the raw McpServer
|
|
63
|
+
*/
|
|
64
|
+
registerResources(registrar: ToolRegistrar): void;
|
|
65
|
+
/**
|
|
66
|
+
* Check whether this provider is ready to serve requests.
|
|
67
|
+
*
|
|
68
|
+
* Resolves when the provider has a valid token and the upstream API is
|
|
69
|
+
* reachable. Rejects with a descriptive error when it is not ready.
|
|
70
|
+
*/
|
|
71
|
+
ready(): Promise<void>;
|
|
72
|
+
/**
|
|
73
|
+
* Release provider resources on server shutdown.
|
|
74
|
+
*
|
|
75
|
+
* Implementations should close connections and flush any pending state.
|
|
76
|
+
* Must not throw — rejections indicate a non-fatal cleanup failure.
|
|
77
|
+
*/
|
|
78
|
+
shutdown(): Promise<void>;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/mcp/providers/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;;;;;;;GAUG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;;;OAMG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAEpE;;;;;OAKG;IACH,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;CAC7D;AAED;;;;;;GAMG;AACH,MAAM,WAAW,QAAQ;IACvB,wEAAwE;IACxE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;;;;;OAMG;IACH,aAAa,CAAC,SAAS,EAAE,aAAa,GAAG,IAAI,CAAC;IAE9C;;;;;;OAMG;IACH,iBAAiB,CAAC,SAAS,EAAE,aAAa,GAAG,IAAI,CAAC;IAElD;;;;;OAKG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB;;;;;OAKG;IACH,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Provider port interfaces.
|
|
4
|
+
*
|
|
5
|
+
* ToolRegistrar is the port that decouples providers from the concrete MCP SDK
|
|
6
|
+
* McpServer class. Providers register their tools and resources against this
|
|
7
|
+
* interface; the MCP server adapter (wired in Phase 4's composition root)
|
|
8
|
+
* implements it.
|
|
9
|
+
*
|
|
10
|
+
* No import from @modelcontextprotocol/sdk must ever appear in this file.
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/mcp/providers/types.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
2
|
+
export type RequestHandler = (req: IncomingMessage, res: ServerResponse, next: () => void) => void;
|
|
3
|
+
/**
|
|
4
|
+
* Create Bearer token auth middleware.
|
|
5
|
+
* /health bypasses auth. All other routes require valid Bearer token.
|
|
6
|
+
*/
|
|
7
|
+
export declare function createAuthMiddleware(expectedToken: string): RequestHandler;
|
|
8
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/mcp/server/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAIjE,MAAM,MAAM,cAAc,GAAG,CAC3B,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,MAAM,IAAI,KACb,IAAI,CAAC;AAOV;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,MAAM,GAAG,cAAc,CAwB1E"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createAuthMiddleware = createAuthMiddleware;
|
|
4
|
+
const node_crypto_1 = require("node:crypto");
|
|
5
|
+
const routes_1 = require("./routes");
|
|
6
|
+
function sendUnauthorized(res, message) {
|
|
7
|
+
res.writeHead(401, { 'Content-Type': 'application/json' });
|
|
8
|
+
res.end(JSON.stringify({ error: { code: 'UNAUTHORIZED', message } }));
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Create Bearer token auth middleware.
|
|
12
|
+
* /health bypasses auth. All other routes require valid Bearer token.
|
|
13
|
+
*/
|
|
14
|
+
function createAuthMiddleware(expectedToken) {
|
|
15
|
+
return (req, res, next) => {
|
|
16
|
+
const url = req.url ?? '';
|
|
17
|
+
if ((0, routes_1.isHealthRoute)(url)) {
|
|
18
|
+
next();
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const authHeader = req.headers.authorization;
|
|
22
|
+
if (!authHeader) {
|
|
23
|
+
sendUnauthorized(res, 'Missing Authorization header');
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const token = authHeader.startsWith('Bearer ') ? authHeader.slice(7) : '';
|
|
27
|
+
const provided = Buffer.from(token);
|
|
28
|
+
const expected = Buffer.from(expectedToken);
|
|
29
|
+
if (provided.length !== expected.length || !(0, node_crypto_1.timingSafeEqual)(provided, expected)) {
|
|
30
|
+
sendUnauthorized(res, 'Invalid Bearer token');
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
next();
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/mcp/server/auth.ts"],"names":[],"mappings":";;AAmBA,oDAwBC;AA1CD,6CAA8C;AAC9C,qCAAyC;AAQzC,SAAS,gBAAgB,CAAC,GAAmB,EAAE,OAAe;IAC5D,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AACxE,CAAC;AAED;;;GAGG;AACH,SAAgB,oBAAoB,CAAC,aAAqB;IACxD,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACxB,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC;QAC1B,IAAI,IAAA,sBAAa,EAAC,GAAG,CAAC,EAAE,CAAC;YACvB,IAAI,EAAE,CAAC;YACP,OAAO;QACT,CAAC;QAED,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC;QAC7C,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,gBAAgB,CAAC,GAAG,EAAE,8BAA8B,CAAC,CAAC;YACtD,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1E,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC5C,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAA,6BAAe,EAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC;YAChF,gBAAgB,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAC;YAC9C,OAAO;QACT,CAAC;QAED,IAAI,EAAE,CAAC;IACT,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
2
|
+
export type ProviderStatus = 'ready' | 'error' | 'not_configured';
|
|
3
|
+
export interface HealthStatus {
|
|
4
|
+
status: 'ok' | 'degraded' | 'error';
|
|
5
|
+
providers: Record<string, ProviderStatus>;
|
|
6
|
+
uptime: number;
|
|
7
|
+
version: string;
|
|
8
|
+
metrics: {
|
|
9
|
+
toolCallsTotal: number;
|
|
10
|
+
toolCallErrors: number;
|
|
11
|
+
tokenRefreshTotal: number;
|
|
12
|
+
tokenRefreshErrors: number;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export interface HealthDependencies {
|
|
16
|
+
version: string;
|
|
17
|
+
startTime: number;
|
|
18
|
+
getProviderStatuses: () => Record<string, ProviderStatus>;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Create the /health endpoint handler.
|
|
22
|
+
*/
|
|
23
|
+
export declare function createHealthHandler(deps: HealthDependencies): (req: IncomingMessage, res: ServerResponse) => void;
|
|
24
|
+
//# sourceMappingURL=health.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../../src/mcp/server/health.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAGjE,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,OAAO,GAAG,gBAAgB,CAAC;AAElE,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,IAAI,GAAG,UAAU,GAAG,OAAO,CAAC;IACpC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE;QACP,cAAc,EAAE,MAAM,CAAC;QACvB,cAAc,EAAE,MAAM,CAAC;QACvB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,kBAAkB,EAAE,MAAM,CAAC;KAC5B,CAAC;CACH;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,mBAAmB,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CAC3D;AASD;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,kBAAkB,GACvB,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,KAAK,IAAI,CAsBrD"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createHealthHandler = createHealthHandler;
|
|
4
|
+
const logging_1 = require("./logging");
|
|
5
|
+
function deriveStatus(values) {
|
|
6
|
+
if (values.length === 0)
|
|
7
|
+
return 'degraded';
|
|
8
|
+
if (values.every((s) => s === 'ready'))
|
|
9
|
+
return 'ok';
|
|
10
|
+
if (values.some((s) => s === 'ready'))
|
|
11
|
+
return 'degraded';
|
|
12
|
+
return 'error';
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Create the /health endpoint handler.
|
|
16
|
+
*/
|
|
17
|
+
function createHealthHandler(deps) {
|
|
18
|
+
return (_req, res) => {
|
|
19
|
+
const providerStatuses = deps.getProviderStatuses();
|
|
20
|
+
const metrics = logging_1.MetricsCollector.getInstance().getMetrics();
|
|
21
|
+
const status = deriveStatus(Object.values(providerStatuses));
|
|
22
|
+
const body = {
|
|
23
|
+
status,
|
|
24
|
+
providers: providerStatuses,
|
|
25
|
+
uptime: Math.floor((Date.now() - deps.startTime) / 1000),
|
|
26
|
+
version: deps.version,
|
|
27
|
+
metrics,
|
|
28
|
+
};
|
|
29
|
+
const httpStatus = status === 'error' ? 503 : 200;
|
|
30
|
+
res.writeHead(httpStatus, {
|
|
31
|
+
'Content-Type': 'application/json; charset=utf-8',
|
|
32
|
+
'Cache-Control': 'no-cache, no-store',
|
|
33
|
+
});
|
|
34
|
+
res.end(JSON.stringify(body));
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=health.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../../src/mcp/server/health.ts"],"names":[],"mappings":";;AAkCA,kDAwBC;AAzDD,uCAA6C;AAuB7C,SAAS,YAAY,CAAC,MAAwB;IAC5C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,UAAU,CAAC;IAC3C,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IACpD,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,OAAO,CAAC;QAAE,OAAO,UAAU,CAAC;IACzD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,SAAgB,mBAAmB,CACjC,IAAwB;IAExB,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QACnB,MAAM,gBAAgB,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACpD,MAAM,OAAO,GAAG,0BAAgB,CAAC,WAAW,EAAE,CAAC,UAAU,EAAE,CAAC;QAC5D,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAE7D,MAAM,IAAI,GAAiB;YACzB,MAAM;YACN,SAAS,EAAE,gBAAgB;YAC3B,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;YACxD,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO;SACR,CAAC;QAEF,MAAM,UAAU,GAAG,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QAElD,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE;YACxB,cAAc,EAAE,iCAAiC;YACjD,eAAe,EAAE,oBAAoB;SACtC,CAAC,CAAC;QACH,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAChC,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export { JiraIssueKeySchema, GitLabProjectIdSchema, SearchQuerySchema, FilePathSchema, CommitMessageSchema, PageSchema, PerPageSchema, CqlQuerySchema, SpaceKeySchema, BranchNameSchema, } from './validation';
|
|
2
|
+
export { createLogger, getDefaultLogDir, MetricsCollector } from './logging';
|
|
3
|
+
export type { Logger, LogLevel, LogEntry } from './logging';
|
|
4
|
+
export { createHealthHandler } from './health';
|
|
5
|
+
export type { HealthStatus, HealthDependencies, ProviderStatus } from './health';
|
|
6
|
+
export { createAuthMiddleware } from './auth';
|
|
7
|
+
export type { RequestHandler } from './auth';
|
|
8
|
+
export { createRateLimiter } from './ratelimit';
|
|
9
|
+
export { createMcpServer } from './server';
|
|
10
|
+
export type { McpServerConfig, McpServerInstance } from './server';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/mcp/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EACnB,UAAU,EACV,aAAa,EACb,cAAc,EACd,cAAc,EACd,gBAAgB,GACjB,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7E,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAE5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC/C,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAEjF,OAAO,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAC9C,YAAY,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createMcpServer = exports.createRateLimiter = exports.createAuthMiddleware = exports.createHealthHandler = exports.MetricsCollector = exports.getDefaultLogDir = exports.createLogger = exports.BranchNameSchema = exports.SpaceKeySchema = exports.CqlQuerySchema = exports.PerPageSchema = exports.PageSchema = exports.CommitMessageSchema = exports.FilePathSchema = exports.SearchQuerySchema = exports.GitLabProjectIdSchema = exports.JiraIssueKeySchema = void 0;
|
|
4
|
+
var validation_1 = require("./validation");
|
|
5
|
+
Object.defineProperty(exports, "JiraIssueKeySchema", { enumerable: true, get: function () { return validation_1.JiraIssueKeySchema; } });
|
|
6
|
+
Object.defineProperty(exports, "GitLabProjectIdSchema", { enumerable: true, get: function () { return validation_1.GitLabProjectIdSchema; } });
|
|
7
|
+
Object.defineProperty(exports, "SearchQuerySchema", { enumerable: true, get: function () { return validation_1.SearchQuerySchema; } });
|
|
8
|
+
Object.defineProperty(exports, "FilePathSchema", { enumerable: true, get: function () { return validation_1.FilePathSchema; } });
|
|
9
|
+
Object.defineProperty(exports, "CommitMessageSchema", { enumerable: true, get: function () { return validation_1.CommitMessageSchema; } });
|
|
10
|
+
Object.defineProperty(exports, "PageSchema", { enumerable: true, get: function () { return validation_1.PageSchema; } });
|
|
11
|
+
Object.defineProperty(exports, "PerPageSchema", { enumerable: true, get: function () { return validation_1.PerPageSchema; } });
|
|
12
|
+
Object.defineProperty(exports, "CqlQuerySchema", { enumerable: true, get: function () { return validation_1.CqlQuerySchema; } });
|
|
13
|
+
Object.defineProperty(exports, "SpaceKeySchema", { enumerable: true, get: function () { return validation_1.SpaceKeySchema; } });
|
|
14
|
+
Object.defineProperty(exports, "BranchNameSchema", { enumerable: true, get: function () { return validation_1.BranchNameSchema; } });
|
|
15
|
+
var logging_1 = require("./logging");
|
|
16
|
+
Object.defineProperty(exports, "createLogger", { enumerable: true, get: function () { return logging_1.createLogger; } });
|
|
17
|
+
Object.defineProperty(exports, "getDefaultLogDir", { enumerable: true, get: function () { return logging_1.getDefaultLogDir; } });
|
|
18
|
+
Object.defineProperty(exports, "MetricsCollector", { enumerable: true, get: function () { return logging_1.MetricsCollector; } });
|
|
19
|
+
var health_1 = require("./health");
|
|
20
|
+
Object.defineProperty(exports, "createHealthHandler", { enumerable: true, get: function () { return health_1.createHealthHandler; } });
|
|
21
|
+
var auth_1 = require("./auth");
|
|
22
|
+
Object.defineProperty(exports, "createAuthMiddleware", { enumerable: true, get: function () { return auth_1.createAuthMiddleware; } });
|
|
23
|
+
var ratelimit_1 = require("./ratelimit");
|
|
24
|
+
Object.defineProperty(exports, "createRateLimiter", { enumerable: true, get: function () { return ratelimit_1.createRateLimiter; } });
|
|
25
|
+
var server_1 = require("./server");
|
|
26
|
+
Object.defineProperty(exports, "createMcpServer", { enumerable: true, get: function () { return server_1.createMcpServer; } });
|
|
27
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/mcp/server/index.ts"],"names":[],"mappings":";;;AAAA,2CAWsB;AAVpB,gHAAA,kBAAkB,OAAA;AAClB,mHAAA,qBAAqB,OAAA;AACrB,+GAAA,iBAAiB,OAAA;AACjB,4GAAA,cAAc,OAAA;AACd,iHAAA,mBAAmB,OAAA;AACnB,wGAAA,UAAU,OAAA;AACV,2GAAA,aAAa,OAAA;AACb,4GAAA,cAAc,OAAA;AACd,4GAAA,cAAc,OAAA;AACd,8GAAA,gBAAgB,OAAA;AAGlB,qCAA6E;AAApE,uGAAA,YAAY,OAAA;AAAE,2GAAA,gBAAgB,OAAA;AAAE,2GAAA,gBAAgB,OAAA;AAGzD,mCAA+C;AAAtC,6GAAA,mBAAmB,OAAA;AAG5B,+BAA8C;AAArC,4GAAA,oBAAoB,OAAA;AAE7B,yCAAgD;AAAvC,8GAAA,iBAAiB,OAAA;AAE1B,mCAA2C;AAAlC,yGAAA,eAAe,OAAA"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
|
|
2
|
+
export interface LogEntry {
|
|
3
|
+
timestamp: string;
|
|
4
|
+
level: LogLevel;
|
|
5
|
+
message: string;
|
|
6
|
+
correlationId?: string;
|
|
7
|
+
[key: string]: unknown;
|
|
8
|
+
}
|
|
9
|
+
export interface Logger {
|
|
10
|
+
debug(message: string, data?: Record<string, unknown>): void;
|
|
11
|
+
info(message: string, data?: Record<string, unknown>): void;
|
|
12
|
+
warn(message: string, data?: Record<string, unknown>): void;
|
|
13
|
+
error(message: string, data?: Record<string, unknown>): void;
|
|
14
|
+
child(defaultData: Record<string, unknown>): Logger;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* In-memory metrics collector (singleton).
|
|
18
|
+
* Counters reset on process restart.
|
|
19
|
+
*/
|
|
20
|
+
export declare class MetricsCollector {
|
|
21
|
+
private static instance;
|
|
22
|
+
toolCallsTotal: number;
|
|
23
|
+
toolCallErrors: number;
|
|
24
|
+
tokenRefreshTotal: number;
|
|
25
|
+
tokenRefreshErrors: number;
|
|
26
|
+
static getInstance(): MetricsCollector;
|
|
27
|
+
/** Reset for testing */
|
|
28
|
+
static resetInstance(): void;
|
|
29
|
+
getMetrics(): {
|
|
30
|
+
toolCallsTotal: number;
|
|
31
|
+
toolCallErrors: number;
|
|
32
|
+
tokenRefreshTotal: number;
|
|
33
|
+
tokenRefreshErrors: number;
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Get platform-aware default log directory.
|
|
38
|
+
*/
|
|
39
|
+
export declare function getDefaultLogDir(): string;
|
|
40
|
+
/**
|
|
41
|
+
* Create a structured JSON logger.
|
|
42
|
+
* logDir defaults to platform-aware directory.
|
|
43
|
+
* Falls back to stderr if logDir is not writable.
|
|
44
|
+
*/
|
|
45
|
+
export declare function createLogger(logDir?: string): Logger;
|
|
46
|
+
//# sourceMappingURL=logging.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../../../src/mcp/server/logging.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,QAAQ,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,MAAM;IACrB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC7D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC5D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC5D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC7D,KAAK,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC;CACrD;AAED;;;GAGG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAmB;IAE1C,cAAc,SAAK;IACnB,cAAc,SAAK;IACnB,iBAAiB,SAAK;IACtB,kBAAkB,SAAK;IAEvB,MAAM,CAAC,WAAW,IAAI,gBAAgB;IAOtC,wBAAwB;IACxB,MAAM,CAAC,aAAa,IAAI,IAAI;IAI5B,UAAU,IAAI;QACZ,cAAc,EAAE,MAAM,CAAC;QACvB,cAAc,EAAE,MAAM,CAAC;QACvB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,kBAAkB,EAAE,MAAM,CAAC;KAC5B;CAQF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAKzC;AA2BD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAuCpD"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MetricsCollector = void 0;
|
|
4
|
+
exports.getDefaultLogDir = getDefaultLogDir;
|
|
5
|
+
exports.createLogger = createLogger;
|
|
6
|
+
const node_fs_1 = require("node:fs");
|
|
7
|
+
const node_path_1 = require("node:path");
|
|
8
|
+
const node_os_1 = require("node:os");
|
|
9
|
+
const errors_1 = require("../errors");
|
|
10
|
+
/**
|
|
11
|
+
* In-memory metrics collector (singleton).
|
|
12
|
+
* Counters reset on process restart.
|
|
13
|
+
*/
|
|
14
|
+
class MetricsCollector {
|
|
15
|
+
static instance;
|
|
16
|
+
toolCallsTotal = 0;
|
|
17
|
+
toolCallErrors = 0;
|
|
18
|
+
tokenRefreshTotal = 0;
|
|
19
|
+
tokenRefreshErrors = 0;
|
|
20
|
+
static getInstance() {
|
|
21
|
+
if (!MetricsCollector.instance) {
|
|
22
|
+
MetricsCollector.instance = new MetricsCollector();
|
|
23
|
+
}
|
|
24
|
+
return MetricsCollector.instance;
|
|
25
|
+
}
|
|
26
|
+
/** Reset for testing */
|
|
27
|
+
static resetInstance() {
|
|
28
|
+
MetricsCollector.instance = new MetricsCollector();
|
|
29
|
+
}
|
|
30
|
+
getMetrics() {
|
|
31
|
+
return {
|
|
32
|
+
toolCallsTotal: this.toolCallsTotal,
|
|
33
|
+
toolCallErrors: this.toolCallErrors,
|
|
34
|
+
tokenRefreshTotal: this.tokenRefreshTotal,
|
|
35
|
+
tokenRefreshErrors: this.tokenRefreshErrors,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
exports.MetricsCollector = MetricsCollector;
|
|
40
|
+
/**
|
|
41
|
+
* Get platform-aware default log directory.
|
|
42
|
+
*/
|
|
43
|
+
function getDefaultLogDir() {
|
|
44
|
+
if (process.platform === 'darwin') {
|
|
45
|
+
return (0, node_path_1.join)((0, node_os_1.homedir)(), 'Library', 'Logs', 'padua-mcp');
|
|
46
|
+
}
|
|
47
|
+
return (0, node_path_1.join)((0, node_os_1.homedir)(), '.local', 'share', 'padua', 'logs');
|
|
48
|
+
}
|
|
49
|
+
function redactEntry(entry) {
|
|
50
|
+
const redacted = { ...entry };
|
|
51
|
+
for (const [key, val] of Object.entries(redacted)) {
|
|
52
|
+
if (typeof val === 'string' && key !== 'timestamp' && key !== 'level') {
|
|
53
|
+
redacted[key] = (0, errors_1.redactTokens)(val);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return redacted;
|
|
57
|
+
}
|
|
58
|
+
function buildWriter(dir, useStderr) {
|
|
59
|
+
return (entry) => {
|
|
60
|
+
const line = JSON.stringify(entry) + '\n';
|
|
61
|
+
if (useStderr) {
|
|
62
|
+
process.stderr.write(line);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
try {
|
|
66
|
+
(0, node_fs_1.appendFileSync)((0, node_path_1.join)(dir, 'server.log'), line);
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
process.stderr.write(line);
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Create a structured JSON logger.
|
|
75
|
+
* logDir defaults to platform-aware directory.
|
|
76
|
+
* Falls back to stderr if logDir is not writable.
|
|
77
|
+
*/
|
|
78
|
+
function createLogger(logDir) {
|
|
79
|
+
const dir = logDir ?? getDefaultLogDir();
|
|
80
|
+
let useStderr = false;
|
|
81
|
+
try {
|
|
82
|
+
(0, node_fs_1.mkdirSync)(dir, { recursive: true });
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
useStderr = true;
|
|
86
|
+
}
|
|
87
|
+
const write = buildWriter(dir, useStderr);
|
|
88
|
+
function log(level, message, data, defaults) {
|
|
89
|
+
const entry = {
|
|
90
|
+
timestamp: new Date().toISOString(),
|
|
91
|
+
level,
|
|
92
|
+
message: (0, errors_1.redactTokens)(message),
|
|
93
|
+
...defaults,
|
|
94
|
+
...data,
|
|
95
|
+
};
|
|
96
|
+
write(redactEntry(entry));
|
|
97
|
+
}
|
|
98
|
+
function makeLogger(defaults) {
|
|
99
|
+
return {
|
|
100
|
+
debug: (msg, data) => log('debug', msg, data, defaults),
|
|
101
|
+
info: (msg, data) => log('info', msg, data, defaults),
|
|
102
|
+
warn: (msg, data) => log('warn', msg, data, defaults),
|
|
103
|
+
error: (msg, data) => log('error', msg, data, defaults),
|
|
104
|
+
child: (childDefaults) => makeLogger({ ...defaults, ...childDefaults }),
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
return makeLogger();
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=logging.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logging.js","sourceRoot":"","sources":["../../../src/mcp/server/logging.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ratelimit.d.ts","sourceRoot":"","sources":["../../../src/mcp/server/ratelimit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAgC7C,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,cAAc,CAkDnF"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createRateLimiter = createRateLimiter;
|
|
4
|
+
const routes_1 = require("./routes");
|
|
5
|
+
function sendRateLimited(res, retryAfter) {
|
|
6
|
+
res.writeHead(429, {
|
|
7
|
+
'Content-Type': 'application/json',
|
|
8
|
+
'Retry-After': String(retryAfter),
|
|
9
|
+
});
|
|
10
|
+
res.end(JSON.stringify({
|
|
11
|
+
error: {
|
|
12
|
+
code: 'RATE_LIMITED',
|
|
13
|
+
message: 'Too many requests \u2014 rate limit exceeded',
|
|
14
|
+
details: { retryAfterSeconds: retryAfter },
|
|
15
|
+
},
|
|
16
|
+
}));
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Create a token bucket rate limiter.
|
|
20
|
+
* @param ratePerSec - Tokens added per second
|
|
21
|
+
* @param burst - Maximum bucket capacity
|
|
22
|
+
*/
|
|
23
|
+
const MAX_BUCKETS = 1024;
|
|
24
|
+
const BUCKET_TTL_MS = 5 * 60 * 1000; // 5 minutes
|
|
25
|
+
function createRateLimiter(ratePerSec, burst) {
|
|
26
|
+
const buckets = new Map();
|
|
27
|
+
function evictStale() {
|
|
28
|
+
if (buckets.size <= MAX_BUCKETS)
|
|
29
|
+
return;
|
|
30
|
+
const now = Date.now();
|
|
31
|
+
for (const [key, bucket] of buckets) {
|
|
32
|
+
if (now - bucket.lastRefill > BUCKET_TTL_MS) {
|
|
33
|
+
buckets.delete(key);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function getBucket(key) {
|
|
38
|
+
let bucket = buckets.get(key);
|
|
39
|
+
if (!bucket) {
|
|
40
|
+
evictStale();
|
|
41
|
+
bucket = { tokens: burst, lastRefill: Date.now() };
|
|
42
|
+
buckets.set(key, bucket);
|
|
43
|
+
}
|
|
44
|
+
return bucket;
|
|
45
|
+
}
|
|
46
|
+
function refill(bucket) {
|
|
47
|
+
const now = Date.now();
|
|
48
|
+
const elapsed = (now - bucket.lastRefill) / 1000;
|
|
49
|
+
bucket.tokens = Math.min(burst, bucket.tokens + elapsed * ratePerSec);
|
|
50
|
+
bucket.lastRefill = now;
|
|
51
|
+
}
|
|
52
|
+
return (req, res, next) => {
|
|
53
|
+
const url = req.url ?? '';
|
|
54
|
+
if ((0, routes_1.isHealthRoute)(url)) {
|
|
55
|
+
next();
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const key = req.socket.remoteAddress ?? '127.0.0.1';
|
|
59
|
+
const bucket = getBucket(key);
|
|
60
|
+
refill(bucket);
|
|
61
|
+
if (bucket.tokens < 1) {
|
|
62
|
+
const retryAfter = Math.ceil(1 / ratePerSec);
|
|
63
|
+
sendRateLimited(res, retryAfter);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
bucket.tokens -= 1;
|
|
67
|
+
next();
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=ratelimit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ratelimit.js","sourceRoot":"","sources":["../../../src/mcp/server/ratelimit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../src/mcp/server/routes.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAE7D,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAElD"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/** Shared route matching helpers for the MCP HTTP server. */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.isHealthRoute = isHealthRoute;
|
|
5
|
+
function isHealthRoute(url) {
|
|
6
|
+
return url === '/health' || url.startsWith('/health?');
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../../../src/mcp/server/routes.ts"],"names":[],"mappings":";AAAA,6DAA6D;;AAE7D,sCAEC;AAFD,SAAgB,aAAa,CAAC,GAAW;IACvC,OAAO,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AACzD,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Server } from 'node:http';
|
|
2
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
3
|
+
export interface McpServerConfig {
|
|
4
|
+
port: number;
|
|
5
|
+
bearerToken: string;
|
|
6
|
+
rateLimit?: {
|
|
7
|
+
ratePerSec: number;
|
|
8
|
+
burst: number;
|
|
9
|
+
};
|
|
10
|
+
version: string;
|
|
11
|
+
logDir?: string;
|
|
12
|
+
maxBodySize?: number;
|
|
13
|
+
}
|
|
14
|
+
export interface McpServerInstance {
|
|
15
|
+
httpServer: Server;
|
|
16
|
+
mcpServer: McpServer;
|
|
17
|
+
start(): Promise<void>;
|
|
18
|
+
stop(): Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
export declare function createMcpServer(config: McpServerConfig, getProviderStatuses: () => Record<string, string>): McpServerInstance;
|
|
21
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/mcp/server/server.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAmC,MAAM,WAAW,CAAC;AAEzE,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAWpE,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAClD,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,SAAS,CAAC;IACrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AA8FD,wBAAgB,eAAe,CAC7B,MAAM,EAAE,eAAe,EACvB,mBAAmB,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAChD,iBAAiB,CAsDnB"}
|