@energio/holded-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.
- package/LICENSE +21 -0
- package/README.md +1040 -0
- package/dist/constants.d.ts +60 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +72 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +86 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas/accounting/account-balances.d.ts +19 -0
- package/dist/schemas/accounting/account-balances.d.ts.map +1 -0
- package/dist/schemas/accounting/account-balances.js +28 -0
- package/dist/schemas/accounting/account-balances.js.map +1 -0
- package/dist/schemas/accounting/accounts.d.ts +49 -0
- package/dist/schemas/accounting/accounts.d.ts.map +1 -0
- package/dist/schemas/accounting/accounts.js +50 -0
- package/dist/schemas/accounting/accounts.js.map +1 -0
- package/dist/schemas/accounting/daily-ledger.d.ts +45 -0
- package/dist/schemas/accounting/daily-ledger.d.ts.map +1 -0
- package/dist/schemas/accounting/daily-ledger.js +57 -0
- package/dist/schemas/accounting/daily-ledger.js.map +1 -0
- package/dist/schemas/common.d.ts +118 -0
- package/dist/schemas/common.d.ts.map +1 -0
- package/dist/schemas/common.js +126 -0
- package/dist/schemas/common.js.map +1 -0
- package/dist/schemas/crm/bookings.d.ts +108 -0
- package/dist/schemas/crm/bookings.d.ts.map +1 -0
- package/dist/schemas/crm/bookings.js +96 -0
- package/dist/schemas/crm/bookings.js.map +1 -0
- package/dist/schemas/crm/events.d.ts +57 -0
- package/dist/schemas/crm/events.d.ts.map +1 -0
- package/dist/schemas/crm/events.js +53 -0
- package/dist/schemas/crm/events.js.map +1 -0
- package/dist/schemas/crm/funnels.d.ts +60 -0
- package/dist/schemas/crm/funnels.d.ts.map +1 -0
- package/dist/schemas/crm/funnels.js +48 -0
- package/dist/schemas/crm/funnels.js.map +1 -0
- package/dist/schemas/crm/leads.d.ts +146 -0
- package/dist/schemas/crm/leads.d.ts.map +1 -0
- package/dist/schemas/crm/leads.js +129 -0
- package/dist/schemas/crm/leads.js.map +1 -0
- package/dist/schemas/invoicing/contacts.d.ts +352 -0
- package/dist/schemas/invoicing/contacts.d.ts.map +1 -0
- package/dist/schemas/invoicing/contacts.js +187 -0
- package/dist/schemas/invoicing/contacts.js.map +1 -0
- package/dist/schemas/invoicing/documents.d.ts +424 -0
- package/dist/schemas/invoicing/documents.d.ts.map +1 -0
- package/dist/schemas/invoicing/documents.js +217 -0
- package/dist/schemas/invoicing/documents.js.map +1 -0
- package/dist/schemas/invoicing/expenses-accounts.d.ts +47 -0
- package/dist/schemas/invoicing/expenses-accounts.d.ts.map +1 -0
- package/dist/schemas/invoicing/expenses-accounts.js +43 -0
- package/dist/schemas/invoicing/expenses-accounts.js.map +1 -0
- package/dist/schemas/invoicing/numbering-series.d.ts +94 -0
- package/dist/schemas/invoicing/numbering-series.d.ts.map +1 -0
- package/dist/schemas/invoicing/numbering-series.js +43 -0
- package/dist/schemas/invoicing/numbering-series.js.map +1 -0
- package/dist/schemas/invoicing/payments.d.ts +50 -0
- package/dist/schemas/invoicing/payments.d.ts.map +1 -0
- package/dist/schemas/invoicing/payments.js +46 -0
- package/dist/schemas/invoicing/payments.js.map +1 -0
- package/dist/schemas/invoicing/products.d.ts +176 -0
- package/dist/schemas/invoicing/products.d.ts.map +1 -0
- package/dist/schemas/invoicing/products.js +149 -0
- package/dist/schemas/invoicing/products.js.map +1 -0
- package/dist/schemas/invoicing/remittances.d.ts +21 -0
- package/dist/schemas/invoicing/remittances.d.ts.map +1 -0
- package/dist/schemas/invoicing/remittances.js +20 -0
- package/dist/schemas/invoicing/remittances.js.map +1 -0
- package/dist/schemas/invoicing/sales-channels.d.ts +45 -0
- package/dist/schemas/invoicing/sales-channels.d.ts.map +1 -0
- package/dist/schemas/invoicing/sales-channels.js +41 -0
- package/dist/schemas/invoicing/sales-channels.js.map +1 -0
- package/dist/schemas/invoicing/services.d.ts +55 -0
- package/dist/schemas/invoicing/services.d.ts.map +1 -0
- package/dist/schemas/invoicing/services.js +51 -0
- package/dist/schemas/invoicing/services.js.map +1 -0
- package/dist/schemas/invoicing/taxes.d.ts +12 -0
- package/dist/schemas/invoicing/taxes.d.ts.map +1 -0
- package/dist/schemas/invoicing/taxes.js +12 -0
- package/dist/schemas/invoicing/taxes.js.map +1 -0
- package/dist/schemas/invoicing/treasury.d.ts +42 -0
- package/dist/schemas/invoicing/treasury.d.ts.map +1 -0
- package/dist/schemas/invoicing/treasury.js +39 -0
- package/dist/schemas/invoicing/treasury.js.map +1 -0
- package/dist/schemas/invoicing/warehouses.d.ts +61 -0
- package/dist/schemas/invoicing/warehouses.d.ts.map +1 -0
- package/dist/schemas/invoicing/warehouses.js +43 -0
- package/dist/schemas/invoicing/warehouses.js.map +1 -0
- package/dist/schemas/projects/projects.d.ts +60 -0
- package/dist/schemas/projects/projects.d.ts.map +1 -0
- package/dist/schemas/projects/projects.js +55 -0
- package/dist/schemas/projects/projects.js.map +1 -0
- package/dist/schemas/projects/tasks.d.ts +68 -0
- package/dist/schemas/projects/tasks.d.ts.map +1 -0
- package/dist/schemas/projects/tasks.js +64 -0
- package/dist/schemas/projects/tasks.js.map +1 -0
- package/dist/schemas/projects/time-tracking.d.ts +80 -0
- package/dist/schemas/projects/time-tracking.d.ts.map +1 -0
- package/dist/schemas/projects/time-tracking.js +75 -0
- package/dist/schemas/projects/time-tracking.js.map +1 -0
- package/dist/schemas/team/employees.d.ts +135 -0
- package/dist/schemas/team/employees.d.ts.map +1 -0
- package/dist/schemas/team/employees.js +144 -0
- package/dist/schemas/team/employees.js.map +1 -0
- package/dist/schemas/team/time-tracking.d.ts +98 -0
- package/dist/schemas/team/time-tracking.d.ts.map +1 -0
- package/dist/schemas/team/time-tracking.js +89 -0
- package/dist/schemas/team/time-tracking.js.map +1 -0
- package/dist/services/api.d.ts +118 -0
- package/dist/services/api.d.ts.map +1 -0
- package/dist/services/api.js +441 -0
- package/dist/services/api.js.map +1 -0
- package/dist/tools/accounting/account-balances.d.ts +44 -0
- package/dist/tools/accounting/account-balances.d.ts.map +1 -0
- package/dist/tools/accounting/account-balances.js +240 -0
- package/dist/tools/accounting/account-balances.js.map +1 -0
- package/dist/tools/accounting/accounts.d.ts +18 -0
- package/dist/tools/accounting/accounts.d.ts.map +1 -0
- package/dist/tools/accounting/accounts.js +131 -0
- package/dist/tools/accounting/accounts.js.map +1 -0
- package/dist/tools/accounting/daily-ledger.d.ts +9 -0
- package/dist/tools/accounting/daily-ledger.d.ts.map +1 -0
- package/dist/tools/accounting/daily-ledger.js +117 -0
- package/dist/tools/accounting/daily-ledger.js.map +1 -0
- package/dist/tools/accounting/index.d.ts +9 -0
- package/dist/tools/accounting/index.d.ts.map +1 -0
- package/dist/tools/accounting/index.js +15 -0
- package/dist/tools/accounting/index.js.map +1 -0
- package/dist/tools/crm/bookings.d.ts +18 -0
- package/dist/tools/crm/bookings.d.ts.map +1 -0
- package/dist/tools/crm/bookings.js +272 -0
- package/dist/tools/crm/bookings.js.map +1 -0
- package/dist/tools/crm/events.d.ts +18 -0
- package/dist/tools/crm/events.d.ts.map +1 -0
- package/dist/tools/crm/events.js +134 -0
- package/dist/tools/crm/events.js.map +1 -0
- package/dist/tools/crm/funnels.d.ts +18 -0
- package/dist/tools/crm/funnels.d.ts.map +1 -0
- package/dist/tools/crm/funnels.js +113 -0
- package/dist/tools/crm/funnels.js.map +1 -0
- package/dist/tools/crm/index.d.ts +9 -0
- package/dist/tools/crm/index.d.ts.map +1 -0
- package/dist/tools/crm/index.js +17 -0
- package/dist/tools/crm/index.js.map +1 -0
- package/dist/tools/crm/leads.d.ts +18 -0
- package/dist/tools/crm/leads.d.ts.map +1 -0
- package/dist/tools/crm/leads.js +519 -0
- package/dist/tools/crm/leads.js.map +1 -0
- package/dist/tools/factory.d.ts +55 -0
- package/dist/tools/factory.d.ts.map +1 -0
- package/dist/tools/factory.js +145 -0
- package/dist/tools/factory.js.map +1 -0
- package/dist/tools/invoicing/contacts.d.ts +26 -0
- package/dist/tools/invoicing/contacts.d.ts.map +1 -0
- package/dist/tools/invoicing/contacts.js +358 -0
- package/dist/tools/invoicing/contacts.js.map +1 -0
- package/dist/tools/invoicing/documents.d.ts +18 -0
- package/dist/tools/invoicing/documents.d.ts.map +1 -0
- package/dist/tools/invoicing/documents.js +578 -0
- package/dist/tools/invoicing/documents.js.map +1 -0
- package/dist/tools/invoicing/expenses-accounts.d.ts +25 -0
- package/dist/tools/invoicing/expenses-accounts.d.ts.map +1 -0
- package/dist/tools/invoicing/expenses-accounts.js +111 -0
- package/dist/tools/invoicing/expenses-accounts.js.map +1 -0
- package/dist/tools/invoicing/index.d.ts +9 -0
- package/dist/tools/invoicing/index.d.ts.map +1 -0
- package/dist/tools/invoicing/index.js +33 -0
- package/dist/tools/invoicing/index.js.map +1 -0
- package/dist/tools/invoicing/numbering-series.d.ts +9 -0
- package/dist/tools/invoicing/numbering-series.d.ts.map +1 -0
- package/dist/tools/invoicing/numbering-series.js +161 -0
- package/dist/tools/invoicing/numbering-series.js.map +1 -0
- package/dist/tools/invoicing/payments.d.ts +18 -0
- package/dist/tools/invoicing/payments.d.ts.map +1 -0
- package/dist/tools/invoicing/payments.js +175 -0
- package/dist/tools/invoicing/payments.js.map +1 -0
- package/dist/tools/invoicing/products.d.ts +18 -0
- package/dist/tools/invoicing/products.d.ts.map +1 -0
- package/dist/tools/invoicing/products.js +389 -0
- package/dist/tools/invoicing/products.js.map +1 -0
- package/dist/tools/invoicing/remittances.d.ts +17 -0
- package/dist/tools/invoicing/remittances.d.ts.map +1 -0
- package/dist/tools/invoicing/remittances.js +76 -0
- package/dist/tools/invoicing/remittances.js.map +1 -0
- package/dist/tools/invoicing/sales-channels.d.ts +24 -0
- package/dist/tools/invoicing/sales-channels.d.ts.map +1 -0
- package/dist/tools/invoicing/sales-channels.js +105 -0
- package/dist/tools/invoicing/sales-channels.js.map +1 -0
- package/dist/tools/invoicing/services.d.ts +29 -0
- package/dist/tools/invoicing/services.d.ts.map +1 -0
- package/dist/tools/invoicing/services.js +124 -0
- package/dist/tools/invoicing/services.js.map +1 -0
- package/dist/tools/invoicing/taxes.d.ts +18 -0
- package/dist/tools/invoicing/taxes.d.ts.map +1 -0
- package/dist/tools/invoicing/taxes.js +58 -0
- package/dist/tools/invoicing/taxes.js.map +1 -0
- package/dist/tools/invoicing/treasury.d.ts +9 -0
- package/dist/tools/invoicing/treasury.d.ts.map +1 -0
- package/dist/tools/invoicing/treasury.js +196 -0
- package/dist/tools/invoicing/treasury.js.map +1 -0
- package/dist/tools/invoicing/warehouses.d.ts +18 -0
- package/dist/tools/invoicing/warehouses.d.ts.map +1 -0
- package/dist/tools/invoicing/warehouses.js +133 -0
- package/dist/tools/invoicing/warehouses.js.map +1 -0
- package/dist/tools/projects/index.d.ts +9 -0
- package/dist/tools/projects/index.d.ts.map +1 -0
- package/dist/tools/projects/index.js +15 -0
- package/dist/tools/projects/index.js.map +1 -0
- package/dist/tools/projects/projects.d.ts +18 -0
- package/dist/tools/projects/projects.d.ts.map +1 -0
- package/dist/tools/projects/projects.js +203 -0
- package/dist/tools/projects/projects.js.map +1 -0
- package/dist/tools/projects/tasks.d.ts +18 -0
- package/dist/tools/projects/tasks.d.ts.map +1 -0
- package/dist/tools/projects/tasks.js +154 -0
- package/dist/tools/projects/tasks.js.map +1 -0
- package/dist/tools/projects/time-tracking.d.ts +14 -0
- package/dist/tools/projects/time-tracking.d.ts.map +1 -0
- package/dist/tools/projects/time-tracking.js +291 -0
- package/dist/tools/projects/time-tracking.js.map +1 -0
- package/dist/tools/team/employees.d.ts +18 -0
- package/dist/tools/team/employees.d.ts.map +1 -0
- package/dist/tools/team/employees.js +149 -0
- package/dist/tools/team/employees.js.map +1 -0
- package/dist/tools/team/index.d.ts +9 -0
- package/dist/tools/team/index.d.ts.map +1 -0
- package/dist/tools/team/index.js +13 -0
- package/dist/tools/team/index.js.map +1 -0
- package/dist/tools/team/time-tracking.d.ts +18 -0
- package/dist/tools/team/time-tracking.d.ts.map +1 -0
- package/dist/tools/team/time-tracking.js +398 -0
- package/dist/tools/team/time-tracking.js.map +1 -0
- package/dist/tools/utilities.d.ts +45 -0
- package/dist/tools/utilities.d.ts.map +1 -0
- package/dist/tools/utilities.js +55 -0
- package/dist/tools/utilities.js.map +1 -0
- package/dist/types.d.ts +640 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +29 -0
- package/dist/types.js.map +1 -0
- package/package.json +70 -0
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CRUD tool factory — registerCrudTools
|
|
3
|
+
*
|
|
4
|
+
* Generates standard list / get / create / update / delete MCP tools
|
|
5
|
+
* from a declarative CrudToolConfig, eliminating boilerplate.
|
|
6
|
+
*/
|
|
7
|
+
import { makeApiRequest, toStructuredContent } from "../services/api.js";
|
|
8
|
+
import { buildToolResponse, withErrorHandling } from "./utilities.js";
|
|
9
|
+
/**
|
|
10
|
+
* Register CRUD tools for a resource on the given MCP server.
|
|
11
|
+
*
|
|
12
|
+
* Only tools whose schemas are provided in the config will be registered.
|
|
13
|
+
*/
|
|
14
|
+
export function registerCrudTools(server, config) {
|
|
15
|
+
const { module, toolPrefix, resource, resourcePlural, endpoint, listEndpoint, idParam, schemas, titles, descriptions, formatters, listQueryParams, bodyTransform, } = config;
|
|
16
|
+
// ── List ───────────────────────────────────────────────
|
|
17
|
+
if (schemas.list) {
|
|
18
|
+
server.registerTool(`${toolPrefix}_list_${resourcePlural}`, {
|
|
19
|
+
title: titles.list,
|
|
20
|
+
description: descriptions.list,
|
|
21
|
+
inputSchema: schemas.list,
|
|
22
|
+
annotations: {
|
|
23
|
+
readOnlyHint: true,
|
|
24
|
+
destructiveHint: false,
|
|
25
|
+
idempotentHint: true,
|
|
26
|
+
openWorldHint: true,
|
|
27
|
+
},
|
|
28
|
+
}, withErrorHandling(async (params) => {
|
|
29
|
+
const queryParams = {};
|
|
30
|
+
if (params.page > 1) {
|
|
31
|
+
queryParams.page = params.page;
|
|
32
|
+
}
|
|
33
|
+
if (listQueryParams) {
|
|
34
|
+
Object.assign(queryParams, listQueryParams(params));
|
|
35
|
+
}
|
|
36
|
+
const items = await makeApiRequest(module, listEndpoint ?? endpoint, "GET", undefined, queryParams);
|
|
37
|
+
return buildToolResponse(items, params.response_format, formatters.list, {
|
|
38
|
+
[resourcePlural]: items,
|
|
39
|
+
count: items.length,
|
|
40
|
+
page: params.page,
|
|
41
|
+
});
|
|
42
|
+
}));
|
|
43
|
+
}
|
|
44
|
+
// ── Get ────────────────────────────────────────────────
|
|
45
|
+
if (schemas.get) {
|
|
46
|
+
server.registerTool(`${toolPrefix}_get_${resource}`, {
|
|
47
|
+
title: titles.get,
|
|
48
|
+
description: descriptions.get,
|
|
49
|
+
inputSchema: schemas.get,
|
|
50
|
+
annotations: {
|
|
51
|
+
readOnlyHint: true,
|
|
52
|
+
destructiveHint: false,
|
|
53
|
+
idempotentHint: true,
|
|
54
|
+
openWorldHint: true,
|
|
55
|
+
},
|
|
56
|
+
}, withErrorHandling(async (params) => {
|
|
57
|
+
const id = params[idParam];
|
|
58
|
+
const item = await makeApiRequest(module, `${endpoint}/${id}`, "GET");
|
|
59
|
+
return buildToolResponse(item, params.response_format, formatters.single);
|
|
60
|
+
}));
|
|
61
|
+
}
|
|
62
|
+
const Resource = resource.charAt(0).toUpperCase() + resource.slice(1);
|
|
63
|
+
// ── Create ─────────────────────────────────────────────
|
|
64
|
+
if (schemas.create) {
|
|
65
|
+
server.registerTool(`${toolPrefix}_create_${resource}`, {
|
|
66
|
+
title: titles.create,
|
|
67
|
+
description: descriptions.create,
|
|
68
|
+
inputSchema: schemas.create,
|
|
69
|
+
annotations: {
|
|
70
|
+
readOnlyHint: false,
|
|
71
|
+
destructiveHint: false,
|
|
72
|
+
idempotentHint: false,
|
|
73
|
+
openWorldHint: true,
|
|
74
|
+
},
|
|
75
|
+
}, withErrorHandling(async (params) => {
|
|
76
|
+
const { response_format: _response_format, ...body } = params;
|
|
77
|
+
const requestBody = bodyTransform ? bodyTransform(body) : body;
|
|
78
|
+
const item = await makeApiRequest(module, endpoint, "POST", requestBody);
|
|
79
|
+
return {
|
|
80
|
+
content: [
|
|
81
|
+
{
|
|
82
|
+
type: "text",
|
|
83
|
+
text: `${Resource} created successfully.\n\n${JSON.stringify(item, null, 2)}`,
|
|
84
|
+
},
|
|
85
|
+
],
|
|
86
|
+
structuredContent: toStructuredContent(item),
|
|
87
|
+
};
|
|
88
|
+
}));
|
|
89
|
+
}
|
|
90
|
+
// ── Update ─────────────────────────────────────────────
|
|
91
|
+
if (schemas.update) {
|
|
92
|
+
server.registerTool(`${toolPrefix}_update_${resource}`, {
|
|
93
|
+
title: titles.update,
|
|
94
|
+
description: descriptions.update,
|
|
95
|
+
inputSchema: schemas.update,
|
|
96
|
+
annotations: {
|
|
97
|
+
readOnlyHint: false,
|
|
98
|
+
destructiveHint: false,
|
|
99
|
+
idempotentHint: true,
|
|
100
|
+
openWorldHint: true,
|
|
101
|
+
},
|
|
102
|
+
}, withErrorHandling(async (params) => {
|
|
103
|
+
const id = params[idParam];
|
|
104
|
+
const { [idParam]: _id, response_format: _rf, ...updateData } = params;
|
|
105
|
+
const requestBody = bodyTransform ? bodyTransform(updateData) : updateData;
|
|
106
|
+
const item = await makeApiRequest(module, `${endpoint}/${id}`, "PUT", requestBody);
|
|
107
|
+
return {
|
|
108
|
+
content: [
|
|
109
|
+
{
|
|
110
|
+
type: "text",
|
|
111
|
+
text: `${Resource} updated successfully.\n\n${JSON.stringify(item, null, 2)}`,
|
|
112
|
+
},
|
|
113
|
+
],
|
|
114
|
+
structuredContent: toStructuredContent(item),
|
|
115
|
+
};
|
|
116
|
+
}));
|
|
117
|
+
}
|
|
118
|
+
// ── Delete ─────────────────────────────────────────────
|
|
119
|
+
if (schemas.delete) {
|
|
120
|
+
server.registerTool(`${toolPrefix}_delete_${resource}`, {
|
|
121
|
+
title: titles.delete,
|
|
122
|
+
description: descriptions.delete,
|
|
123
|
+
inputSchema: schemas.delete,
|
|
124
|
+
annotations: {
|
|
125
|
+
readOnlyHint: false,
|
|
126
|
+
destructiveHint: true,
|
|
127
|
+
idempotentHint: true,
|
|
128
|
+
openWorldHint: true,
|
|
129
|
+
},
|
|
130
|
+
}, withErrorHandling(async (params) => {
|
|
131
|
+
const id = params[idParam];
|
|
132
|
+
await makeApiRequest(module, `${endpoint}/${id}`, "DELETE");
|
|
133
|
+
return {
|
|
134
|
+
content: [
|
|
135
|
+
{
|
|
136
|
+
type: "text",
|
|
137
|
+
text: `${Resource} ${id} deleted successfully.`,
|
|
138
|
+
},
|
|
139
|
+
],
|
|
140
|
+
structuredContent: { deleted: true, id },
|
|
141
|
+
};
|
|
142
|
+
}));
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/tools/factory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Contact and Contact Group tools for Holded API
|
|
3
|
+
*/
|
|
4
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
5
|
+
import { Contact, ContactGroup } from "../../types.js";
|
|
6
|
+
/**
|
|
7
|
+
* Format contacts as markdown
|
|
8
|
+
*/
|
|
9
|
+
export declare function formatContactsMarkdown(contacts: Contact[]): string;
|
|
10
|
+
/**
|
|
11
|
+
* Format a single contact as markdown
|
|
12
|
+
*/
|
|
13
|
+
export declare function formatContactMarkdown(contact: Contact): string;
|
|
14
|
+
/**
|
|
15
|
+
* Format contact groups as markdown
|
|
16
|
+
*/
|
|
17
|
+
export declare function formatContactGroupsMarkdown(groups: ContactGroup[]): string;
|
|
18
|
+
/**
|
|
19
|
+
* Format a single contact group as markdown
|
|
20
|
+
*/
|
|
21
|
+
export declare function formatContactGroupMarkdown(group: ContactGroup): string;
|
|
22
|
+
/**
|
|
23
|
+
* Register all contact-related tools
|
|
24
|
+
*/
|
|
25
|
+
export declare function registerContactTools(server: McpServer): void;
|
|
26
|
+
//# sourceMappingURL=contacts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contacts.d.ts","sourceRoot":"","sources":["../../../src/tools/invoicing/contacts.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAsBvD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CAkBlE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CA2B9D;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,CAU1E;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAEtE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA0S5D"}
|
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Contact and Contact Group tools for Holded API
|
|
3
|
+
*/
|
|
4
|
+
import { makeApiRequest, makeMultipartApiRequest } from "../../services/api.js";
|
|
5
|
+
import { ResponseFormat } from "../../constants.js";
|
|
6
|
+
import { ListContactsInputSchema, GetContactInputSchema, CreateContactInputSchema, UpdateContactInputSchema, DeleteContactInputSchema, ListContactGroupsInputSchema, GetContactGroupInputSchema, CreateContactGroupInputSchema, UpdateContactGroupInputSchema, DeleteContactGroupInputSchema, ListContactAttachmentsInputSchema, GetContactAttachmentInputSchema, UploadContactAttachmentInputSchema, } from "../../schemas/invoicing/contacts.js";
|
|
7
|
+
import { registerCrudTools } from "../factory.js";
|
|
8
|
+
import { withErrorHandling } from "../utilities.js";
|
|
9
|
+
/**
|
|
10
|
+
* Format contacts as markdown
|
|
11
|
+
*/
|
|
12
|
+
export function formatContactsMarkdown(contacts) {
|
|
13
|
+
if (!contacts.length) {
|
|
14
|
+
return "No contacts found.";
|
|
15
|
+
}
|
|
16
|
+
const lines = ["# Contacts", "", `Found ${contacts.length} contacts:`, ""];
|
|
17
|
+
for (const contact of contacts) {
|
|
18
|
+
lines.push(`## ${contact.name}`);
|
|
19
|
+
lines.push(`- **ID**: ${contact.id}`);
|
|
20
|
+
if (contact.email)
|
|
21
|
+
lines.push(`- **Email**: ${contact.email}`);
|
|
22
|
+
if (contact.phone)
|
|
23
|
+
lines.push(`- **Phone**: ${contact.phone}`);
|
|
24
|
+
if (contact.type)
|
|
25
|
+
lines.push(`- **Type**: ${contact.type}`);
|
|
26
|
+
if (contact.vatnumber)
|
|
27
|
+
lines.push(`- **VAT**: ${contact.vatnumber}`);
|
|
28
|
+
lines.push("");
|
|
29
|
+
}
|
|
30
|
+
return lines.join("\n");
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Format a single contact as markdown
|
|
34
|
+
*/
|
|
35
|
+
export function formatContactMarkdown(contact) {
|
|
36
|
+
const lines = [`# ${contact.name}`, "", `**ID**: ${contact.id}`, ""];
|
|
37
|
+
if (contact.code)
|
|
38
|
+
lines.push(`- **Code**: ${contact.code}`);
|
|
39
|
+
if (contact.email)
|
|
40
|
+
lines.push(`- **Email**: ${contact.email}`);
|
|
41
|
+
if (contact.phone)
|
|
42
|
+
lines.push(`- **Phone**: ${contact.phone}`);
|
|
43
|
+
if (contact.mobile)
|
|
44
|
+
lines.push(`- **Mobile**: ${contact.mobile}`);
|
|
45
|
+
if (contact.type)
|
|
46
|
+
lines.push(`- **Type**: ${contact.type}`);
|
|
47
|
+
if (contact.vatnumber)
|
|
48
|
+
lines.push(`- **VAT Number**: ${contact.vatnumber}`);
|
|
49
|
+
if (contact.tradeName)
|
|
50
|
+
lines.push(`- **Trade Name**: ${contact.tradeName}`);
|
|
51
|
+
if (contact.currency)
|
|
52
|
+
lines.push(`- **Currency**: ${contact.currency}`);
|
|
53
|
+
if (contact.billAddress) {
|
|
54
|
+
lines.push("", "### Billing Address");
|
|
55
|
+
const addr = contact.billAddress;
|
|
56
|
+
if (addr.address)
|
|
57
|
+
lines.push(`- ${addr.address}`);
|
|
58
|
+
if (addr.city)
|
|
59
|
+
lines.push(`- ${addr.city}`);
|
|
60
|
+
if (addr.postalCode)
|
|
61
|
+
lines.push(`- ${addr.postalCode}`);
|
|
62
|
+
if (addr.province)
|
|
63
|
+
lines.push(`- ${addr.province}`);
|
|
64
|
+
if (addr.country)
|
|
65
|
+
lines.push(`- ${addr.country}`);
|
|
66
|
+
}
|
|
67
|
+
if (contact.notes) {
|
|
68
|
+
lines.push("", "### Notes", contact.notes);
|
|
69
|
+
}
|
|
70
|
+
return lines.join("\n");
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Format contact groups as markdown
|
|
74
|
+
*/
|
|
75
|
+
export function formatContactGroupsMarkdown(groups) {
|
|
76
|
+
if (!groups.length) {
|
|
77
|
+
return "No contact groups found.";
|
|
78
|
+
}
|
|
79
|
+
const lines = ["# Contact Groups", "", `Found ${groups.length} groups:`, ""];
|
|
80
|
+
for (const group of groups) {
|
|
81
|
+
lines.push(`- **${group.name}** (ID: ${group.id})`);
|
|
82
|
+
}
|
|
83
|
+
return lines.join("\n");
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Format a single contact group as markdown
|
|
87
|
+
*/
|
|
88
|
+
export function formatContactGroupMarkdown(group) {
|
|
89
|
+
return `# ${group.name}\n\n**ID**: ${group.id}`;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Register all contact-related tools
|
|
93
|
+
*/
|
|
94
|
+
export function registerContactTools(server) {
|
|
95
|
+
// ── Contacts CRUD via factory ─────────────────────────
|
|
96
|
+
registerCrudTools(server, {
|
|
97
|
+
module: "invoicing",
|
|
98
|
+
toolPrefix: "holded_invoicing",
|
|
99
|
+
resource: "contact",
|
|
100
|
+
resourcePlural: "contacts",
|
|
101
|
+
endpoint: "contacts",
|
|
102
|
+
idParam: "contact_id",
|
|
103
|
+
schemas: {
|
|
104
|
+
list: ListContactsInputSchema,
|
|
105
|
+
get: GetContactInputSchema,
|
|
106
|
+
create: CreateContactInputSchema,
|
|
107
|
+
update: UpdateContactInputSchema,
|
|
108
|
+
delete: DeleteContactInputSchema,
|
|
109
|
+
},
|
|
110
|
+
titles: {
|
|
111
|
+
list: "List Holded Contacts",
|
|
112
|
+
get: "Get Holded Contact",
|
|
113
|
+
create: "Create Holded Contact",
|
|
114
|
+
update: "Update Holded Contact",
|
|
115
|
+
delete: "Delete Holded Contact",
|
|
116
|
+
},
|
|
117
|
+
descriptions: {
|
|
118
|
+
list: `List all contacts from Holded (clients, suppliers, etc.).
|
|
119
|
+
|
|
120
|
+
Returns paginated list of contacts (max 500 per page). Use page parameter to navigate through results.
|
|
121
|
+
|
|
122
|
+
Args:
|
|
123
|
+
- page (number): Page number for pagination (default: 1, max 500 items per page)
|
|
124
|
+
- response_format ('json' | 'markdown'): Output format (default: 'json')
|
|
125
|
+
|
|
126
|
+
Returns:
|
|
127
|
+
Array of contacts with id, name, email, phone, type, and other details.`,
|
|
128
|
+
get: `Get a specific contact by ID from Holded.
|
|
129
|
+
|
|
130
|
+
Args:
|
|
131
|
+
- contact_id (string): The contact ID to retrieve (required)
|
|
132
|
+
- response_format ('json' | 'markdown'): Output format (default: 'json')
|
|
133
|
+
|
|
134
|
+
Returns:
|
|
135
|
+
Contact details including name, email, phone, addresses, and custom fields.`,
|
|
136
|
+
create: `Create a new contact in Holded.
|
|
137
|
+
|
|
138
|
+
Args:
|
|
139
|
+
- name (string): Contact name (required)
|
|
140
|
+
- email (string): Email address
|
|
141
|
+
- phone (string): Phone number
|
|
142
|
+
- type ('client' | 'supplier' | 'lead' | 'debtor' | 'creditor'): Contact type
|
|
143
|
+
- And other optional fields for address, social networks, defaults, etc.
|
|
144
|
+
|
|
145
|
+
Returns:
|
|
146
|
+
The created contact with its assigned ID.`,
|
|
147
|
+
update: `Update an existing contact in Holded. Only provided fields will be updated.
|
|
148
|
+
|
|
149
|
+
Args:
|
|
150
|
+
- contact_id (string): The contact ID to update (required)
|
|
151
|
+
- name (string): Contact name
|
|
152
|
+
- email (string): Email address
|
|
153
|
+
- phone (string): Phone number
|
|
154
|
+
- And other optional fields to update
|
|
155
|
+
|
|
156
|
+
Returns:
|
|
157
|
+
The updated contact.`,
|
|
158
|
+
delete: `Delete a contact from Holded.
|
|
159
|
+
|
|
160
|
+
Args:
|
|
161
|
+
- contact_id (string): The contact ID to delete (required)
|
|
162
|
+
|
|
163
|
+
Returns:
|
|
164
|
+
Confirmation of deletion.`,
|
|
165
|
+
},
|
|
166
|
+
formatters: {
|
|
167
|
+
list: formatContactsMarkdown,
|
|
168
|
+
single: formatContactMarkdown,
|
|
169
|
+
},
|
|
170
|
+
});
|
|
171
|
+
// ── Contact Groups CRUD via factory ───────────────────
|
|
172
|
+
registerCrudTools(server, {
|
|
173
|
+
module: "invoicing",
|
|
174
|
+
toolPrefix: "holded_invoicing",
|
|
175
|
+
resource: "contact_group",
|
|
176
|
+
resourcePlural: "contact_groups",
|
|
177
|
+
endpoint: "contactgroups",
|
|
178
|
+
idParam: "group_id",
|
|
179
|
+
schemas: {
|
|
180
|
+
list: ListContactGroupsInputSchema,
|
|
181
|
+
get: GetContactGroupInputSchema,
|
|
182
|
+
create: CreateContactGroupInputSchema,
|
|
183
|
+
update: UpdateContactGroupInputSchema,
|
|
184
|
+
delete: DeleteContactGroupInputSchema,
|
|
185
|
+
},
|
|
186
|
+
titles: {
|
|
187
|
+
list: "List Holded Contact Groups",
|
|
188
|
+
get: "Get Holded Contact Group",
|
|
189
|
+
create: "Create Holded Contact Group",
|
|
190
|
+
update: "Update Holded Contact Group",
|
|
191
|
+
delete: "Delete Holded Contact Group",
|
|
192
|
+
},
|
|
193
|
+
descriptions: {
|
|
194
|
+
list: `List all contact groups from Holded.
|
|
195
|
+
|
|
196
|
+
Args:
|
|
197
|
+
- response_format ('json' | 'markdown'): Output format (default: 'json')
|
|
198
|
+
|
|
199
|
+
Returns:
|
|
200
|
+
Array of contact groups with id and name.`,
|
|
201
|
+
get: `Get a specific contact group by ID from Holded.
|
|
202
|
+
|
|
203
|
+
Args:
|
|
204
|
+
- group_id (string): The contact group ID to retrieve (required)
|
|
205
|
+
- response_format ('json' | 'markdown'): Output format (default: 'json')
|
|
206
|
+
|
|
207
|
+
Returns:
|
|
208
|
+
Contact group details.`,
|
|
209
|
+
create: `Create a new contact group in Holded.
|
|
210
|
+
|
|
211
|
+
Args:
|
|
212
|
+
- name (string): Contact group name (required)
|
|
213
|
+
- pos (number): Position/order in the list
|
|
214
|
+
|
|
215
|
+
Returns:
|
|
216
|
+
The created contact group with its assigned ID.`,
|
|
217
|
+
update: `Update an existing contact group in Holded. Only provided fields will be updated.
|
|
218
|
+
|
|
219
|
+
Args:
|
|
220
|
+
- group_id (string): The contact group ID to update (required)
|
|
221
|
+
- name (string): Contact group name
|
|
222
|
+
- pos (number): Position/order in the list
|
|
223
|
+
|
|
224
|
+
Returns:
|
|
225
|
+
The updated contact group.`,
|
|
226
|
+
delete: `Delete a contact group from Holded.
|
|
227
|
+
|
|
228
|
+
Args:
|
|
229
|
+
- group_id (string): The contact group ID to delete (required)
|
|
230
|
+
|
|
231
|
+
Returns:
|
|
232
|
+
Confirmation of deletion.`,
|
|
233
|
+
},
|
|
234
|
+
formatters: {
|
|
235
|
+
list: formatContactGroupsMarkdown,
|
|
236
|
+
single: formatContactGroupMarkdown,
|
|
237
|
+
},
|
|
238
|
+
});
|
|
239
|
+
// ── Manual tools (attachment-specific endpoints) ──────
|
|
240
|
+
// List Contact Attachments
|
|
241
|
+
server.registerTool("holded_invoicing_list_contact_attachments", {
|
|
242
|
+
title: "List Holded Contact Attachments",
|
|
243
|
+
description: `Get attachments list for a given contact from Holded.
|
|
244
|
+
|
|
245
|
+
Args:
|
|
246
|
+
- contact_id (string): The contact ID to list attachments for (required)
|
|
247
|
+
- response_format ('json' | 'markdown'): Output format (default: 'json')
|
|
248
|
+
|
|
249
|
+
Returns:
|
|
250
|
+
Array of attachment file names.`,
|
|
251
|
+
inputSchema: ListContactAttachmentsInputSchema,
|
|
252
|
+
annotations: {
|
|
253
|
+
readOnlyHint: true,
|
|
254
|
+
destructiveHint: false,
|
|
255
|
+
idempotentHint: true,
|
|
256
|
+
openWorldHint: true,
|
|
257
|
+
},
|
|
258
|
+
}, withErrorHandling(async (params) => {
|
|
259
|
+
const typedParams = params;
|
|
260
|
+
const attachments = await makeApiRequest("invoicing", `contacts/${typedParams.contact_id}/attachments/list`, "GET");
|
|
261
|
+
let textContent;
|
|
262
|
+
if (typedParams.response_format === ResponseFormat.MARKDOWN) {
|
|
263
|
+
if (!attachments.length) {
|
|
264
|
+
textContent = `No attachments found for contact ${typedParams.contact_id}.`;
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
const lines = ["# Contact Attachments", "", `Found ${attachments.length} attachments:`, ""];
|
|
268
|
+
for (const attachment of attachments) {
|
|
269
|
+
lines.push(`- ${attachment}`);
|
|
270
|
+
}
|
|
271
|
+
textContent = lines.join("\n");
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
else {
|
|
275
|
+
textContent = JSON.stringify(attachments, null, 2);
|
|
276
|
+
}
|
|
277
|
+
return {
|
|
278
|
+
content: [{ type: "text", text: textContent }],
|
|
279
|
+
structuredContent: { attachments, count: attachments.length, contactId: typedParams.contact_id },
|
|
280
|
+
};
|
|
281
|
+
}));
|
|
282
|
+
// Get Contact Attachment
|
|
283
|
+
server.registerTool("holded_invoicing_get_contact_attachment", {
|
|
284
|
+
title: "Get Holded Contact Attachment",
|
|
285
|
+
description: `Get a specific attachment for a contact from Holded.
|
|
286
|
+
|
|
287
|
+
Args:
|
|
288
|
+
- contact_id (string): The contact ID (required)
|
|
289
|
+
- filename (string): The attachment filename (required)
|
|
290
|
+
- response_format ('json' | 'markdown'): Output format (default: 'json')
|
|
291
|
+
|
|
292
|
+
Returns:
|
|
293
|
+
Attachment file data (binary format, base64 encoded or URL).`,
|
|
294
|
+
inputSchema: GetContactAttachmentInputSchema,
|
|
295
|
+
annotations: {
|
|
296
|
+
readOnlyHint: true,
|
|
297
|
+
destructiveHint: false,
|
|
298
|
+
idempotentHint: true,
|
|
299
|
+
openWorldHint: true,
|
|
300
|
+
},
|
|
301
|
+
}, withErrorHandling(async (params) => {
|
|
302
|
+
const typedParams = params;
|
|
303
|
+
const result = await makeApiRequest("invoicing", `contacts/${typedParams.contact_id}/attachments/get`, "GET", undefined, { filename: typedParams.filename });
|
|
304
|
+
let textContent;
|
|
305
|
+
if (typedParams.response_format === ResponseFormat.MARKDOWN) {
|
|
306
|
+
if (typeof result === "string") {
|
|
307
|
+
textContent = `# Contact Attachment\n\n**File**: ${typedParams.filename}\n**Data**: ${result.substring(0, 100)}...`;
|
|
308
|
+
}
|
|
309
|
+
else {
|
|
310
|
+
textContent = result.url
|
|
311
|
+
? `# Contact Attachment\n\n**File**: ${typedParams.filename}\n**URL**: ${result.url}`
|
|
312
|
+
: `# Contact Attachment\n\n**File**: ${typedParams.filename}\nAttachment data available.`;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
else {
|
|
316
|
+
textContent = JSON.stringify(result, null, 2);
|
|
317
|
+
}
|
|
318
|
+
return {
|
|
319
|
+
content: [{ type: "text", text: textContent }],
|
|
320
|
+
structuredContent: { contactId: typedParams.contact_id, filename: typedParams.filename, data: result },
|
|
321
|
+
};
|
|
322
|
+
}));
|
|
323
|
+
// Upload Contact Attachment
|
|
324
|
+
server.registerTool("holded_invoicing_upload_contact_attachment", {
|
|
325
|
+
title: "Upload Holded Contact Attachment",
|
|
326
|
+
description: `Upload an attachment to a contact in Holded.
|
|
327
|
+
|
|
328
|
+
Args:
|
|
329
|
+
- contact_id (string): The contact ID to upload attachment to (required)
|
|
330
|
+
- file_content (string): File content as base64 encoded string (required)
|
|
331
|
+
- file_name (string): File name (required)
|
|
332
|
+
|
|
333
|
+
Returns:
|
|
334
|
+
Confirmation of attachment upload with status and info.`,
|
|
335
|
+
inputSchema: UploadContactAttachmentInputSchema,
|
|
336
|
+
annotations: {
|
|
337
|
+
readOnlyHint: false,
|
|
338
|
+
destructiveHint: false,
|
|
339
|
+
idempotentHint: false,
|
|
340
|
+
openWorldHint: true,
|
|
341
|
+
},
|
|
342
|
+
}, withErrorHandling(async (params) => {
|
|
343
|
+
const { contact_id, file_content, file_name } = params;
|
|
344
|
+
// Convert base64 to buffer
|
|
345
|
+
const fileBuffer = Buffer.from(file_content, "base64");
|
|
346
|
+
const result = await makeMultipartApiRequest("invoicing", `contacts/${contact_id}/attachments`, fileBuffer, file_name);
|
|
347
|
+
return {
|
|
348
|
+
content: [
|
|
349
|
+
{
|
|
350
|
+
type: "text",
|
|
351
|
+
text: `Contact attachment uploaded successfully.\n\n${JSON.stringify(result, null, 2)}`,
|
|
352
|
+
},
|
|
353
|
+
],
|
|
354
|
+
structuredContent: { uploaded: true, contactId: contact_id, fileName: file_name, ...result },
|
|
355
|
+
};
|
|
356
|
+
}));
|
|
357
|
+
}
|
|
358
|
+
//# sourceMappingURL=contacts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contacts.js","sourceRoot":"","sources":["../../../src/tools/invoicing/contacts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Document tools for Holded API (invoices, estimates, purchases, etc.)
|
|
3
|
+
*/
|
|
4
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
5
|
+
import { Document } from "../../types.js";
|
|
6
|
+
/**
|
|
7
|
+
* Format documents as markdown
|
|
8
|
+
*/
|
|
9
|
+
export declare function formatDocumentsMarkdown(documents: Document[], docType: string): string;
|
|
10
|
+
/**
|
|
11
|
+
* Format a single document as markdown
|
|
12
|
+
*/
|
|
13
|
+
export declare function formatDocumentMarkdown(doc: Document): string;
|
|
14
|
+
/**
|
|
15
|
+
* Register all document-related tools
|
|
16
|
+
*/
|
|
17
|
+
export declare function registerDocumentTools(server: McpServer): void;
|
|
18
|
+
//# sourceMappingURL=documents.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"documents.d.ts","sourceRoot":"","sources":["../../../src/tools/invoicing/documents.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAiC1C;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAmBtF;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,QAAQ,GAAG,MAAM,CAgC5D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwpB7D"}
|