@promptpartner/bexio-mcp-server 2.0.0 → 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/LICENSE +21 -21
- package/README.md +165 -161
- package/dist/tools/payroll/handlers.js +13 -13
- package/dist/ui/contact-card/mcp-app.js +61 -61
- package/dist/ui/dashboard/mcp-app.js +54 -54
- package/dist/ui/invoice-preview/mcp-app.js +52 -52
- package/package.json +78 -78
package/LICENSE
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2024 Bexio MCP Contributors
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 Bexio MCP Contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,161 +1,165 @@
|
|
|
1
|
-
# @promptpartner/bexio-mcp-server
|
|
2
|
-
|
|
3
|
-
Complete Swiss accounting integration for [Bexio](https://www.bexio.com/) with [Claude Desktop](https://claude.com/desktop). Manage invoices, contacts, projects, time tracking, and 200+ more tools through natural conversation.
|
|
4
|
-
|
|
5
|
-
## Quick Start
|
|
6
|
-
|
|
7
|
-
### Option 1: MCPB Bundle (Recommended)
|
|
8
|
-
|
|
9
|
-
1. Download `bexio-mcp-server.mcpb` from [Releases](https://github.com/promptpartner/bexio-mcp-server/releases)
|
|
10
|
-
2. Double-click to install in Claude Desktop
|
|
11
|
-
3. Enter your Bexio API token when prompted
|
|
12
|
-
|
|
13
|
-
### Option 2: npm
|
|
14
|
-
|
|
15
|
-
```bash
|
|
16
|
-
npx @promptpartner/bexio-mcp-server
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
Add to Claude Desktop config:
|
|
20
|
-
|
|
21
|
-
**macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json`
|
|
22
|
-
**Windows:** `%APPDATA%\Claude\claude_desktop_config.json`
|
|
23
|
-
|
|
24
|
-
```json
|
|
25
|
-
{
|
|
26
|
-
"mcpServers": {
|
|
27
|
-
"bexio": {
|
|
28
|
-
"command": "npx",
|
|
29
|
-
"args": ["@promptpartner/bexio-mcp-server"],
|
|
30
|
-
"env": {
|
|
31
|
-
"BEXIO_API_TOKEN": "your-token-here"
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
### Option 3: From Source
|
|
39
|
-
|
|
40
|
-
```bash
|
|
41
|
-
git clone https://github.com/promptpartner/bexio-mcp-server
|
|
42
|
-
cd bexio-mcp-server/src
|
|
43
|
-
npm install
|
|
44
|
-
npm run build
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
Add to Claude Desktop config:
|
|
48
|
-
|
|
49
|
-
```json
|
|
50
|
-
{
|
|
51
|
-
"mcpServers": {
|
|
52
|
-
"bexio": {
|
|
53
|
-
"command": "node",
|
|
54
|
-
"args": ["/path/to/bexio-mcp-server/src/dist/index.js"],
|
|
55
|
-
"env": {
|
|
56
|
-
"BEXIO_API_TOKEN": "your-token-here"
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
## Getting Your Bexio API Token
|
|
64
|
-
|
|
65
|
-
1. Log in to [Bexio](https://office.bexio.com/)
|
|
66
|
-
2. Go to **Settings** > **API Tokens**
|
|
67
|
-
3. Click **Create Token**
|
|
68
|
-
4. Copy the token and use it in your configuration
|
|
69
|
-
|
|
70
|
-
## Features
|
|
71
|
-
|
|
72
|
-
This MCP server provides **221 tools** across all Bexio domains:
|
|
73
|
-
|
|
74
|
-
### Contacts & CRM
|
|
75
|
-
- Create, update, search contacts
|
|
76
|
-
- Contact groups, sectors, salutations, titles
|
|
77
|
-
- Contact relations management
|
|
78
|
-
|
|
79
|
-
### Invoices & Sales
|
|
80
|
-
- Full invoice lifecycle (create, issue, send, cancel)
|
|
81
|
-
- Quotes with accept/decline workflows
|
|
82
|
-
- Orders with delivery management
|
|
83
|
-
- Incoming payments tracking
|
|
84
|
-
- Interactive invoice preview
|
|
85
|
-
|
|
86
|
-
### Banking & Payments
|
|
87
|
-
- Swiss QR-bill payment support (QR-IBAN)
|
|
88
|
-
- Standard IBAN payments (ISO 20022)
|
|
89
|
-
- Currency management (CHF, EUR)
|
|
90
|
-
- Bank account management
|
|
91
|
-
|
|
92
|
-
### Projects & Time Tracking
|
|
93
|
-
- Project management with types and statuses
|
|
94
|
-
- Milestones and work packages
|
|
95
|
-
- Timesheet entries with duration tracking
|
|
96
|
-
- Business activities and communication types
|
|
97
|
-
|
|
98
|
-
### Accounting
|
|
99
|
-
- Chart of accounts
|
|
100
|
-
- Manual journal entries
|
|
101
|
-
- Business years and VAT periods
|
|
102
|
-
- Account groups
|
|
103
|
-
|
|
104
|
-
### Purchase & Expenses
|
|
105
|
-
- Bills (creditor invoices)
|
|
106
|
-
- Expenses and purchase orders
|
|
107
|
-
- Outgoing payments
|
|
108
|
-
|
|
109
|
-
### Files & Documents
|
|
110
|
-
- Document upload/download
|
|
111
|
-
- File management
|
|
112
|
-
|
|
113
|
-
### Payroll (requires Bexio Payroll module)
|
|
114
|
-
- Employee management
|
|
115
|
-
- Absence tracking
|
|
116
|
-
- Payroll documents
|
|
117
|
-
|
|
118
|
-
## HTTP Mode
|
|
119
|
-
|
|
120
|
-
For integration with n8n or other automation tools:
|
|
121
|
-
|
|
122
|
-
```bash
|
|
123
|
-
npx @promptpartner/bexio-mcp-server --mode http --port 8000
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
## Environment Variables
|
|
127
|
-
|
|
128
|
-
| Variable | Required | Default | Description |
|
|
129
|
-
|----------|----------|---------|-------------|
|
|
130
|
-
| `BEXIO_API_TOKEN` | Yes | - | Your Bexio API token |
|
|
131
|
-
| `BEXIO_BASE_URL` | No | `https://api.bexio.com/2.0` | API endpoint URL |
|
|
132
|
-
|
|
133
|
-
## Troubleshooting
|
|
134
|
-
|
|
135
|
-
### "Invalid API token" error
|
|
136
|
-
- Verify your token in Bexio Settings > API Tokens
|
|
137
|
-
- Ensure the token has not expired
|
|
138
|
-
- Check that the token has the required permissions
|
|
139
|
-
|
|
140
|
-
### "Connection refused" error
|
|
141
|
-
- Check your internet connection
|
|
142
|
-
- Verify BEXIO_BASE_URL is correct (default: https://api.bexio.com/2.0)
|
|
143
|
-
|
|
144
|
-
### Payroll tools return "module not available"
|
|
145
|
-
- Payroll tools require the Bexio Payroll module subscription
|
|
146
|
-
- Contact Bexio support to enable the module
|
|
147
|
-
|
|
148
|
-
### Claude Desktop doesn't see the server
|
|
149
|
-
- Restart Claude Desktop after configuration changes
|
|
150
|
-
- Verify the config file path is correct for your OS
|
|
151
|
-
- Check Claude Desktop logs for error messages
|
|
152
|
-
|
|
153
|
-
##
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
##
|
|
158
|
-
|
|
159
|
-
- [
|
|
160
|
-
|
|
161
|
-
|
|
1
|
+
# @promptpartner/bexio-mcp-server
|
|
2
|
+
|
|
3
|
+
Complete Swiss accounting integration for [Bexio](https://www.bexio.com/) with [Claude Desktop](https://claude.com/desktop). Manage invoices, contacts, projects, time tracking, and 200+ more tools through natural conversation.
|
|
4
|
+
|
|
5
|
+
## Quick Start
|
|
6
|
+
|
|
7
|
+
### Option 1: MCPB Bundle (Recommended)
|
|
8
|
+
|
|
9
|
+
1. Download `bexio-mcp-server.mcpb` from [Releases](https://github.com/promptpartner/bexio-mcp-server/releases)
|
|
10
|
+
2. Double-click to install in Claude Desktop
|
|
11
|
+
3. Enter your Bexio API token when prompted
|
|
12
|
+
|
|
13
|
+
### Option 2: npm
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npx @promptpartner/bexio-mcp-server
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Add to Claude Desktop config:
|
|
20
|
+
|
|
21
|
+
**macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json`
|
|
22
|
+
**Windows:** `%APPDATA%\Claude\claude_desktop_config.json`
|
|
23
|
+
|
|
24
|
+
```json
|
|
25
|
+
{
|
|
26
|
+
"mcpServers": {
|
|
27
|
+
"bexio": {
|
|
28
|
+
"command": "npx",
|
|
29
|
+
"args": ["@promptpartner/bexio-mcp-server"],
|
|
30
|
+
"env": {
|
|
31
|
+
"BEXIO_API_TOKEN": "your-token-here"
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### Option 3: From Source
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
git clone https://github.com/promptpartner/bexio-mcp-server
|
|
42
|
+
cd bexio-mcp-server/src
|
|
43
|
+
npm install
|
|
44
|
+
npm run build
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Add to Claude Desktop config:
|
|
48
|
+
|
|
49
|
+
```json
|
|
50
|
+
{
|
|
51
|
+
"mcpServers": {
|
|
52
|
+
"bexio": {
|
|
53
|
+
"command": "node",
|
|
54
|
+
"args": ["/path/to/bexio-mcp-server/src/dist/index.js"],
|
|
55
|
+
"env": {
|
|
56
|
+
"BEXIO_API_TOKEN": "your-token-here"
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Getting Your Bexio API Token
|
|
64
|
+
|
|
65
|
+
1. Log in to [Bexio](https://office.bexio.com/)
|
|
66
|
+
2. Go to **Settings** > **API Tokens**
|
|
67
|
+
3. Click **Create Token**
|
|
68
|
+
4. Copy the token and use it in your configuration
|
|
69
|
+
|
|
70
|
+
## Features
|
|
71
|
+
|
|
72
|
+
This MCP server provides **221 tools** across all Bexio domains:
|
|
73
|
+
|
|
74
|
+
### Contacts & CRM
|
|
75
|
+
- Create, update, search contacts
|
|
76
|
+
- Contact groups, sectors, salutations, titles
|
|
77
|
+
- Contact relations management
|
|
78
|
+
|
|
79
|
+
### Invoices & Sales
|
|
80
|
+
- Full invoice lifecycle (create, issue, send, cancel)
|
|
81
|
+
- Quotes with accept/decline workflows
|
|
82
|
+
- Orders with delivery management
|
|
83
|
+
- Incoming payments tracking
|
|
84
|
+
- Interactive invoice preview
|
|
85
|
+
|
|
86
|
+
### Banking & Payments
|
|
87
|
+
- Swiss QR-bill payment support (QR-IBAN)
|
|
88
|
+
- Standard IBAN payments (ISO 20022)
|
|
89
|
+
- Currency management (CHF, EUR)
|
|
90
|
+
- Bank account management
|
|
91
|
+
|
|
92
|
+
### Projects & Time Tracking
|
|
93
|
+
- Project management with types and statuses
|
|
94
|
+
- Milestones and work packages
|
|
95
|
+
- Timesheet entries with duration tracking
|
|
96
|
+
- Business activities and communication types
|
|
97
|
+
|
|
98
|
+
### Accounting
|
|
99
|
+
- Chart of accounts
|
|
100
|
+
- Manual journal entries
|
|
101
|
+
- Business years and VAT periods
|
|
102
|
+
- Account groups
|
|
103
|
+
|
|
104
|
+
### Purchase & Expenses
|
|
105
|
+
- Bills (creditor invoices)
|
|
106
|
+
- Expenses and purchase orders
|
|
107
|
+
- Outgoing payments
|
|
108
|
+
|
|
109
|
+
### Files & Documents
|
|
110
|
+
- Document upload/download
|
|
111
|
+
- File management
|
|
112
|
+
|
|
113
|
+
### Payroll (requires Bexio Payroll module)
|
|
114
|
+
- Employee management
|
|
115
|
+
- Absence tracking
|
|
116
|
+
- Payroll documents
|
|
117
|
+
|
|
118
|
+
## HTTP Mode
|
|
119
|
+
|
|
120
|
+
For integration with n8n or other automation tools:
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
npx @promptpartner/bexio-mcp-server --mode http --port 8000
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## Environment Variables
|
|
127
|
+
|
|
128
|
+
| Variable | Required | Default | Description |
|
|
129
|
+
|----------|----------|---------|-------------|
|
|
130
|
+
| `BEXIO_API_TOKEN` | Yes | - | Your Bexio API token |
|
|
131
|
+
| `BEXIO_BASE_URL` | No | `https://api.bexio.com/2.0` | API endpoint URL |
|
|
132
|
+
|
|
133
|
+
## Troubleshooting
|
|
134
|
+
|
|
135
|
+
### "Invalid API token" error
|
|
136
|
+
- Verify your token in Bexio Settings > API Tokens
|
|
137
|
+
- Ensure the token has not expired
|
|
138
|
+
- Check that the token has the required permissions
|
|
139
|
+
|
|
140
|
+
### "Connection refused" error
|
|
141
|
+
- Check your internet connection
|
|
142
|
+
- Verify BEXIO_BASE_URL is correct (default: https://api.bexio.com/2.0)
|
|
143
|
+
|
|
144
|
+
### Payroll tools return "module not available"
|
|
145
|
+
- Payroll tools require the Bexio Payroll module subscription
|
|
146
|
+
- Contact Bexio support to enable the module
|
|
147
|
+
|
|
148
|
+
### Claude Desktop doesn't see the server
|
|
149
|
+
- Restart Claude Desktop after configuration changes
|
|
150
|
+
- Verify the config file path is correct for your OS
|
|
151
|
+
- Check Claude Desktop logs for error messages
|
|
152
|
+
|
|
153
|
+
## Acknowledgments
|
|
154
|
+
|
|
155
|
+
This project builds upon the original Bexio MCP server created by [Sebastian Bryner](https://www.linkedin.com/in/sebastian-bryner/) of [bryner.tech](https://bryner.tech/). His v1.0 implementation provided the foundational architecture and initial 83 tools that made this expanded v2.0 possible.
|
|
156
|
+
|
|
157
|
+
## License
|
|
158
|
+
|
|
159
|
+
MIT - See [LICENSE](LICENSE) for details.
|
|
160
|
+
|
|
161
|
+
## Links
|
|
162
|
+
|
|
163
|
+
- [Bexio API Documentation](https://docs.bexio.com/)
|
|
164
|
+
- [MCP Protocol Specification](https://modelcontextprotocol.io/)
|
|
165
|
+
- [Report Issues](https://github.com/promptpartner/bexio-mcp-server/issues)
|
|
@@ -61,19 +61,19 @@ async function checkPayrollModule(client) {
|
|
|
61
61
|
* Explains what the module provides and how to enable it.
|
|
62
62
|
*/
|
|
63
63
|
function payrollUnavailableError() {
|
|
64
|
-
return new McpError("BEXIO_API_ERROR", `Payroll module is not enabled for your Bexio account.
|
|
65
|
-
|
|
66
|
-
The Payroll module provides:
|
|
67
|
-
- Employee management (work contracts, hourly rates)
|
|
68
|
-
- Absence tracking (vacation, sick leave, etc.)
|
|
69
|
-
- Payroll documents (payslips, tax statements)
|
|
70
|
-
|
|
71
|
-
To enable the Payroll module:
|
|
72
|
-
1. Go to Bexio Settings > Subscriptions
|
|
73
|
-
2. Select a plan that includes Payroll features
|
|
74
|
-
3. Contact Bexio support if you need help choosing the right plan
|
|
75
|
-
|
|
76
|
-
Note: Payroll features are typically available in Bexio Pro and Enterprise plans.
|
|
64
|
+
return new McpError("BEXIO_API_ERROR", `Payroll module is not enabled for your Bexio account.
|
|
65
|
+
|
|
66
|
+
The Payroll module provides:
|
|
67
|
+
- Employee management (work contracts, hourly rates)
|
|
68
|
+
- Absence tracking (vacation, sick leave, etc.)
|
|
69
|
+
- Payroll documents (payslips, tax statements)
|
|
70
|
+
|
|
71
|
+
To enable the Payroll module:
|
|
72
|
+
1. Go to Bexio Settings > Subscriptions
|
|
73
|
+
2. Select a plan that includes Payroll features
|
|
74
|
+
3. Contact Bexio support if you need help choosing the right plan
|
|
75
|
+
|
|
76
|
+
Note: Payroll features are typically available in Bexio Pro and Enterprise plans.
|
|
77
77
|
Visit https://www.bexio.com/en/pricing for plan details.`, { module: "payroll", available: false });
|
|
78
78
|
}
|
|
79
79
|
/**
|
|
@@ -43,66 +43,66 @@ function renderContact(contact) {
|
|
|
43
43
|
const hasContactInfo = contact.mail || contact.phone_fixed || contact.phone_mobile || contact.fax;
|
|
44
44
|
const hasAddress = addressParts.length > 0;
|
|
45
45
|
appEl.className = "card";
|
|
46
|
-
appEl.innerHTML = `
|
|
47
|
-
<div class="card-header">
|
|
48
|
-
<div class="avatar">${initials}</div>
|
|
49
|
-
<h1>${fullName}</h1>
|
|
50
|
-
${contact.url ? `<div class="company">${contact.url}</div>` : ""}
|
|
51
|
-
<span class="type-badge ${typeClass}">${typeBadge}</span>
|
|
52
|
-
</div>
|
|
53
|
-
<div class="card-body">
|
|
54
|
-
${hasContactInfo ? `
|
|
55
|
-
<div class="info-section">
|
|
56
|
-
<div class="info-label">Contact Information</div>
|
|
57
|
-
${contact.mail ? `
|
|
58
|
-
<div class="info-row">
|
|
59
|
-
<svg class="info-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
60
|
-
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"/>
|
|
61
|
-
</svg>
|
|
62
|
-
<span class="info-value"><a href="mailto:${contact.mail}">${contact.mail}</a></span>
|
|
63
|
-
</div>
|
|
64
|
-
` : ""}
|
|
65
|
-
${contact.phone_fixed ? `
|
|
66
|
-
<div class="info-row">
|
|
67
|
-
<svg class="info-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
68
|
-
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 5a2 2 0 012-2h3.28a1 1 0 01.948.684l1.498 4.493a1 1 0 01-.502 1.21l-2.257 1.13a11.042 11.042 0 005.516 5.516l1.13-2.257a1 1 0 011.21-.502l4.493 1.498a1 1 0 01.684.949V19a2 2 0 01-2 2h-1C9.716 21 3 14.284 3 6V5z"/>
|
|
69
|
-
</svg>
|
|
70
|
-
<span class="info-value"><a href="tel:${contact.phone_fixed}">${contact.phone_fixed}</a></span>
|
|
71
|
-
</div>
|
|
72
|
-
` : ""}
|
|
73
|
-
${contact.phone_mobile ? `
|
|
74
|
-
<div class="info-row">
|
|
75
|
-
<svg class="info-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
76
|
-
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 18h.01M8 21h8a2 2 0 002-2V5a2 2 0 00-2-2H8a2 2 0 00-2 2v14a2 2 0 002 2z"/>
|
|
77
|
-
</svg>
|
|
78
|
-
<span class="info-value"><a href="tel:${contact.phone_mobile}">${contact.phone_mobile}</a></span>
|
|
79
|
-
</div>
|
|
80
|
-
` : ""}
|
|
81
|
-
${contact.fax ? `
|
|
82
|
-
<div class="info-row">
|
|
83
|
-
<svg class="info-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
84
|
-
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 17h2a2 2 0 002-2v-4a2 2 0 00-2-2H5a2 2 0 00-2 2v4a2 2 0 002 2h2m2 4h6a2 2 0 002-2v-4a2 2 0 00-2-2H9a2 2 0 00-2 2v4a2 2 0 002 2zm8-12V5a2 2 0 00-2-2H9a2 2 0 00-2 2v4h10z"/>
|
|
85
|
-
</svg>
|
|
86
|
-
<span class="info-value">${contact.fax}</span>
|
|
87
|
-
</div>
|
|
88
|
-
` : ""}
|
|
89
|
-
</div>
|
|
90
|
-
` : ""}
|
|
91
|
-
|
|
92
|
-
${hasAddress ? `
|
|
93
|
-
<div class="info-section">
|
|
94
|
-
<div class="info-label">Address</div>
|
|
95
|
-
<div class="address-block">
|
|
96
|
-
${addressParts.map(p => `<div>${p}</div>`).join("")}
|
|
97
|
-
</div>
|
|
98
|
-
</div>
|
|
99
|
-
` : ""}
|
|
100
|
-
|
|
101
|
-
${!hasContactInfo && !hasAddress ? `
|
|
102
|
-
<div class="info-section" style="text-align: center; color: #6b7280;">
|
|
103
|
-
No contact details available
|
|
104
|
-
</div>
|
|
105
|
-
` : ""}
|
|
106
|
-
</div>
|
|
46
|
+
appEl.innerHTML = `
|
|
47
|
+
<div class="card-header">
|
|
48
|
+
<div class="avatar">${initials}</div>
|
|
49
|
+
<h1>${fullName}</h1>
|
|
50
|
+
${contact.url ? `<div class="company">${contact.url}</div>` : ""}
|
|
51
|
+
<span class="type-badge ${typeClass}">${typeBadge}</span>
|
|
52
|
+
</div>
|
|
53
|
+
<div class="card-body">
|
|
54
|
+
${hasContactInfo ? `
|
|
55
|
+
<div class="info-section">
|
|
56
|
+
<div class="info-label">Contact Information</div>
|
|
57
|
+
${contact.mail ? `
|
|
58
|
+
<div class="info-row">
|
|
59
|
+
<svg class="info-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
60
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"/>
|
|
61
|
+
</svg>
|
|
62
|
+
<span class="info-value"><a href="mailto:${contact.mail}">${contact.mail}</a></span>
|
|
63
|
+
</div>
|
|
64
|
+
` : ""}
|
|
65
|
+
${contact.phone_fixed ? `
|
|
66
|
+
<div class="info-row">
|
|
67
|
+
<svg class="info-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
68
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 5a2 2 0 012-2h3.28a1 1 0 01.948.684l1.498 4.493a1 1 0 01-.502 1.21l-2.257 1.13a11.042 11.042 0 005.516 5.516l1.13-2.257a1 1 0 011.21-.502l4.493 1.498a1 1 0 01.684.949V19a2 2 0 01-2 2h-1C9.716 21 3 14.284 3 6V5z"/>
|
|
69
|
+
</svg>
|
|
70
|
+
<span class="info-value"><a href="tel:${contact.phone_fixed}">${contact.phone_fixed}</a></span>
|
|
71
|
+
</div>
|
|
72
|
+
` : ""}
|
|
73
|
+
${contact.phone_mobile ? `
|
|
74
|
+
<div class="info-row">
|
|
75
|
+
<svg class="info-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
76
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 18h.01M8 21h8a2 2 0 002-2V5a2 2 0 00-2-2H8a2 2 0 00-2 2v14a2 2 0 002 2z"/>
|
|
77
|
+
</svg>
|
|
78
|
+
<span class="info-value"><a href="tel:${contact.phone_mobile}">${contact.phone_mobile}</a></span>
|
|
79
|
+
</div>
|
|
80
|
+
` : ""}
|
|
81
|
+
${contact.fax ? `
|
|
82
|
+
<div class="info-row">
|
|
83
|
+
<svg class="info-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
84
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 17h2a2 2 0 002-2v-4a2 2 0 00-2-2H5a2 2 0 00-2 2v4a2 2 0 002 2h2m2 4h6a2 2 0 002-2v-4a2 2 0 00-2-2H9a2 2 0 00-2 2v4a2 2 0 002 2zm8-12V5a2 2 0 00-2-2H9a2 2 0 00-2 2v4h10z"/>
|
|
85
|
+
</svg>
|
|
86
|
+
<span class="info-value">${contact.fax}</span>
|
|
87
|
+
</div>
|
|
88
|
+
` : ""}
|
|
89
|
+
</div>
|
|
90
|
+
` : ""}
|
|
91
|
+
|
|
92
|
+
${hasAddress ? `
|
|
93
|
+
<div class="info-section">
|
|
94
|
+
<div class="info-label">Address</div>
|
|
95
|
+
<div class="address-block">
|
|
96
|
+
${addressParts.map(p => `<div>${p}</div>`).join("")}
|
|
97
|
+
</div>
|
|
98
|
+
</div>
|
|
99
|
+
` : ""}
|
|
100
|
+
|
|
101
|
+
${!hasContactInfo && !hasAddress ? `
|
|
102
|
+
<div class="info-section" style="text-align: center; color: #6b7280;">
|
|
103
|
+
No contact details available
|
|
104
|
+
</div>
|
|
105
|
+
` : ""}
|
|
106
|
+
</div>
|
|
107
107
|
`;
|
|
108
108
|
}
|
|
@@ -23,59 +23,59 @@ function getInitials(name1, name2) {
|
|
|
23
23
|
}
|
|
24
24
|
function renderDashboard(data) {
|
|
25
25
|
appEl.className = "dashboard";
|
|
26
|
-
appEl.innerHTML = `
|
|
27
|
-
<div class="header">
|
|
28
|
-
<h1>Bexio Dashboard</h1>
|
|
29
|
-
<p class="subtitle">Overview of your invoices and recent contacts</p>
|
|
30
|
-
</div>
|
|
31
|
-
|
|
32
|
-
<div class="grid">
|
|
33
|
-
<div class="card">
|
|
34
|
-
<div class="card-header">
|
|
35
|
-
<div class="card-icon blue">
|
|
36
|
-
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
37
|
-
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/>
|
|
38
|
-
</svg>
|
|
39
|
-
</div>
|
|
40
|
-
<span class="card-title">Open Invoices</span>
|
|
41
|
-
</div>
|
|
42
|
-
<div class="card-value">${data.open_invoices_count}</div>
|
|
43
|
-
<div class="card-subtitle">${formatCurrency(data.open_invoices_total, data.currency)} total</div>
|
|
44
|
-
</div>
|
|
45
|
-
|
|
46
|
-
<div class="card">
|
|
47
|
-
<div class="card-header">
|
|
48
|
-
<div class="card-icon yellow">
|
|
49
|
-
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
50
|
-
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"/>
|
|
51
|
-
</svg>
|
|
52
|
-
</div>
|
|
53
|
-
<span class="card-title">Overdue</span>
|
|
54
|
-
</div>
|
|
55
|
-
<div class="card-value">${data.overdue_count}</div>
|
|
56
|
-
<div class="card-subtitle">${formatCurrency(data.overdue_total, data.currency)} outstanding</div>
|
|
57
|
-
</div>
|
|
58
|
-
|
|
59
|
-
<div class="card">
|
|
60
|
-
<div class="card-header">
|
|
61
|
-
<div class="card-icon green">
|
|
62
|
-
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
63
|
-
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z"/>
|
|
64
|
-
</svg>
|
|
65
|
-
</div>
|
|
66
|
-
<span class="card-title">Recent Contacts</span>
|
|
67
|
-
</div>
|
|
68
|
-
<div class="contacts-list">
|
|
69
|
-
${data.recent_contacts.length > 0 ? data.recent_contacts.slice(0, 5).map(contact => `
|
|
70
|
-
<div class="contact-item">
|
|
71
|
-
<div class="contact-avatar">${getInitials(contact.name_1, contact.name_2)}</div>
|
|
72
|
-
<span class="contact-name">${[contact.name_1, contact.name_2].filter(Boolean).join(" ")}</span>
|
|
73
|
-
</div>
|
|
74
|
-
`).join("") : `
|
|
75
|
-
<div class="empty-state">No recent contacts</div>
|
|
76
|
-
`}
|
|
77
|
-
</div>
|
|
78
|
-
</div>
|
|
79
|
-
</div>
|
|
26
|
+
appEl.innerHTML = `
|
|
27
|
+
<div class="header">
|
|
28
|
+
<h1>Bexio Dashboard</h1>
|
|
29
|
+
<p class="subtitle">Overview of your invoices and recent contacts</p>
|
|
30
|
+
</div>
|
|
31
|
+
|
|
32
|
+
<div class="grid">
|
|
33
|
+
<div class="card">
|
|
34
|
+
<div class="card-header">
|
|
35
|
+
<div class="card-icon blue">
|
|
36
|
+
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
37
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/>
|
|
38
|
+
</svg>
|
|
39
|
+
</div>
|
|
40
|
+
<span class="card-title">Open Invoices</span>
|
|
41
|
+
</div>
|
|
42
|
+
<div class="card-value">${data.open_invoices_count}</div>
|
|
43
|
+
<div class="card-subtitle">${formatCurrency(data.open_invoices_total, data.currency)} total</div>
|
|
44
|
+
</div>
|
|
45
|
+
|
|
46
|
+
<div class="card">
|
|
47
|
+
<div class="card-header">
|
|
48
|
+
<div class="card-icon yellow">
|
|
49
|
+
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
50
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"/>
|
|
51
|
+
</svg>
|
|
52
|
+
</div>
|
|
53
|
+
<span class="card-title">Overdue</span>
|
|
54
|
+
</div>
|
|
55
|
+
<div class="card-value">${data.overdue_count}</div>
|
|
56
|
+
<div class="card-subtitle">${formatCurrency(data.overdue_total, data.currency)} outstanding</div>
|
|
57
|
+
</div>
|
|
58
|
+
|
|
59
|
+
<div class="card">
|
|
60
|
+
<div class="card-header">
|
|
61
|
+
<div class="card-icon green">
|
|
62
|
+
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
63
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z"/>
|
|
64
|
+
</svg>
|
|
65
|
+
</div>
|
|
66
|
+
<span class="card-title">Recent Contacts</span>
|
|
67
|
+
</div>
|
|
68
|
+
<div class="contacts-list">
|
|
69
|
+
${data.recent_contacts.length > 0 ? data.recent_contacts.slice(0, 5).map(contact => `
|
|
70
|
+
<div class="contact-item">
|
|
71
|
+
<div class="contact-avatar">${getInitials(contact.name_1, contact.name_2)}</div>
|
|
72
|
+
<span class="contact-name">${[contact.name_1, contact.name_2].filter(Boolean).join(" ")}</span>
|
|
73
|
+
</div>
|
|
74
|
+
`).join("") : `
|
|
75
|
+
<div class="empty-state">No recent contacts</div>
|
|
76
|
+
`}
|
|
77
|
+
</div>
|
|
78
|
+
</div>
|
|
79
|
+
</div>
|
|
80
80
|
`;
|
|
81
81
|
}
|
|
@@ -40,57 +40,57 @@ function renderInvoice(invoice) {
|
|
|
40
40
|
const status = getStatusInfo(invoice.kb_item_status_id);
|
|
41
41
|
const positions = invoice.positions || [];
|
|
42
42
|
appEl.className = "invoice";
|
|
43
|
-
appEl.innerHTML = `
|
|
44
|
-
<div class="header">
|
|
45
|
-
<div class="header-left">
|
|
46
|
-
<h1>Invoice ${invoice.document_nr}</h1>
|
|
47
|
-
<p class="title">${invoice.title || ""}</p>
|
|
48
|
-
</div>
|
|
49
|
-
<div class="header-right">
|
|
50
|
-
<div class="dates">
|
|
51
|
-
<div>Issue: ${formatDate(invoice.is_valid_from)}</div>
|
|
52
|
-
<div>Due: ${formatDate(invoice.is_valid_to)}</div>
|
|
53
|
-
</div>
|
|
54
|
-
<span class="status-badge ${status.className}">${status.label}</span>
|
|
55
|
-
</div>
|
|
56
|
-
</div>
|
|
57
|
-
|
|
58
|
-
<div class="contact-section">
|
|
59
|
-
<h2>Bill To</h2>
|
|
60
|
-
<div class="name">${invoice.contact_address?.split("\n")[0] || `Contact #${invoice.contact_id}`}</div>
|
|
61
|
-
<div class="email">${invoice.contact_address?.split("\n").slice(1).join(", ") || ""}</div>
|
|
62
|
-
</div>
|
|
63
|
-
|
|
64
|
-
<table class="line-items">
|
|
65
|
-
<thead>
|
|
66
|
-
<tr>
|
|
67
|
-
<th>Description</th>
|
|
68
|
-
<th>Qty</th>
|
|
69
|
-
<th>Price</th>
|
|
70
|
-
<th>Amount</th>
|
|
71
|
-
</tr>
|
|
72
|
-
</thead>
|
|
73
|
-
<tbody>
|
|
74
|
-
${positions.length > 0 ? positions.map((p) => `
|
|
75
|
-
<tr>
|
|
76
|
-
<td>${p.text}</td>
|
|
77
|
-
<td>${p.amount}</td>
|
|
78
|
-
<td>${formatCurrency(p.unit_price, invoice.currency_id)}</td>
|
|
79
|
-
<td>${formatCurrency(p.amount * p.unit_price * (1 - (p.discount_in_percent || 0) / 100), invoice.currency_id)}</td>
|
|
80
|
-
</tr>
|
|
81
|
-
`).join("") : `
|
|
82
|
-
<tr>
|
|
83
|
-
<td colspan="4" style="text-align: center; color: #6b7280;">No line items available</td>
|
|
84
|
-
</tr>
|
|
85
|
-
`}
|
|
86
|
-
</tbody>
|
|
87
|
-
</table>
|
|
88
|
-
|
|
89
|
-
<div class="total-section">
|
|
90
|
-
<div class="total-row">
|
|
91
|
-
<span class="total-label">Total:</span>
|
|
92
|
-
<span class="total-amount">${formatCurrency(invoice.total_gross, invoice.currency_id)}</span>
|
|
93
|
-
</div>
|
|
94
|
-
</div>
|
|
43
|
+
appEl.innerHTML = `
|
|
44
|
+
<div class="header">
|
|
45
|
+
<div class="header-left">
|
|
46
|
+
<h1>Invoice ${invoice.document_nr}</h1>
|
|
47
|
+
<p class="title">${invoice.title || ""}</p>
|
|
48
|
+
</div>
|
|
49
|
+
<div class="header-right">
|
|
50
|
+
<div class="dates">
|
|
51
|
+
<div>Issue: ${formatDate(invoice.is_valid_from)}</div>
|
|
52
|
+
<div>Due: ${formatDate(invoice.is_valid_to)}</div>
|
|
53
|
+
</div>
|
|
54
|
+
<span class="status-badge ${status.className}">${status.label}</span>
|
|
55
|
+
</div>
|
|
56
|
+
</div>
|
|
57
|
+
|
|
58
|
+
<div class="contact-section">
|
|
59
|
+
<h2>Bill To</h2>
|
|
60
|
+
<div class="name">${invoice.contact_address?.split("\n")[0] || `Contact #${invoice.contact_id}`}</div>
|
|
61
|
+
<div class="email">${invoice.contact_address?.split("\n").slice(1).join(", ") || ""}</div>
|
|
62
|
+
</div>
|
|
63
|
+
|
|
64
|
+
<table class="line-items">
|
|
65
|
+
<thead>
|
|
66
|
+
<tr>
|
|
67
|
+
<th>Description</th>
|
|
68
|
+
<th>Qty</th>
|
|
69
|
+
<th>Price</th>
|
|
70
|
+
<th>Amount</th>
|
|
71
|
+
</tr>
|
|
72
|
+
</thead>
|
|
73
|
+
<tbody>
|
|
74
|
+
${positions.length > 0 ? positions.map((p) => `
|
|
75
|
+
<tr>
|
|
76
|
+
<td>${p.text}</td>
|
|
77
|
+
<td>${p.amount}</td>
|
|
78
|
+
<td>${formatCurrency(p.unit_price, invoice.currency_id)}</td>
|
|
79
|
+
<td>${formatCurrency(p.amount * p.unit_price * (1 - (p.discount_in_percent || 0) / 100), invoice.currency_id)}</td>
|
|
80
|
+
</tr>
|
|
81
|
+
`).join("") : `
|
|
82
|
+
<tr>
|
|
83
|
+
<td colspan="4" style="text-align: center; color: #6b7280;">No line items available</td>
|
|
84
|
+
</tr>
|
|
85
|
+
`}
|
|
86
|
+
</tbody>
|
|
87
|
+
</table>
|
|
88
|
+
|
|
89
|
+
<div class="total-section">
|
|
90
|
+
<div class="total-row">
|
|
91
|
+
<span class="total-label">Total:</span>
|
|
92
|
+
<span class="total-amount">${formatCurrency(invoice.total_gross, invoice.currency_id)}</span>
|
|
93
|
+
</div>
|
|
94
|
+
</div>
|
|
95
95
|
`;
|
|
96
96
|
}
|
package/package.json
CHANGED
|
@@ -1,78 +1,78 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@promptpartner/bexio-mcp-server",
|
|
3
|
-
"version": "2.0.
|
|
4
|
-
"description": "Model Context Protocol server for Bexio API integration",
|
|
5
|
-
"main": "dist/index.js",
|
|
6
|
-
"type": "module",
|
|
7
|
-
"bin": {
|
|
8
|
-
"bexio-mcp-server": "dist/index.js"
|
|
9
|
-
},
|
|
10
|
-
"files": [
|
|
11
|
-
"dist",
|
|
12
|
-
"README.md",
|
|
13
|
-
"LICENSE"
|
|
14
|
-
],
|
|
15
|
-
"scripts": {
|
|
16
|
-
"build": "tsc && npm run build:ui",
|
|
17
|
-
"build:ui": "node -e \"const fs=require('fs'); if(fs.existsSync('ui')){const{execSync}=require('child_process');execSync('npx vite build',{stdio:'inherit'})}else{console.log('Skipping UI build - ui/ not found')}\"",
|
|
18
|
-
"dev": "tsx watch src/index.ts",
|
|
19
|
-
"dev:ui": "vite build --watch",
|
|
20
|
-
"start": "node dist/index.js",
|
|
21
|
-
"test": "vitest",
|
|
22
|
-
"type-check": "tsc --noEmit",
|
|
23
|
-
"clean": "node -e \"const fs=require('fs'); if(fs.existsSync('dist')){fs.rmSync('dist',{recursive:true}); console.log('Cleaned dist/')}\"",
|
|
24
|
-
"prebuild": "npm run clean",
|
|
25
|
-
"pack:mcpb": "npm run build && npm run copy:bundle && cd .. && mcpb pack",
|
|
26
|
-
"copy:bundle": "node -e \"const fs=require('fs'); const path=require('path'); function copyDir(src,dest){fs.mkdirSync(dest,{recursive:true});fs.readdirSync(src).forEach(f=>{const srcPath=path.join(src,f);const destPath=path.join(dest,f);fs.statSync(srcPath).isDirectory()?copyDir(srcPath,destPath):fs.copyFileSync(srcPath,destPath)})} const rootDist=path.join(__dirname,'..','dist'); if(fs.existsSync(rootDist))fs.rmSync(rootDist,{recursive:true}); copyDir('dist',rootDist); console.log('Copied dist/ to root for MCPB bundling')\"",
|
|
27
|
-
"validate:mcpb": "cd .. && mcpb validate manifest.json",
|
|
28
|
-
"prepublishOnly": "npm run build"
|
|
29
|
-
},
|
|
30
|
-
"author": {
|
|
31
|
-
"name": "Lukas Hertig",
|
|
32
|
-
"email": "lukas@promptpartner.ai"
|
|
33
|
-
},
|
|
34
|
-
"repository": {
|
|
35
|
-
"type": "git",
|
|
36
|
-
"url": "https://github.com/promptpartner/bexio-mcp-server.git"
|
|
37
|
-
},
|
|
38
|
-
"homepage": "https://github.com/promptpartner/bexio-mcp-server#readme",
|
|
39
|
-
"bugs": {
|
|
40
|
-
"url": "https://github.com/promptpartner/bexio-mcp-server/issues"
|
|
41
|
-
},
|
|
42
|
-
"keywords": [
|
|
43
|
-
"mcp",
|
|
44
|
-
"bexio",
|
|
45
|
-
"api",
|
|
46
|
-
"typescript",
|
|
47
|
-
"model-context-protocol",
|
|
48
|
-
"claude",
|
|
49
|
-
"accounting",
|
|
50
|
-
"invoices",
|
|
51
|
-
"swiss"
|
|
52
|
-
],
|
|
53
|
-
"license": "MIT",
|
|
54
|
-
"dependencies": {
|
|
55
|
-
"@modelcontextprotocol/sdk": "^1.25.2",
|
|
56
|
-
"@modelcontextprotocol/ext-apps": "^1.0.1",
|
|
57
|
-
"axios": "^1.7.0",
|
|
58
|
-
"zod": "3.25.76",
|
|
59
|
-
"dotenv": "^16.3.0",
|
|
60
|
-
"fastify": "^4.28.0",
|
|
61
|
-
"@fastify/cors": "^9.0.0"
|
|
62
|
-
},
|
|
63
|
-
"devDependencies": {
|
|
64
|
-
"@types/node": "^20.8.0",
|
|
65
|
-
"typescript": "^5.5.0",
|
|
66
|
-
"tsx": "^4.0.0",
|
|
67
|
-
"vitest": "^2.0.0",
|
|
68
|
-
"vite": "^6.0.0",
|
|
69
|
-
"vite-plugin-singlefile": "^2.3.0",
|
|
70
|
-
"concurrently": "^8.0.0"
|
|
71
|
-
},
|
|
72
|
-
"engines": {
|
|
73
|
-
"node": ">=18.0.0"
|
|
74
|
-
},
|
|
75
|
-
"publishConfig": {
|
|
76
|
-
"access": "public"
|
|
77
|
-
}
|
|
78
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@promptpartner/bexio-mcp-server",
|
|
3
|
+
"version": "2.0.1",
|
|
4
|
+
"description": "Model Context Protocol server for Bexio API integration",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"bin": {
|
|
8
|
+
"bexio-mcp-server": "dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"README.md",
|
|
13
|
+
"LICENSE"
|
|
14
|
+
],
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build": "tsc && npm run build:ui",
|
|
17
|
+
"build:ui": "node -e \"const fs=require('fs'); if(fs.existsSync('ui')){const{execSync}=require('child_process');execSync('npx vite build',{stdio:'inherit'})}else{console.log('Skipping UI build - ui/ not found')}\"",
|
|
18
|
+
"dev": "tsx watch src/index.ts",
|
|
19
|
+
"dev:ui": "vite build --watch",
|
|
20
|
+
"start": "node dist/index.js",
|
|
21
|
+
"test": "vitest",
|
|
22
|
+
"type-check": "tsc --noEmit",
|
|
23
|
+
"clean": "node -e \"const fs=require('fs'); if(fs.existsSync('dist')){fs.rmSync('dist',{recursive:true}); console.log('Cleaned dist/')}\"",
|
|
24
|
+
"prebuild": "npm run clean",
|
|
25
|
+
"pack:mcpb": "npm run build && npm run copy:bundle && cd .. && mcpb pack",
|
|
26
|
+
"copy:bundle": "node -e \"const fs=require('fs'); const path=require('path'); function copyDir(src,dest){fs.mkdirSync(dest,{recursive:true});fs.readdirSync(src).forEach(f=>{const srcPath=path.join(src,f);const destPath=path.join(dest,f);fs.statSync(srcPath).isDirectory()?copyDir(srcPath,destPath):fs.copyFileSync(srcPath,destPath)})} const rootDist=path.join(__dirname,'..','dist'); if(fs.existsSync(rootDist))fs.rmSync(rootDist,{recursive:true}); copyDir('dist',rootDist); console.log('Copied dist/ to root for MCPB bundling')\"",
|
|
27
|
+
"validate:mcpb": "cd .. && mcpb validate manifest.json",
|
|
28
|
+
"prepublishOnly": "npm run build"
|
|
29
|
+
},
|
|
30
|
+
"author": {
|
|
31
|
+
"name": "Lukas Hertig",
|
|
32
|
+
"email": "lukas@promptpartner.ai"
|
|
33
|
+
},
|
|
34
|
+
"repository": {
|
|
35
|
+
"type": "git",
|
|
36
|
+
"url": "https://github.com/promptpartner/bexio-mcp-server.git"
|
|
37
|
+
},
|
|
38
|
+
"homepage": "https://github.com/promptpartner/bexio-mcp-server#readme",
|
|
39
|
+
"bugs": {
|
|
40
|
+
"url": "https://github.com/promptpartner/bexio-mcp-server/issues"
|
|
41
|
+
},
|
|
42
|
+
"keywords": [
|
|
43
|
+
"mcp",
|
|
44
|
+
"bexio",
|
|
45
|
+
"api",
|
|
46
|
+
"typescript",
|
|
47
|
+
"model-context-protocol",
|
|
48
|
+
"claude",
|
|
49
|
+
"accounting",
|
|
50
|
+
"invoices",
|
|
51
|
+
"swiss"
|
|
52
|
+
],
|
|
53
|
+
"license": "MIT",
|
|
54
|
+
"dependencies": {
|
|
55
|
+
"@modelcontextprotocol/sdk": "^1.25.2",
|
|
56
|
+
"@modelcontextprotocol/ext-apps": "^1.0.1",
|
|
57
|
+
"axios": "^1.7.0",
|
|
58
|
+
"zod": "3.25.76",
|
|
59
|
+
"dotenv": "^16.3.0",
|
|
60
|
+
"fastify": "^4.28.0",
|
|
61
|
+
"@fastify/cors": "^9.0.0"
|
|
62
|
+
},
|
|
63
|
+
"devDependencies": {
|
|
64
|
+
"@types/node": "^20.8.0",
|
|
65
|
+
"typescript": "^5.5.0",
|
|
66
|
+
"tsx": "^4.0.0",
|
|
67
|
+
"vitest": "^2.0.0",
|
|
68
|
+
"vite": "^6.0.0",
|
|
69
|
+
"vite-plugin-singlefile": "^2.3.0",
|
|
70
|
+
"concurrently": "^8.0.0"
|
|
71
|
+
},
|
|
72
|
+
"engines": {
|
|
73
|
+
"node": ">=18.0.0"
|
|
74
|
+
},
|
|
75
|
+
"publishConfig": {
|
|
76
|
+
"access": "public"
|
|
77
|
+
}
|
|
78
|
+
}
|