@solumflow-app/crm-mcp-server 0.12.0 → 0.14.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 +142 -0
- package/dist/chunk-MQJCCLQU.js +7023 -0
- package/dist/chunk-MQJCCLQU.js.map +1 -0
- package/dist/index.js +7 -5817
- package/dist/index.js.map +1 -1
- package/dist/register-solumflow-tools.js +10 -0
- package/dist/register-solumflow-tools.js.map +1 -0
- package/package.json +10 -4
package/README.md
CHANGED
|
@@ -34,6 +34,13 @@ Any other MCP client takes the same command and the same two variables:
|
|
|
34
34
|
|
|
35
35
|
The server speaks over stdio. Errors go to stderr.
|
|
36
36
|
|
|
37
|
+
The same set of tools can be put on any `McpServer` with
|
|
38
|
+
`registerSolumFlowTools(server, client, { clientVersion, baseUrl, connectedAs })`
|
|
39
|
+
from `@solumflow-app/crm-mcp-server/register-tools`. `connectedAs` is `'key'`
|
|
40
|
+
for a server that runs on a key, as this one does, and `'app'` for one that
|
|
41
|
+
runs on the token of an app connected through OAuth as a person: the app uses
|
|
42
|
+
that for its online server, which then also has the knowledge base tools.
|
|
43
|
+
|
|
37
44
|
## Skills
|
|
38
45
|
|
|
39
46
|
The skills that walk an agent through connecting a website (a menu with
|
|
@@ -90,10 +97,145 @@ scope the key lacks answers `forbidden` and names the scope it needs.
|
|
|
90
97
|
| `list_api_webhooks` | `shop:manage` | The addresses told about changes, never their signing keys. |
|
|
91
98
|
| `upsert_api_webhook` | `shop:manage` | Make or change one, such as the site's revalidation route; a new one answers its signing key once. |
|
|
92
99
|
| `run_test_order` | `shop:manage`, `cart:write`, `orders:write`, `orders:read` | Cart, postage, order and a payment with Stripe's test card, read back until paid. Only in test mode. |
|
|
100
|
+
| `list_currencies` | `catalog:read` | The currencies the shop sells in, its own first. |
|
|
101
|
+
| `upsert_products` | `catalog:write` | Make or change many products in one call, each known by `source` + `externalRef`. |
|
|
102
|
+
| `set_product_extras` | `catalog:write` | Set what may be taken with a product. |
|
|
103
|
+
| `set_product_options` | `catalog:write` | Set the options with a surcharge on a product. |
|
|
104
|
+
| `delete_product` | `catalog:write` | Delete a product for good. |
|
|
105
|
+
| `delete_field` | `catalog:write` | Take a catalogue field away (to the trash). |
|
|
106
|
+
| `restore_field` | `catalog:write` | Bring a catalogue field back from the trash. |
|
|
107
|
+
| `get_category_by_ref` | `catalog:read` | Find a category by your own reference. |
|
|
108
|
+
| `upload_catalog_file` | `catalog:write` | Upload a picture or a file from disk for a product. |
|
|
109
|
+
| `get_consent_banner` | `website:manage` | Read the cookie banner. |
|
|
110
|
+
| `update_consent_banner` | `website:manage` | Set the cookie banner. |
|
|
111
|
+
| `list_form_definitions` | `forms:manage` | The forms to build, with their status. |
|
|
112
|
+
| `get_form_definition` | `forms:manage` | One form as the builder keeps it: fields, settings, spam settings. |
|
|
113
|
+
| `create_form` | `forms:manage` | Make an empty draft form. |
|
|
114
|
+
| `update_form` | `forms:manage` | Change a form, or publish it. |
|
|
115
|
+
| `get_hosting_order_page` | `hosting-order:manage` | Read the hosting order page. |
|
|
116
|
+
| `update_hosting_order_page` | `hosting-order:manage` | Set up the hosting order page. |
|
|
117
|
+
| `get_order` | `orders:read` | One order by number, id or PaymentIntent: status, lines, totals, the seller's mark and the customer account it made. Never the buyer. |
|
|
118
|
+
| `list_orders` | `orders:read` | The orders, a page by id; `sellerRef` narrows them to those paid through a link with `?ref=<sellerRef>`. |
|
|
119
|
+
| `list_record_lists` | `records:read` | The lists of contacts, companies and own records. |
|
|
120
|
+
| `search_records` | `records:read` | Search the records of one list. |
|
|
121
|
+
| `get_record` | `records:read` | One record with its fields. |
|
|
122
|
+
| `create_record` | `records:write` | Make a record. |
|
|
123
|
+
| `update_record` | `records:write` | Change a record. |
|
|
124
|
+
| `list_tags` | `records:read` | The tags of the account. |
|
|
125
|
+
| `list_notes` | `records:read` | The notes on a record. |
|
|
126
|
+
| `add_note` | `records:write` | Write a note on a record. |
|
|
127
|
+
| `upsert_contact` | `contacts:write` | Add a contact, or find the one already known. |
|
|
128
|
+
| `list_pipelines` | `deals:read` | The pipelines and their stages. |
|
|
129
|
+
| `list_deals` | `deals:read` | Deals, by pipeline, stage or contact. |
|
|
130
|
+
| `get_deal` | `deals:read` | One deal. |
|
|
131
|
+
| `create_deal` | `deals:write` | Make a deal. |
|
|
132
|
+
| `update_deal` | `deals:write` | Change or move a deal. |
|
|
133
|
+
| `list_deal_notes` | `deals:read` | The notes on a deal. |
|
|
134
|
+
| `add_deal_note` | `deals:write` | Write a note on a deal. |
|
|
135
|
+
| `list_tax_rates` | `documents:read` | The VAT rates. |
|
|
136
|
+
| `create_estimate_draft` | `documents:write` | Make a draft estimate. Numbering and sending stay in the app. |
|
|
137
|
+
| `update_estimate_draft` | `documents:write` | Change a draft estimate. |
|
|
138
|
+
| `create_invoice_draft` | `documents:write` | Make a draft invoice. |
|
|
139
|
+
| `update_invoice_draft` | `documents:write` | Change a draft invoice. |
|
|
140
|
+
| `list_payment_pages` | `payment-pages:read` | The payment pages. |
|
|
141
|
+
| `get_payment_page` | `payment-pages:read` | One payment page. |
|
|
142
|
+
| `create_payment_page` | `payment-pages:write` | Make a payment page. |
|
|
143
|
+
| `update_payment_page` | `payment-pages:write` | Change a payment page. |
|
|
144
|
+
| `list_email_templates` | `email-templates:manage` | The e-mail templates. |
|
|
145
|
+
| `get_email_template` | `email-templates:manage` | One e-mail template. |
|
|
146
|
+
| `create_email_template` | `email-templates:manage` | Save a new e-mail template. Never sends one. |
|
|
147
|
+
| `update_email_template` | `email-templates:manage` | Change an e-mail template. |
|
|
148
|
+
| `list_tasks` | `tasks:read`, or `projects:read` with `projectId` | Tasks outside projects; with `projectId`, the tasks of that project as the person behind the key sees them. |
|
|
149
|
+
| `get_task` | `tasks:read`, or `projects:read` with `projectId` | One task. |
|
|
150
|
+
| `create_task` | `tasks:write`, or `projects:write` with `projectId` | Make a task on a contact, a deal or nothing; with `projectId`, a task in that project in the person's name. |
|
|
151
|
+
| `update_task` | `tasks:write`, or `projects:write` with `projectId` | Change or complete a task. |
|
|
152
|
+
| `list_projects` | `projects:read` | Projects, groups and events the person behind the key sees. |
|
|
153
|
+
| `get_project` | `projects:read` | One of them. |
|
|
154
|
+
| `list_milestones` | `projects:read` | A project's milestones, in its own order. |
|
|
155
|
+
| `list_time_entries` | `time:read` | The person's hours in a period of at most 92 days, or a colleague's as far as they may read those. |
|
|
156
|
+
| `list_project_services` | `time:read` | What hours can be written on in a project: its services and hour types. |
|
|
157
|
+
| `add_time_entry` | `time:write` | Write an hour of the person, at the service's rate. |
|
|
158
|
+
| `update_time_entry` | `time:write` | Change one of the person's own hours; one on an invoice line stands. |
|
|
159
|
+
| `get_budget_report` | `time:read` | A project's budget per service, as the person's own screen reads it. |
|
|
160
|
+
| `list_project_channels` | `project-messages:write` | The group chats and channels chosen for the key. Names and ids, never messages. |
|
|
161
|
+
| `post_project_message` | `project-messages:write` | Post in a chosen channel, in the person's name. Mails the others in it, customers included. |
|
|
162
|
+
| `list_project_folders` | `project-files:write` | A project's folders, to upload into. |
|
|
163
|
+
| `upload_project_file` | `project-files:write` | Upload a file from this machine to a project. Never a secret-looking file. |
|
|
164
|
+
| `list_appointments` | `calendar:read` | Appointments outside projects, in a window of at most 92 days. |
|
|
165
|
+
| `get_appointment` | `calendar:read` | One appointment outside a project. |
|
|
166
|
+
| `upsert_calendar` | `calendar:manage` | Make or change a calendar by its slug: `event`, `round_robin`, or the account's own services calendar. |
|
|
167
|
+
| `set_calendar_availability` | `calendar:manage` | A calendar's weekly hours and its exceptions per date. |
|
|
168
|
+
| `upsert_services` | `calendar:manage` | Up to fifty bookable services by slug; one nobody performs gets the account's owner. |
|
|
169
|
+
| `site_builder_list_sites` | `sites:read` | The account's websites with their pages (id, path, language, published or not). |
|
|
170
|
+
| `site_builder_read_page` | `sites:read` | A page's draft as a tree of elements with ids; `includeCatalogue` adds the element types, style properties and design tokens. |
|
|
171
|
+
| `site_builder_edit_draft` | `sites:write` | Up to 100 targeted operations on a page's draft by element id: insert, delete, move, update, replace. The draft only. |
|
|
172
|
+
| `site_builder_html_to_draft` | `sites:write` | HTML with a style block turned into sections of a page's draft. The draft only. |
|
|
173
|
+
| `list_client_accounts` | `clients:manage` | The customer accounts a reseller sold, with their owner and modules. |
|
|
174
|
+
| `get_client_account` | `clients:manage` | One of them. |
|
|
175
|
+
| `create_client_account` | `clients:manage` | A customer account with a workspace of its own and a mail to its owner; the same owner twice makes nothing. |
|
|
176
|
+
| `set_client_modules` | `clients:manage` | The modules a customer account is sold with, within what the reseller may hand out. |
|
|
177
|
+
|
|
178
|
+
### Projects: the key acts as its person
|
|
179
|
+
|
|
180
|
+
Projects differ per person: who sees a members-only project, a task only for
|
|
181
|
+
a group's leads, a colleague's hours. So every project tool acts as the
|
|
182
|
+
person behind the key -- whoever made it, or approved the connected app --
|
|
183
|
+
and sees and may exactly what that person sees and may in the app. What it
|
|
184
|
+
makes (a task, an hour, a message, a file) is in that person's name, shown
|
|
185
|
+
in the app as "via <name of the key or app>". The tools never make or change
|
|
186
|
+
a project itself, its members or who sees it; they read no conversation and
|
|
187
|
+
open, share, move or delete no file. A message goes only to the channels
|
|
188
|
+
chosen for the key in the app, and mails the others in the channel.
|
|
93
189
|
|
|
94
190
|
Every catalogue tool takes an optional `object`: the slug of another catalogue
|
|
95
191
|
of the account (from `list_catalogs`). Left out, it is the account's own.
|
|
96
192
|
|
|
193
|
+
## Only on the online server
|
|
194
|
+
|
|
195
|
+
The knowledge base follows the rights of a person: who reads a category
|
|
196
|
+
depends on its audience, its groups and the people it is shared with. A key
|
|
197
|
+
has no person, so this server, which runs on a key, does not have these tools
|
|
198
|
+
and the API refuses a key on their routes. They are on the app's online server
|
|
199
|
+
(`/api/mcp`), where an app such as a Claude connector is connected through
|
|
200
|
+
OAuth as the person who approved it.
|
|
201
|
+
|
|
202
|
+
| Tool | Scope | What it does |
|
|
203
|
+
| --- | --- | --- |
|
|
204
|
+
| `list_kb_categories` | `knowledge-base:read` | The categories the person sees, where they may write, who reads each and whether the website chat answers from it |
|
|
205
|
+
| `search_kb` | `knowledge-base:read` | Articles found by meaning in their title and text, with the piece that matched |
|
|
206
|
+
| `list_kb_articles` | `knowledge-base:read` | Articles, in one category or all; a search on title and summary |
|
|
207
|
+
| `get_kb_article` | `knowledge-base:read` | One article's text as HTML, its status and its version |
|
|
208
|
+
| `create_kb_article` | `knowledge-base:write` | A new article, always a draft |
|
|
209
|
+
| `update_kb_article` | `knowledge-base:write` | A new title, summary or text, at the version that was read |
|
|
210
|
+
| `create_kb_category` | `knowledge-base:write` | A new category that only the team reads, with or without the website chat |
|
|
211
|
+
|
|
212
|
+
A category made here is always for the team alone; making it public, or
|
|
213
|
+
switching the website chat for a category that already exists, stays in the
|
|
214
|
+
app. `search_kb` embeds the question on Bedrock in Frankfurt and searches by
|
|
215
|
+
words alone, and says so, when that does not answer.
|
|
216
|
+
|
|
217
|
+
Publishing, taking offline, moving and deleting stay in the app; a published
|
|
218
|
+
article whose text is changed here is live at once. Every change is a new
|
|
219
|
+
version of the article's document, in the person's name. An article somebody
|
|
220
|
+
has open in the editor answers `article_in_use` until they close it.
|
|
221
|
+
|
|
222
|
+
## Customer accounts for a reseller
|
|
223
|
+
|
|
224
|
+
A key of a reseller with `clients:manage` sets up the accounts it sells:
|
|
225
|
+
`create_client_account`, `set_client_modules`, and for booking
|
|
226
|
+
`upsert_calendar`, `set_calendar_availability` and `upsert_services` through
|
|
227
|
+
that customer's own key. **A key for a customer is never made by a tool**:
|
|
228
|
+
whatever a tool answers lands in the agent's transcript. A script makes it
|
|
229
|
+
with the client package and hands it straight to where it is kept:
|
|
230
|
+
|
|
231
|
+
```ts
|
|
232
|
+
const key = await client.createClientApiKey(clientAccountId, {
|
|
233
|
+
name: 'Website',
|
|
234
|
+
scopes: ['website:manage', 'forms:manage', 'calendar:manage'],
|
|
235
|
+
});
|
|
236
|
+
// key.token exists only here: pass it on, never print it.
|
|
237
|
+
```
|
|
238
|
+
|
|
97
239
|
## After an update
|
|
98
240
|
|
|
99
241
|
An agent keeps the tool definitions it was handed when its session began, and a
|