@mgsoftwarebv/mcp-server-bridge 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.
package/README.md ADDED
@@ -0,0 +1,154 @@
1
+ # @mgsoftwarebv/mcp-server-bridge
2
+
3
+ Een MCP Server bridge die **Cursor** verbindt met de **MG Tickets HTTP MCP Server**. Deze bridge implementeert het stdio MCP protocol en communiceert met jouw Supabase Edge Function MCP server.
4
+
5
+ ## 📦 Installatie
6
+
7
+ ```bash
8
+ npm install -g @mgsoftwarebv/mcp-server-bridge
9
+ ```
10
+
11
+ ## 🔧 Cursor Configuratie
12
+
13
+ Voeg het volgende toe aan je `~/.cursor/mcp.json`:
14
+
15
+ ```json
16
+ {
17
+ "mcpServers": {
18
+ "mg-tickets-v2": {
19
+ "command": "npx",
20
+ "args": [
21
+ "-y",
22
+ "@mgsoftwarebv/mcp-server-bridge@latest",
23
+ "--api-key=mid_your_api_key_here"
24
+ ],
25
+ "env": {
26
+ "MG_TICKETS_BASE_URL": "https://cvjdbczxyczjnatuolsk.supabase.co/functions/v1/mcp-server"
27
+ }
28
+ }
29
+ }
30
+ }
31
+ ```
32
+
33
+ ### 🔑 API Key Krijgen
34
+
35
+ 1. Ga naar je MG Tickets dashboard: `http://localhost:3001/settings/developer`
36
+ 2. Maak een nieuwe API key aan
37
+ 3. Kopieer de key (formaat: `mid_...`)
38
+ 4. Gebruik deze in je configuratie
39
+
40
+ ## 📋 Command-Line Opties
41
+
42
+ ```bash
43
+ # Basis gebruik
44
+ mg-tickets-mcp --api-key=mid_your_key_here
45
+
46
+ # Met custom base URL
47
+ mg-tickets-mcp --api-key=mid_your_key_here --base-url=https://your-custom-domain.com/functions/v1/mcp-server
48
+
49
+ # Via environment variables
50
+ export MG_TICKETS_API_KEY=mid_your_key_here
51
+ export MG_TICKETS_BASE_URL=https://cvjdbczxyczjnatuolsk.supabase.co/functions/v1/mcp-server
52
+ mg-tickets-mcp
53
+ ```
54
+
55
+ ## 🛠️ Beschikbare Tools
56
+
57
+ De bridge geeft toegang tot alle tools van je MCP server:
58
+
59
+ - **get-tickets** - Haal tickets op met filters
60
+ - **get-ticket-by-id** - Haal een specifieke ticket op
61
+ - **create-ticket** - Maak een nieuwe ticket aan
62
+ - **get-customers** - Haal customers op
63
+ - **get-customer-by-id** - Haal een specifieke customer op
64
+ - **create-customer** - Maak een nieuwe customer aan
65
+ - **get-projects** - Haal projects op
66
+ - **get-project-by-id** - Haal een specifiek project op
67
+ - **create-project** - Maak een nieuw project aan
68
+
69
+ ## 📚 Beschikbare Resources
70
+
71
+ - **tickets://recent** - Recente tickets across alle teams
72
+ - **customers://all** - Alle customers
73
+ - **projects://active** - Actieve projects
74
+
75
+ ## 🔍 Debugging
76
+
77
+ De bridge server logt naar stderr, zodat je debug informatie kunt zien:
78
+
79
+ ```bash
80
+ # Run met debug output
81
+ mg-tickets-mcp --api-key=mid_your_key_here 2>debug.log
82
+ ```
83
+
84
+ Debug output toont:
85
+ - Verbindingsstatus met HTTP server
86
+ - Tool uitvoering details
87
+ - Authenticatie informatie
88
+ - Error details
89
+
90
+ ## 🏗️ Development
91
+
92
+ ```bash
93
+ # Clone het project
94
+ git clone https://github.com/mgsoftwarebv/tickets-v2.git
95
+ cd tickets-v2/packages/mcp-server-bridge
96
+
97
+ # Installeer dependencies
98
+ bun install
99
+
100
+ # Build
101
+ bun run build
102
+
103
+ # Test lokaal
104
+ node dist/index.js --api-key=mid_your_key_here
105
+ ```
106
+
107
+ ## 🔄 Updates
108
+
109
+ ```bash
110
+ # Update naar nieuwste versie
111
+ npm update -g @mgsoftwarebv/mcp-server-bridge
112
+
113
+ # Of via npx (geen installatie vereist)
114
+ npx @mgsoftwarebv/mcp-server-bridge@latest --api-key=mid_your_key_here
115
+ ```
116
+
117
+ ## 🆘 Troubleshooting
118
+
119
+ ### ❌ "API key is required"
120
+ - Zorg dat je `--api-key=` meegeeft of `MG_TICKETS_API_KEY` environment variable hebt ingesteld
121
+ - Controleer dat je API key het juiste formaat heeft: `mid_...`
122
+
123
+ ### ❌ "Failed to connect to HTTP server"
124
+ - Controleer dat je MCP server draait op de juiste URL
125
+ - Test je API key via browser of curl
126
+ - Controleer firewall/netwerk instellingen
127
+
128
+ ### ❌ "Invalid API key"
129
+ - Maak een nieuwe API key aan in je developer settings
130
+ - Zorg dat de key toegang heeft tot de juiste scopes
131
+
132
+ ### 🔧 Debug Mode
133
+ ```bash
134
+ # Voeg debug output toe aan je mcp.json
135
+ {
136
+ "mcpServers": {
137
+ "mg-tickets-v2": {
138
+ "command": "npx",
139
+ "args": [
140
+ "-y",
141
+ "@mgsoftwarebv/mcp-server-bridge@latest",
142
+ "--api-key=mid_your_key_here"
143
+ ],
144
+ "env": {
145
+ "NODE_ENV": "development"
146
+ }
147
+ }
148
+ }
149
+ }
150
+ ```
151
+
152
+ ## 📄 License
153
+
154
+ MIT © MG Software B.V.
@@ -0,0 +1 @@
1
+ #!/usr/bin/env node
package/dist/index.js ADDED
@@ -0,0 +1,164 @@
1
+ #!/usr/bin/env node
2
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
3
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
4
+ import { ListToolsRequestSchema, CallToolRequestSchema, ListResourcesRequestSchema, ReadResourceRequestSchema } from '@modelcontextprotocol/sdk/types.js';
5
+ import { MGTicketsMCPClient } from '@mgsoftwarebv/mcp-client';
6
+
7
+ var args = process.argv.slice(2);
8
+ var apiKey = args.find((arg) => arg.startsWith("--api-key="))?.split("=")[1] || process.env.MG_TICKETS_API_KEY;
9
+ var baseUrl = args.find((arg) => arg.startsWith("--base-url="))?.split("=")[1] || process.env.MG_TICKETS_BASE_URL || "https://cvjdbczxyczjnatuolsk.supabase.co/functions/v1/mcp-server";
10
+ if (!apiKey) {
11
+ console.error("\u274C API key is required. Use --api-key=your_key or set MG_TICKETS_API_KEY environment variable");
12
+ process.exit(1);
13
+ }
14
+ var client = new MGTicketsMCPClient({
15
+ baseUrl,
16
+ apiKey,
17
+ timeout: 3e4
18
+ });
19
+ var server = new Server(
20
+ {
21
+ name: "mg-tickets-mcp-bridge",
22
+ version: "1.0.0"
23
+ },
24
+ {
25
+ capabilities: {
26
+ tools: {},
27
+ resources: {}
28
+ }
29
+ }
30
+ );
31
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
32
+ try {
33
+ const result = await client.listTools();
34
+ if (!result.success || !result.data) {
35
+ throw new Error(result.error || "Failed to list tools");
36
+ }
37
+ return {
38
+ tools: result.data.tools.map((tool) => ({
39
+ name: tool.name,
40
+ description: tool.description,
41
+ inputSchema: tool.inputSchema
42
+ }))
43
+ };
44
+ } catch (error) {
45
+ console.error("Error listing tools:", error);
46
+ return { tools: [] };
47
+ }
48
+ });
49
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
50
+ try {
51
+ const { name, arguments: args2 } = request.params;
52
+ console.error(`\u{1F6E0}\uFE0F Executing tool: ${name}`);
53
+ console.error(`\u{1F4DD} Arguments:`, JSON.stringify(args2, null, 2));
54
+ const result = await client.executeTool(name, args2);
55
+ if (!result.success) {
56
+ throw new Error(result.error || "Tool execution failed");
57
+ }
58
+ console.error(`\u2705 Tool executed successfully`);
59
+ return {
60
+ content: [
61
+ {
62
+ type: "text",
63
+ text: JSON.stringify(result.data || result, null, 2)
64
+ }
65
+ ]
66
+ };
67
+ } catch (error) {
68
+ console.error(`\u274C Tool execution error:`, error);
69
+ return {
70
+ content: [
71
+ {
72
+ type: "text",
73
+ text: `Error: ${error instanceof Error ? error.message : "Unknown error"}`
74
+ }
75
+ ]
76
+ };
77
+ }
78
+ });
79
+ server.setRequestHandler(ListResourcesRequestSchema, async () => {
80
+ try {
81
+ const result = await client.listResources();
82
+ if (!result.success || !result.data) {
83
+ throw new Error(result.error || "Failed to list resources");
84
+ }
85
+ return {
86
+ resources: result.data.resources.map((resource) => ({
87
+ uri: resource.uri,
88
+ name: resource.name,
89
+ description: resource.description,
90
+ mimeType: resource.mimeType
91
+ }))
92
+ };
93
+ } catch (error) {
94
+ console.error("Error listing resources:", error);
95
+ return { resources: [] };
96
+ }
97
+ });
98
+ server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
99
+ try {
100
+ const { uri } = request.params;
101
+ console.error(`\u{1F4DA} Reading resource: ${uri}`);
102
+ const result = await client.getResource(uri);
103
+ if (!result.success) {
104
+ throw new Error(result.error || "Resource read failed");
105
+ }
106
+ console.error(`\u2705 Resource read successfully`);
107
+ return {
108
+ contents: [
109
+ {
110
+ uri,
111
+ mimeType: "application/json",
112
+ text: JSON.stringify(result.data, null, 2)
113
+ }
114
+ ]
115
+ };
116
+ } catch (error) {
117
+ console.error(`\u274C Resource read error:`, error);
118
+ return {
119
+ contents: [
120
+ {
121
+ uri: request.params.uri,
122
+ mimeType: "text/plain",
123
+ text: `Error: ${error instanceof Error ? error.message : "Unknown error"}`
124
+ }
125
+ ]
126
+ };
127
+ }
128
+ });
129
+ async function main() {
130
+ console.error("\u{1F680} Starting MG Tickets MCP Bridge Server...");
131
+ console.error(`\u{1F517} Base URL: ${baseUrl}`);
132
+ console.error(`\u{1F511} API Key: ${apiKey?.substring(0, 10)}...`);
133
+ try {
134
+ const serverInfo = await client.getServerInfo();
135
+ if (serverInfo.success && serverInfo.data) {
136
+ console.error(`\u2705 Connected to MCP server: ${serverInfo.data.name} v${serverInfo.data.version}`);
137
+ if (serverInfo.data.authenticated) {
138
+ console.error(`\u{1F464} Authenticated as user: ${serverInfo.data.user?.userId}`);
139
+ console.error(`\u{1F3E2} Team: ${serverInfo.data.user?.teamId}`);
140
+ }
141
+ } else {
142
+ console.error(`\u26A0\uFE0F Server connection warning: ${serverInfo.error}`);
143
+ }
144
+ } catch (error) {
145
+ console.error(`\u274C Failed to connect to HTTP server: ${error}`);
146
+ }
147
+ const transport = new StdioServerTransport();
148
+ console.error("\u{1F4E1} MCP Bridge Server ready for connections");
149
+ await server.connect(transport);
150
+ }
151
+ process.on("SIGINT", async () => {
152
+ console.error("\u{1F44B} Shutting down MCP Bridge Server...");
153
+ process.exit(0);
154
+ });
155
+ process.on("SIGTERM", async () => {
156
+ console.error("\u{1F44B} Shutting down MCP Bridge Server...");
157
+ process.exit(0);
158
+ });
159
+ main().catch((error) => {
160
+ console.error("\u{1F4A5} Fatal error:", error);
161
+ process.exit(1);
162
+ });
163
+ //# sourceMappingURL=index.js.map
164
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts"],"names":["args"],"mappings":"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","file":"index.js","sourcesContent":["#!/usr/bin/env node\r\n\r\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\r\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\r\nimport { CallToolRequestSchema, ListToolsRequestSchema, ListResourcesRequestSchema, ReadResourceRequestSchema } from '@modelcontextprotocol/sdk/types.js';\r\nimport { MGTicketsMCPClient } from '@mgsoftwarebv/mcp-client';\r\n\r\n// Parse command line arguments\r\nconst args = process.argv.slice(2);\r\nconst apiKey = args.find(arg => arg.startsWith('--api-key='))?.split('=')[1] || process.env.MG_TICKETS_API_KEY;\r\nconst baseUrl = args.find(arg => arg.startsWith('--base-url='))?.split('=')[1] || process.env.MG_TICKETS_BASE_URL || 'https://cvjdbczxyczjnatuolsk.supabase.co/functions/v1/mcp-server';\r\n\r\nif (!apiKey) {\r\n console.error('❌ API key is required. Use --api-key=your_key or set MG_TICKETS_API_KEY environment variable');\r\n process.exit(1);\r\n}\r\n\r\n// Initialize the MG Tickets client\r\nconst client = new MGTicketsMCPClient({\r\n baseUrl,\r\n apiKey,\r\n timeout: 30000,\r\n});\r\n\r\n// Create MCP server\r\nconst server = new Server(\r\n {\r\n name: 'mg-tickets-mcp-bridge',\r\n version: '1.0.0',\r\n },\r\n {\r\n capabilities: {\r\n tools: {},\r\n resources: {},\r\n },\r\n }\r\n);\r\n\r\n// List tools handler - proxy to HTTP server\r\nserver.setRequestHandler(ListToolsRequestSchema, async () => {\r\n try {\r\n const result = await client.listTools();\r\n if (!result.success || !result.data) {\r\n throw new Error(result.error || 'Failed to list tools');\r\n }\r\n \r\n return {\r\n tools: result.data.tools.map(tool => ({\r\n name: tool.name,\r\n description: tool.description,\r\n inputSchema: tool.inputSchema,\r\n })),\r\n };\r\n } catch (error) {\r\n console.error('Error listing tools:', error);\r\n return { tools: [] };\r\n }\r\n});\r\n\r\n// Call tool handler - proxy to HTTP server\r\nserver.setRequestHandler(CallToolRequestSchema, async (request) => {\r\n try {\r\n const { name, arguments: args } = request.params;\r\n \r\n console.error(`🛠️ Executing tool: ${name}`);\r\n console.error(`📝 Arguments:`, JSON.stringify(args, null, 2));\r\n \r\n const result = await client.executeTool(name, args);\r\n \r\n if (!result.success) {\r\n throw new Error(result.error || 'Tool execution failed');\r\n }\r\n \r\n console.error(`✅ Tool executed successfully`);\r\n \r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: JSON.stringify(result.data || result, null, 2),\r\n },\r\n ],\r\n };\r\n } catch (error) {\r\n console.error(`❌ Tool execution error:`, error);\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\r\n },\r\n ],\r\n };\r\n }\r\n});\r\n\r\n// List resources handler - proxy to HTTP server\r\nserver.setRequestHandler(ListResourcesRequestSchema, async () => {\r\n try {\r\n const result = await client.listResources();\r\n if (!result.success || !result.data) {\r\n throw new Error(result.error || 'Failed to list resources');\r\n }\r\n \r\n return {\r\n resources: result.data.resources.map(resource => ({\r\n uri: resource.uri,\r\n name: resource.name,\r\n description: resource.description,\r\n mimeType: resource.mimeType,\r\n })),\r\n };\r\n } catch (error) {\r\n console.error('Error listing resources:', error);\r\n return { resources: [] };\r\n }\r\n});\r\n\r\n// Read resource handler - proxy to HTTP server\r\nserver.setRequestHandler(ReadResourceRequestSchema, async (request) => {\r\n try {\r\n const { uri } = request.params;\r\n \r\n console.error(`📚 Reading resource: ${uri}`);\r\n \r\n const result = await client.getResource(uri);\r\n \r\n if (!result.success) {\r\n throw new Error(result.error || 'Resource read failed');\r\n }\r\n \r\n console.error(`✅ Resource read successfully`);\r\n \r\n return {\r\n contents: [\r\n {\r\n uri,\r\n mimeType: 'application/json',\r\n text: JSON.stringify(result.data, null, 2),\r\n },\r\n ],\r\n };\r\n } catch (error) {\r\n console.error(`❌ Resource read error:`, error);\r\n return {\r\n contents: [\r\n {\r\n uri: request.params.uri,\r\n mimeType: 'text/plain',\r\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\r\n },\r\n ],\r\n };\r\n }\r\n});\r\n\r\n// Start the server\r\nasync function main() {\r\n console.error('🚀 Starting MG Tickets MCP Bridge Server...');\r\n console.error(`🔗 Base URL: ${baseUrl}`);\r\n console.error(`🔑 API Key: ${apiKey?.substring(0, 10)}...`);\r\n \r\n // Test connection to HTTP server\r\n try {\r\n const serverInfo = await client.getServerInfo();\r\n if (serverInfo.success && serverInfo.data) {\r\n console.error(`✅ Connected to MCP server: ${serverInfo.data.name} v${serverInfo.data.version}`);\r\n if ((serverInfo.data as any).authenticated) {\r\n console.error(`👤 Authenticated as user: ${(serverInfo.data as any).user?.userId}`);\r\n console.error(`🏢 Team: ${(serverInfo.data as any).user?.teamId}`);\r\n }\r\n } else {\r\n console.error(`⚠️ Server connection warning: ${serverInfo.error}`);\r\n }\r\n } catch (error) {\r\n console.error(`❌ Failed to connect to HTTP server: ${error}`);\r\n }\r\n \r\n const transport = new StdioServerTransport();\r\n console.error('📡 MCP Bridge Server ready for connections');\r\n \r\n await server.connect(transport);\r\n}\r\n\r\n// Handle graceful shutdown\r\nprocess.on('SIGINT', async () => {\r\n console.error('👋 Shutting down MCP Bridge Server...');\r\n process.exit(0);\r\n});\r\n\r\nprocess.on('SIGTERM', async () => {\r\n console.error('👋 Shutting down MCP Bridge Server...');\r\n process.exit(0);\r\n});\r\n\r\n// Start the server\r\nmain().catch((error) => {\r\n console.error('💥 Fatal error:', error);\r\n process.exit(1);\r\n});\r\n"]}
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "@mgsoftwarebv/mcp-server-bridge",
3
+ "version": "1.0.0",
4
+ "description": "MCP Server bridge for MG Tickets - connects Cursor to HTTP MCP server",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "mg-tickets-mcp": "dist/index.js"
9
+ },
10
+ "scripts": {
11
+ "build": "tsup",
12
+ "dev": "tsup --watch",
13
+ "start": "node dist/index.js",
14
+ "typecheck": "tsc --noEmit"
15
+ },
16
+ "keywords": [
17
+ "mcp",
18
+ "tickets",
19
+ "bridge",
20
+ "cursor",
21
+ "mg-software"
22
+ ],
23
+ "author": "MG Software B.V.",
24
+ "license": "MIT",
25
+ "dependencies": {
26
+ "@mgsoftwarebv/mcp-client": "^1.0.0",
27
+ "@modelcontextprotocol/sdk": "^1.0.4"
28
+ },
29
+ "devDependencies": {
30
+ "@types/node": "^20.0.0",
31
+ "tsup": "^8.0.0",
32
+ "typescript": "^5.0.0"
33
+ },
34
+ "files": [
35
+ "dist",
36
+ "README.md"
37
+ ],
38
+ "repository": {
39
+ "type": "git",
40
+ "url": "git+https://github.com/mgsoftwarebv/tickets-v2.git"
41
+ },
42
+ "publishConfig": {
43
+ "access": "public",
44
+ "registry": "https://registry.npmjs.org/"
45
+ }
46
+ }