@tunnelhub/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 (112) hide show
  1. package/CONTRIBUTING.md +70 -0
  2. package/LICENSE +21 -0
  3. package/README.md +322 -0
  4. package/dist/auth/browser-auth.d.ts +16 -0
  5. package/dist/auth/browser-auth.d.ts.map +1 -0
  6. package/dist/auth/browser-auth.js +144 -0
  7. package/dist/auth/browser-auth.js.map +1 -0
  8. package/dist/auth/cognito-client.d.ts +14 -0
  9. package/dist/auth/cognito-client.d.ts.map +1 -0
  10. package/dist/auth/cognito-client.js +69 -0
  11. package/dist/auth/cognito-client.js.map +1 -0
  12. package/dist/auth/session-manager.d.ts +17 -0
  13. package/dist/auth/session-manager.d.ts.map +1 -0
  14. package/dist/auth/session-manager.js +152 -0
  15. package/dist/auth/session-manager.js.map +1 -0
  16. package/dist/auth/token-manager.d.ts +50 -0
  17. package/dist/auth/token-manager.d.ts.map +1 -0
  18. package/dist/auth/token-manager.js +107 -0
  19. package/dist/auth/token-manager.js.map +1 -0
  20. package/dist/index.d.ts +3 -0
  21. package/dist/index.d.ts.map +1 -0
  22. package/dist/index.js +6 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/prompts/index.d.ts +3 -0
  25. package/dist/prompts/index.d.ts.map +1 -0
  26. package/dist/prompts/index.js +7 -0
  27. package/dist/prompts/index.js.map +1 -0
  28. package/dist/resources/index.d.ts +3 -0
  29. package/dist/resources/index.d.ts.map +1 -0
  30. package/dist/resources/index.js +7 -0
  31. package/dist/resources/index.js.map +1 -0
  32. package/dist/server.d.ts +12 -0
  33. package/dist/server.d.ts.map +1 -0
  34. package/dist/server.js +46 -0
  35. package/dist/server.js.map +1 -0
  36. package/dist/tools/api-gateway/index.d.ts +3 -0
  37. package/dist/tools/api-gateway/index.d.ts.map +1 -0
  38. package/dist/tools/api-gateway/index.js +9 -0
  39. package/dist/tools/api-gateway/index.js.map +1 -0
  40. package/dist/tools/automations/index.d.ts +3 -0
  41. package/dist/tools/automations/index.d.ts.map +1 -0
  42. package/dist/tools/automations/index.js +201 -0
  43. package/dist/tools/automations/index.js.map +1 -0
  44. package/dist/tools/integrations/index.d.ts +3 -0
  45. package/dist/tools/integrations/index.d.ts.map +1 -0
  46. package/dist/tools/integrations/index.js +10 -0
  47. package/dist/tools/integrations/index.js.map +1 -0
  48. package/dist/tools/monitoring/index.d.ts +3 -0
  49. package/dist/tools/monitoring/index.d.ts.map +1 -0
  50. package/dist/tools/monitoring/index.js +331 -0
  51. package/dist/tools/monitoring/index.js.map +1 -0
  52. package/dist/tools/packages/index.d.ts +3 -0
  53. package/dist/tools/packages/index.d.ts.map +1 -0
  54. package/dist/tools/packages/index.js +7 -0
  55. package/dist/tools/packages/index.js.map +1 -0
  56. package/dist/tools/session/current-session.d.ts +35 -0
  57. package/dist/tools/session/current-session.d.ts.map +1 -0
  58. package/dist/tools/session/current-session.js +32 -0
  59. package/dist/tools/session/current-session.js.map +1 -0
  60. package/dist/tools/session/index.d.ts +3 -0
  61. package/dist/tools/session/index.d.ts.map +1 -0
  62. package/dist/tools/session/index.js +16 -0
  63. package/dist/tools/session/index.js.map +1 -0
  64. package/dist/tools/session/list-environments.d.ts +35 -0
  65. package/dist/tools/session/list-environments.d.ts.map +1 -0
  66. package/dist/tools/session/list-environments.js +36 -0
  67. package/dist/tools/session/list-environments.js.map +1 -0
  68. package/dist/tools/session/list-sessions.d.ts +35 -0
  69. package/dist/tools/session/list-sessions.d.ts.map +1 -0
  70. package/dist/tools/session/list-sessions.js +37 -0
  71. package/dist/tools/session/list-sessions.js.map +1 -0
  72. package/dist/tools/session/login.d.ts +34 -0
  73. package/dist/tools/session/login.d.ts.map +1 -0
  74. package/dist/tools/session/login.js +27 -0
  75. package/dist/tools/session/login.js.map +1 -0
  76. package/dist/tools/session/logout.d.ts +42 -0
  77. package/dist/tools/session/logout.d.ts.map +1 -0
  78. package/dist/tools/session/logout.js +32 -0
  79. package/dist/tools/session/logout.js.map +1 -0
  80. package/dist/tools/session/switch-session.d.ts +42 -0
  81. package/dist/tools/session/switch-session.d.ts.map +1 -0
  82. package/dist/tools/session/switch-session.js +27 -0
  83. package/dist/tools/session/switch-session.js.map +1 -0
  84. package/dist/tools/tenants/index.d.ts +3 -0
  85. package/dist/tools/tenants/index.d.ts.map +1 -0
  86. package/dist/tools/tenants/index.js +61 -0
  87. package/dist/tools/tenants/index.js.map +1 -0
  88. package/dist/tools/users/index.d.ts +3 -0
  89. package/dist/tools/users/index.d.ts.map +1 -0
  90. package/dist/tools/users/index.js +7 -0
  91. package/dist/tools/users/index.js.map +1 -0
  92. package/dist/types/api.d.ts +108 -0
  93. package/dist/types/api.d.ts.map +1 -0
  94. package/dist/types/api.js +2 -0
  95. package/dist/types/api.js.map +1 -0
  96. package/dist/types/dynamodb.d.ts +54 -0
  97. package/dist/types/dynamodb.d.ts.map +1 -0
  98. package/dist/types/dynamodb.js +55 -0
  99. package/dist/types/dynamodb.js.map +1 -0
  100. package/dist/types/mcp.d.ts +271 -0
  101. package/dist/types/mcp.d.ts.map +1 -0
  102. package/dist/types/mcp.js +62 -0
  103. package/dist/types/mcp.js.map +1 -0
  104. package/dist/utils/api-client.d.ts +44 -0
  105. package/dist/utils/api-client.d.ts.map +1 -0
  106. package/dist/utils/api-client.js +201 -0
  107. package/dist/utils/api-client.js.map +1 -0
  108. package/dist/utils/error-handler.d.ts +28 -0
  109. package/dist/utils/error-handler.d.ts.map +1 -0
  110. package/dist/utils/error-handler.js +58 -0
  111. package/dist/utils/error-handler.js.map +1 -0
  112. package/package.json +90 -0
@@ -0,0 +1,201 @@
1
+ import axios from 'axios';
2
+ export class ApiClient {
3
+ axiosInstance;
4
+ session;
5
+ constructor(session) {
6
+ this.session = session;
7
+ this.axiosInstance = axios.create({
8
+ timeout: 30000,
9
+ headers: {
10
+ 'Content-Type': 'application/json',
11
+ },
12
+ });
13
+ }
14
+ setSession(session) {
15
+ this.session = session;
16
+ }
17
+ getDefaultFrontendUrl() {
18
+ return process.env.TUNNELHUB_FRONTEND_URL || process.env.FRONTEND_URL || 'https://app.tunnelhub.io';
19
+ }
20
+ getDefaultApiHost() {
21
+ return process.env.TUNNELHUB_API_HOST || process.env.API_HOST || 'https://api.tunnelhub.io';
22
+ }
23
+ async getTenantPublic(tenantId) {
24
+ return this.request('GET', `/tenant-service/tenants/public/${tenantId}`, undefined, undefined, false);
25
+ }
26
+ async getCurrentUser(idToken) {
27
+ return this.request('GET', '/user-service/currentUser', undefined, {
28
+ Authorization: `Bearer ${idToken}`,
29
+ }, false);
30
+ }
31
+ async getEnvironments(session) {
32
+ return this.request('GET', '/platform-service/environments', undefined, undefined, true, session);
33
+ }
34
+ async listTenants(params) {
35
+ return this.request('GET', '/tenant-service/tenants', params);
36
+ }
37
+ async getTenant(tenantId) {
38
+ return this.request('GET', `/tenant-service/tenants/${tenantId}`);
39
+ }
40
+ async listAutomations(params) {
41
+ const normalizedParams = this.buildAutomationListParams(params);
42
+ return this.request('GET', '/integrations-service/automations', normalizedParams);
43
+ }
44
+ async getAutomation(automationId) {
45
+ return this.request('GET', `/integrations-service/automations/${automationId}`);
46
+ }
47
+ async listAutomationDeploys(automationId, params) {
48
+ return this.request('GET', `/integrations-service/automations/listDeploys/${automationId}`, params);
49
+ }
50
+ async getAutomationActionLogs(automationId, params) {
51
+ return this.request('GET', `/integrations-service/automations/actionLogs/${automationId}`, params);
52
+ }
53
+ async executeAutomation(automationId, payload) {
54
+ return this.request('POST', `/integrations-service/automations/dispatch/manual/${automationId}`, undefined, undefined, true, undefined, payload);
55
+ }
56
+ async listExecutions(params) {
57
+ const normalizedParams = this.buildExecutionRangeParams(params);
58
+ return this.request('GET', '/integrations-service/automations/monitoring', normalizedParams, this.getMonitoringHeaders());
59
+ }
60
+ async getExecutionDetails(params) {
61
+ return this.request('GET', `/integrations-service/automations/monitoring/${params.executionId}`, {
62
+ automationId: params.automationId,
63
+ period: params.executionPeriod,
64
+ }, this.getMonitoringHeaders());
65
+ }
66
+ async getExecutionTraces(params) {
67
+ const { executionId, ...query } = params;
68
+ return this.request('GET', `/integrations-service/automations/monitoring/${executionId}/traces`, query, this.getMonitoringHeaders());
69
+ }
70
+ async getExecutionLogs(params) {
71
+ const { executionId, ...query } = params;
72
+ return this.request('GET', `/integrations-service/automations/monitoring/${executionId}/executionLogs`, query, this.getMonitoringHeaders());
73
+ }
74
+ async findExecution(params) {
75
+ const pageSize = Number(params.pageSize || 100);
76
+ const maxPages = 10;
77
+ for (let current = 1; current <= maxPages; current += 1) {
78
+ const response = await this.listExecutions({
79
+ ...params,
80
+ current,
81
+ pageSize,
82
+ });
83
+ const items = this.extractListItems(response);
84
+ const match = items.find((item) => {
85
+ const itemExecutionId = item.executionId || item.uuid;
86
+ if (params.executionId &&
87
+ itemExecutionId !== params.executionId &&
88
+ !String(itemExecutionId || '').endsWith(String(params.executionId))) {
89
+ return false;
90
+ }
91
+ if (params.automationId && item.automationId !== params.automationId) {
92
+ return false;
93
+ }
94
+ return true;
95
+ });
96
+ if (match) {
97
+ return match;
98
+ }
99
+ if (items.length < pageSize) {
100
+ break;
101
+ }
102
+ }
103
+ return null;
104
+ }
105
+ async request(method, path, params, extraHeaders, requireSession = true, sessionOverride, data) {
106
+ const session = sessionOverride || this.session;
107
+ if (requireSession && !session) {
108
+ throw new Error('No active session. Use login_tunnelhub first.');
109
+ }
110
+ const headers = {
111
+ ...(extraHeaders || {}),
112
+ };
113
+ if (session) {
114
+ headers.Authorization ||= `Bearer ${session.tokens.idToken}`;
115
+ headers.EnvironmentId ||= session.environmentId;
116
+ }
117
+ const response = await this.axiosInstance.request({
118
+ method,
119
+ baseURL: session?.apiHost || this.getDefaultApiHost(),
120
+ url: path,
121
+ headers,
122
+ params: this.normalizeParams(params),
123
+ data,
124
+ });
125
+ return response.data;
126
+ }
127
+ normalizeParams(params) {
128
+ if (!params) {
129
+ return undefined;
130
+ }
131
+ const normalized = {};
132
+ for (const [key, value] of Object.entries(params)) {
133
+ if (value === undefined || value === null || value === '') {
134
+ continue;
135
+ }
136
+ if (typeof value === 'object' && !Array.isArray(value)) {
137
+ normalized[key] = JSON.stringify(value);
138
+ continue;
139
+ }
140
+ normalized[key] = value;
141
+ }
142
+ return normalized;
143
+ }
144
+ getMonitoringHeaders() {
145
+ return {
146
+ UserTimeZone: this.session?.user.timezone || 'America/Sao_Paulo',
147
+ };
148
+ }
149
+ buildAutomationListParams(params) {
150
+ const filter = {};
151
+ if (params?.status) {
152
+ filter.status = [params.status];
153
+ }
154
+ return {
155
+ current: Number(params?.current || 1),
156
+ pageSize: Number(params?.pageSize || 20),
157
+ sorter: { name: 'ascend' },
158
+ filter,
159
+ name: params?.name,
160
+ };
161
+ }
162
+ buildExecutionRangeParams(params) {
163
+ const filter = {};
164
+ if (params.automationId) {
165
+ filter.automationId = [params.automationId];
166
+ }
167
+ if (params.status) {
168
+ filter.status = [params.status];
169
+ }
170
+ return {
171
+ current: params.current || 1,
172
+ pageSize: params.pageSize || 20,
173
+ createdAt: JSON.stringify([
174
+ this.normalizeDateBoundary(params.startDate, 'start'),
175
+ this.normalizeDateBoundary(params.endDate, 'end'),
176
+ ]),
177
+ hideEmptySuccess: params.hideEmptySuccess ?? true,
178
+ sorter: { createdAt: 'descending' },
179
+ filter,
180
+ };
181
+ }
182
+ normalizeDateBoundary(value, kind) {
183
+ if (value.includes(' ')) {
184
+ return value;
185
+ }
186
+ return `${value} ${kind === 'start' ? '00:00:00' : '23:59:59'}`;
187
+ }
188
+ extractListItems(response) {
189
+ if (Array.isArray(response)) {
190
+ return response;
191
+ }
192
+ if (response && typeof response === 'object') {
193
+ const maybeData = response.data;
194
+ if (Array.isArray(maybeData)) {
195
+ return maybeData;
196
+ }
197
+ }
198
+ return [];
199
+ }
200
+ }
201
+ //# sourceMappingURL=api-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/utils/api-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { ToolContext } from '../types/mcp.js';
2
+ export declare class MCPError extends Error {
3
+ code?: string | undefined;
4
+ details?: unknown | undefined;
5
+ constructor(message: string, code?: string | undefined, details?: unknown | undefined);
6
+ }
7
+ export declare function formatError(error: unknown): MCPError;
8
+ export declare function textResult(text: string, structuredContent?: unknown): {
9
+ content: Array<{
10
+ type: 'text';
11
+ text: string;
12
+ }>;
13
+ structuredContent?: Record<string, unknown>;
14
+ };
15
+ export declare function errorResult(error: unknown): {
16
+ content: Array<{
17
+ type: 'text';
18
+ text: string;
19
+ }>;
20
+ isError: true;
21
+ structuredContent: {
22
+ error: string;
23
+ code?: string;
24
+ details?: unknown;
25
+ };
26
+ };
27
+ export declare function requireSession(context: ToolContext): Promise<import("../types/mcp.js").Session>;
28
+ //# sourceMappingURL=error-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-handler.d.ts","sourceRoot":"","sources":["../../src/utils/error-handler.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,qBAAa,QAAS,SAAQ,KAAK;IAGxB,IAAI,CAAC,EAAE,MAAM;IACb,OAAO,CAAC,EAAE,OAAO;gBAFxB,OAAO,EAAE,MAAM,EACR,IAAI,CAAC,EAAE,MAAM,YAAA,EACb,OAAO,CAAC,EAAE,OAAO,YAAA;CAK3B;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,QAAQ,CAmBpD;AAkBD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,OAAO,GAAG;IACrE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC7C,CAKA;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG;IAC3C,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,EAAE,IAAI,CAAC;IACd,iBAAiB,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CACxE,CAYA;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,WAAW,8CAGxD"}
@@ -0,0 +1,58 @@
1
+ import axios from 'axios';
2
+ export class MCPError extends Error {
3
+ code;
4
+ details;
5
+ constructor(message, code, details) {
6
+ super(message);
7
+ this.code = code;
8
+ this.details = details;
9
+ this.name = 'MCPError';
10
+ }
11
+ }
12
+ export function formatError(error) {
13
+ if (error instanceof MCPError) {
14
+ return error;
15
+ }
16
+ if (axios.isAxiosError(error)) {
17
+ const data = error.response?.data;
18
+ return new MCPError(data?.message || data?.error || error.message, String(error.response?.status || 'HTTP_ERROR'), data);
19
+ }
20
+ if (error instanceof Error) {
21
+ return new MCPError(error.message);
22
+ }
23
+ return new MCPError('Unknown error');
24
+ }
25
+ function normalizeStructuredContent(structuredContent) {
26
+ if (structuredContent === undefined) {
27
+ return undefined;
28
+ }
29
+ if (typeof structuredContent === 'object' &&
30
+ structuredContent !== null &&
31
+ !Array.isArray(structuredContent)) {
32
+ return structuredContent;
33
+ }
34
+ return { result: structuredContent };
35
+ }
36
+ export function textResult(text, structuredContent) {
37
+ return {
38
+ content: [{ type: 'text', text }],
39
+ structuredContent: normalizeStructuredContent(structuredContent),
40
+ };
41
+ }
42
+ export function errorResult(error) {
43
+ const formatted = formatError(error);
44
+ return {
45
+ content: [{ type: 'text', text: `Error: ${formatted.message}` }],
46
+ isError: true,
47
+ structuredContent: {
48
+ error: formatted.message,
49
+ code: formatted.code,
50
+ details: formatted.details,
51
+ },
52
+ };
53
+ }
54
+ export async function requireSession(context) {
55
+ const session = await context.getSession();
56
+ return session;
57
+ }
58
+ //# sourceMappingURL=error-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../src/utils/error-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,MAAM,OAAO,QAAS,SAAQ,KAAK;IAGxB;IACA;IAHT,YACE,OAAe,EACR,IAAa,EACb,OAAiB;QAExB,KAAK,CAAC,OAAO,CAAC,CAAC;QAHR,SAAI,GAAJ,IAAI,CAAS;QACb,YAAO,GAAP,OAAO,CAAU;QAGxB,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAED,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,EAAE,IAAoC,CAAC;QAClE,OAAO,IAAI,QAAQ,CACjB,IAAI,EAAE,OAAO,IAAI,IAAI,EAAE,KAAK,IAAI,KAAK,CAAC,OAAO,EAC7C,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,IAAI,YAAY,CAAC,EAC9C,IAAI,CACL,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,IAAI,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,OAAO,IAAI,QAAQ,CAAC,eAAe,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,0BAA0B,CAAC,iBAA2B;IAC7D,IAAI,iBAAiB,KAAK,SAAS,EAAE,CAAC;QACpC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IACE,OAAO,iBAAiB,KAAK,QAAQ;QACrC,iBAAiB,KAAK,IAAI;QAC1B,CAAC,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC,EACjC,CAAC;QACD,OAAO,iBAA4C,CAAC;IACtD,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,iBAA2B;IAIlE,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QACjC,iBAAiB,EAAE,0BAA0B,CAAC,iBAAiB,CAAC;KACjE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAc;IAKxC,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAErC,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;QAChE,OAAO,EAAE,IAAI;QACb,iBAAiB,EAAE;YACjB,KAAK,EAAE,SAAS,CAAC,OAAO;YACxB,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,OAAO,EAAE,SAAS,CAAC,OAAO;SAC3B;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAoB;IACvD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;IAC3C,OAAO,OAAO,CAAC;AACjB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,90 @@
1
+ {
2
+ "name": "@tunnelhub/mcp",
3
+ "version": "1.0.0",
4
+ "description": "MCP server for TunnelHub automations and monitoring",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "import": "./dist/index.js",
11
+ "default": "./dist/index.js"
12
+ }
13
+ },
14
+ "bin": {
15
+ "tunnelhub-mcp": "dist/index.js"
16
+ },
17
+ "type": "module",
18
+ "scripts": {
19
+ "clean": "rm -rf dist",
20
+ "dev": "tsx watch src/index.ts",
21
+ "build": "pnpm run clean && tsc",
22
+ "start": "node dist/index.js",
23
+ "test": "jest --passWithNoTests",
24
+ "lint": "eslint src --ext .ts",
25
+ "typecheck": "tsc --noEmit",
26
+ "check": "pnpm run lint && pnpm run typecheck && pnpm run test && pnpm run build",
27
+ "prepack": "pnpm run check",
28
+ "prepublishOnly": "pnpm run check",
29
+ "pack:check": "npm pack --dry-run",
30
+ "publish:dry-run": "npm publish --dry-run --access public",
31
+ "release:patch": "npm version patch",
32
+ "release:minor": "npm version minor",
33
+ "release:major": "npm version major"
34
+ },
35
+ "files": [
36
+ "dist/**/*",
37
+ "README.md",
38
+ "LICENSE",
39
+ "CONTRIBUTING.md"
40
+ ],
41
+ "keywords": [
42
+ "mcp",
43
+ "tunnelhub",
44
+ "model-context-protocol",
45
+ "automation",
46
+ "monitoring",
47
+ "observability"
48
+ ],
49
+ "author": "TunnelHub",
50
+ "license": "MIT",
51
+ "repository": {
52
+ "type": "git",
53
+ "url": "git+https://github.com/tunnelhub/mcp.git"
54
+ },
55
+ "homepage": "https://github.com/tunnelhub/mcp#readme",
56
+ "bugs": {
57
+ "url": "https://github.com/tunnelhub/mcp/issues"
58
+ },
59
+ "publishConfig": {
60
+ "access": "public"
61
+ },
62
+ "dependencies": {
63
+ "@modelcontextprotocol/sdk": "^1.0.4",
64
+ "@aws-sdk/client-cognito-identity-provider": "^3.693.0",
65
+ "axios": "^1.7.9",
66
+ "chalk": "^5.3.0",
67
+ "configstore": "^7.0.0",
68
+ "express": "^4.21.2",
69
+ "open": "^10.1.0",
70
+ "uuid": "^11.0.5",
71
+ "zod": "^3.24.1"
72
+ },
73
+ "devDependencies": {
74
+ "@types/configstore": "^6.0.2",
75
+ "@types/express": "^5.0.0",
76
+ "@types/node": "^22.10.5",
77
+ "@types/uuid": "^10.0.0",
78
+ "@typescript-eslint/eslint-plugin": "^8.20.0",
79
+ "@typescript-eslint/parser": "^8.20.0",
80
+ "eslint": "^8.57.1",
81
+ "jest": "^29.7.0",
82
+ "ts-jest": "^29.2.5",
83
+ "tsx": "^4.19.2",
84
+ "typescript": "^5.7.3"
85
+ },
86
+ "engines": {
87
+ "node": ">=22.0.0"
88
+ },
89
+ "packageManager": "pnpm@10.8.1"
90
+ }