@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 +154 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +164 -0
- package/dist/index.js.map +1 -0
- package/package.json +46 -0
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.
|
package/dist/index.d.ts
ADDED
|
@@ -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
|
+
}
|