@objectstack/connector-mcp 17.0.0-rc.0 → 17.0.0-rc.2
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/CHANGELOG.md +325 -0
- package/package.json +13 -7
- package/.turbo/turbo-build.log +0 -22
- package/src/connector-mcp-plugin.test.ts +0 -127
- package/src/connector-mcp-plugin.ts +0 -149
- package/src/index.ts +0 -39
- package/src/mcp-connector.test.ts +0 -194
- package/src/mcp-connector.ts +0 -272
- package/src/mcp-provider.test.ts +0 -193
- package/src/mcp-provider.ts +0 -205
- package/tsconfig.json +0 -10
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,330 @@
|
|
|
1
1
|
# @objectstack/connector-mcp
|
|
2
2
|
|
|
3
|
+
## 17.0.0-rc.2
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [430dcc2]
|
|
8
|
+
- Updated dependencies [e6ac4bd]
|
|
9
|
+
- Updated dependencies [80334c7]
|
|
10
|
+
- Updated dependencies [ce5242c]
|
|
11
|
+
- Updated dependencies [a7163ea]
|
|
12
|
+
- Updated dependencies [e6e9379]
|
|
13
|
+
- Updated dependencies [98877c9]
|
|
14
|
+
- Updated dependencies [98877c9]
|
|
15
|
+
- Updated dependencies [e6b1b69]
|
|
16
|
+
- Updated dependencies [ad047d2]
|
|
17
|
+
- Updated dependencies [2826d1e]
|
|
18
|
+
- Updated dependencies [5a84d41]
|
|
19
|
+
- Updated dependencies [20b1a9e]
|
|
20
|
+
- Updated dependencies [203a449]
|
|
21
|
+
- Updated dependencies [ac37fc6]
|
|
22
|
+
- Updated dependencies [4820f55]
|
|
23
|
+
- Updated dependencies [462d9c4]
|
|
24
|
+
- Updated dependencies [7d21581]
|
|
25
|
+
- Updated dependencies [f2445c9]
|
|
26
|
+
- Updated dependencies [23338c3]
|
|
27
|
+
- Updated dependencies [5b843fb]
|
|
28
|
+
- Updated dependencies [b4487aa]
|
|
29
|
+
- Updated dependencies [65ca83a]
|
|
30
|
+
- Updated dependencies [67bf2e2]
|
|
31
|
+
- Updated dependencies [c6d1cb4]
|
|
32
|
+
- Updated dependencies [36030ff]
|
|
33
|
+
- Updated dependencies [6117f7b]
|
|
34
|
+
- Updated dependencies [e533b0b]
|
|
35
|
+
- Updated dependencies [cdf4d9a]
|
|
36
|
+
- Updated dependencies [aee1806]
|
|
37
|
+
- Updated dependencies [c13350b]
|
|
38
|
+
- Updated dependencies [c13350b]
|
|
39
|
+
- Updated dependencies [9ca2d85]
|
|
40
|
+
- Updated dependencies [c13350b]
|
|
41
|
+
- Updated dependencies [891d345]
|
|
42
|
+
- Updated dependencies [a52e2ef]
|
|
43
|
+
- Updated dependencies [5293114]
|
|
44
|
+
- Updated dependencies [20bc357]
|
|
45
|
+
- Updated dependencies [5966c2a]
|
|
46
|
+
- Updated dependencies [2382580]
|
|
47
|
+
- Updated dependencies [d9fa683]
|
|
48
|
+
- Updated dependencies [3c7bcc0]
|
|
49
|
+
- Updated dependencies [4b6cac7]
|
|
50
|
+
- Updated dependencies [7631964]
|
|
51
|
+
- Updated dependencies [ac471a0]
|
|
52
|
+
- Updated dependencies [60ae58e]
|
|
53
|
+
- Updated dependencies [ce92674]
|
|
54
|
+
- Updated dependencies [9f601e8]
|
|
55
|
+
- Updated dependencies [51c5227]
|
|
56
|
+
- Updated dependencies [a4a85c8]
|
|
57
|
+
- Updated dependencies [07a4e26]
|
|
58
|
+
- Updated dependencies [ec975f1]
|
|
59
|
+
- Updated dependencies [eb4204b]
|
|
60
|
+
- Updated dependencies [4f13be2]
|
|
61
|
+
- Updated dependencies [61cc079]
|
|
62
|
+
- Updated dependencies [0e96e46]
|
|
63
|
+
- Updated dependencies [d52d4fe]
|
|
64
|
+
- Updated dependencies [742cebb]
|
|
65
|
+
- Updated dependencies [ce92674]
|
|
66
|
+
- Updated dependencies [cf2c9b7]
|
|
67
|
+
- Updated dependencies [833b512]
|
|
68
|
+
- Updated dependencies [0f9faa2]
|
|
69
|
+
- Updated dependencies [7cf42fe]
|
|
70
|
+
- Updated dependencies [5966c2a]
|
|
71
|
+
- Updated dependencies [f78dd83]
|
|
72
|
+
- Updated dependencies [a2cd18a]
|
|
73
|
+
- Updated dependencies [4638aaa]
|
|
74
|
+
- Updated dependencies [0222d3c]
|
|
75
|
+
- Updated dependencies [071d0dc]
|
|
76
|
+
- Updated dependencies [0a936ea]
|
|
77
|
+
- Updated dependencies [023c00b]
|
|
78
|
+
- Updated dependencies [155507e]
|
|
79
|
+
- Updated dependencies [7bba90b]
|
|
80
|
+
- Updated dependencies [7e05d8e]
|
|
81
|
+
- Updated dependencies [061406d]
|
|
82
|
+
- Updated dependencies [c1f344b]
|
|
83
|
+
- Updated dependencies [9c93465]
|
|
84
|
+
- Updated dependencies [ebb209c]
|
|
85
|
+
- Updated dependencies [63b33e6]
|
|
86
|
+
- Updated dependencies [2a44c1d]
|
|
87
|
+
- Updated dependencies [695cfbd]
|
|
88
|
+
- Updated dependencies [7445149]
|
|
89
|
+
- Updated dependencies [071d0dc]
|
|
90
|
+
- Updated dependencies [0848bea]
|
|
91
|
+
- Updated dependencies [d51bed2]
|
|
92
|
+
- Updated dependencies [b8b3c64]
|
|
93
|
+
- Updated dependencies [0c0fbd9]
|
|
94
|
+
- Updated dependencies [f3141d8]
|
|
95
|
+
- Updated dependencies [5a84d41]
|
|
96
|
+
- Updated dependencies [fd3013a]
|
|
97
|
+
- Updated dependencies [21676eb]
|
|
98
|
+
- Updated dependencies [e336549]
|
|
99
|
+
- Updated dependencies [d40f43a]
|
|
100
|
+
- Updated dependencies [e5e7ee0]
|
|
101
|
+
- Updated dependencies [a2ebea2]
|
|
102
|
+
- Updated dependencies [800bdb0]
|
|
103
|
+
- Updated dependencies [04f1182]
|
|
104
|
+
- Updated dependencies [5647006]
|
|
105
|
+
- Updated dependencies [38f7e4f]
|
|
106
|
+
- Updated dependencies [c57f3cf]
|
|
107
|
+
- Updated dependencies [97faca3]
|
|
108
|
+
- Updated dependencies [ad5fe25]
|
|
109
|
+
- Updated dependencies [ea90179]
|
|
110
|
+
- Updated dependencies [ce92674]
|
|
111
|
+
- Updated dependencies [5ef0b5b]
|
|
112
|
+
- Updated dependencies [48fbacb]
|
|
113
|
+
- Updated dependencies [355e951]
|
|
114
|
+
- Updated dependencies [dadb43f]
|
|
115
|
+
- @objectstack/spec@17.0.0-rc.2
|
|
116
|
+
- @objectstack/core@17.0.0-rc.2
|
|
117
|
+
|
|
118
|
+
## 17.0.0-rc.1
|
|
119
|
+
|
|
120
|
+
### Patch Changes
|
|
121
|
+
|
|
122
|
+
- 2e836de: chore(packaging): CHANGELOG.md ships in every npm tarball (#4261)
|
|
123
|
+
|
|
124
|
+
The AGENTS.md post-task checklist requires breaking changesets to carry their
|
|
125
|
+
FROM → TO migration because "this text ships to consumers as `CHANGELOG.md`
|
|
126
|
+
inside the npm package and is what an upgrading agent greps after the tombstone
|
|
127
|
+
error." That delivery path was severed for 68 of the 69 publishable packages:
|
|
128
|
+
npm packs `package.json` / `README*` / `LICENSE*` unconditionally but — unlike
|
|
129
|
+
older npm versions — not `CHANGELOG.md`, and the canonical
|
|
130
|
+
`"files": ["dist", "README.md"]` whitelist never named it. Measured on npm
|
|
131
|
+
10.9.7: `npm pack --dry-run` on `@objectstack/types` shipped 3 files while its
|
|
132
|
+
70KB `CHANGELOG.md` stayed behind. Only `@objectstack/spec` listed it
|
|
133
|
+
explicitly.
|
|
134
|
+
|
|
135
|
+
The tombstone-error scenario is precisely the one where the repo is out of
|
|
136
|
+
reach — the upgrading agent has `node_modules` and nothing else — so the
|
|
137
|
+
migration text has to ride in the tarball. Every publishable package now
|
|
138
|
+
declares `CHANGELOG.md` in `files`, and the canonical whitelist is
|
|
139
|
+
`["dist", "README.md", "CHANGELOG.md"]`.
|
|
140
|
+
|
|
141
|
+
The other half is the gate: `check:published-files` gains a fifth invariant,
|
|
142
|
+
COMPLETE — a whitelist that fails to cover `CHANGELOG.md` fails the
|
|
143
|
+
always-required lint job, so the next package cannot silently sever the path
|
|
144
|
+
again. `@objectstack/spec`'s per-package EXTRA_ENTRIES exemption dissolves
|
|
145
|
+
into the canonical set.
|
|
146
|
+
|
|
147
|
+
Consumer-visible change: one more file per install (the package's changelog,
|
|
148
|
+
e.g. 70.8KB for `@objectstack/types`), and `grep -r "removed key"
|
|
149
|
+
node_modules/@objectstack/*/CHANGELOG.md` now finds the migration it was
|
|
150
|
+
promised.
|
|
151
|
+
|
|
152
|
+
- cc2de0e: chore(packaging): 20 packages stop publishing their sources, tests and build tooling (#4248)
|
|
153
|
+
|
|
154
|
+
These 20 packages declared no `files` field, so npm fell back to packing the
|
|
155
|
+
whole package directory. `npm pack --dry-run` on `@objectstack/plugin-webhooks`
|
|
156
|
+
listed **21 files** — 15 under `src/`, three of them unit tests
|
|
157
|
+
(`auto-enqueuer.test.ts`, `bootstrap-declared-webhooks.test.ts`, …), plus the
|
|
158
|
+
build-time `scripts/i18n-extract.config.ts`. `dist/` lands on top of that at
|
|
159
|
+
publish time rather than instead of it, so consumers were installing the
|
|
160
|
+
TypeScript sources and the test suite alongside the artifact they asked for.
|
|
161
|
+
|
|
162
|
+
Each now declares `"files": ["dist", "README.md"]`, matching the 29 packages
|
|
163
|
+
that already did. Nothing a consumer imports moves: every `main` / `types` /
|
|
164
|
+
`exports` target in all 20 already resolved inside `dist/`, which the new
|
|
165
|
+
`check:published-files` guard verifies rather than assumes. The visible change
|
|
166
|
+
is a smaller install and a smaller dependency-scanning surface — `npm pack` on
|
|
167
|
+
`@objectstack/plugin-webhooks` now yields 2 files plus `dist/`.
|
|
168
|
+
|
|
169
|
+
The other half of the fix is the gate. Half the packages declaring `files` and
|
|
170
|
+
half not was the #3786 shape — a hand-copied convention with nothing enforcing
|
|
171
|
+
it, where whoever forgets the line gets no signal at all. `check:published-files`
|
|
172
|
+
(new, wired into the always-required `lint` job) holds every non-private
|
|
173
|
+
workspace package to four invariants: `files` is **declared**; it is
|
|
174
|
+
**sufficient** (covers every entry point, so tightening a whitelist cannot ship
|
|
175
|
+
a package that fails to resolve); it is **minimal** (admits no test, test-harness
|
|
176
|
+
config or build script); and anything beyond `dist` + `README.md` is
|
|
177
|
+
**registered** with a reason, reconciled in both directions so a stale exemption
|
|
178
|
+
is an error rather than dead text. `@objectstack/spec` is the one package with
|
|
179
|
+
registered extras — its `.zod.ts` sources, JSON Schemas, liveness ledgers and
|
|
180
|
+
`CHANGELOG.md` are product, not build input.
|
|
181
|
+
|
|
182
|
+
This also closes an assumption #4206 was resting on. Excluding `<pkg>/scripts/**`
|
|
183
|
+
from the docs-drift implementation test is sound only while no package publishes
|
|
184
|
+
`scripts/` as runtime code; that held, but it held because someone read all three
|
|
185
|
+
offenders by hand. It is now checked on every PR.
|
|
186
|
+
|
|
187
|
+
- Updated dependencies [6a67d7a]
|
|
188
|
+
- Updated dependencies [0ecc656]
|
|
189
|
+
- Updated dependencies [06772eb]
|
|
190
|
+
- Updated dependencies [270650f]
|
|
191
|
+
- Updated dependencies [3aef718]
|
|
192
|
+
- Updated dependencies [1ea6bce]
|
|
193
|
+
- Updated dependencies [c1dcacd]
|
|
194
|
+
- Updated dependencies [ad303ed]
|
|
195
|
+
- Updated dependencies [32ccb23]
|
|
196
|
+
- Updated dependencies [f5a4ef0]
|
|
197
|
+
- Updated dependencies [2d3e255]
|
|
198
|
+
- Updated dependencies [7d7521f]
|
|
199
|
+
- Updated dependencies [5dc4d02]
|
|
200
|
+
- Updated dependencies [05154a1]
|
|
201
|
+
- Updated dependencies [9b6fe7c]
|
|
202
|
+
- Updated dependencies [8c711fb]
|
|
203
|
+
- Updated dependencies [09e4547]
|
|
204
|
+
- Updated dependencies [91f4c78]
|
|
205
|
+
- Updated dependencies [820eff9]
|
|
206
|
+
- Updated dependencies [8d895ff]
|
|
207
|
+
- Updated dependencies [f6472d7]
|
|
208
|
+
- Updated dependencies [78caf51]
|
|
209
|
+
- Updated dependencies [62a789b]
|
|
210
|
+
- Updated dependencies [789ad63]
|
|
211
|
+
- Updated dependencies [2af1988]
|
|
212
|
+
- Updated dependencies [0af50a3]
|
|
213
|
+
- Updated dependencies [2e836de]
|
|
214
|
+
- Updated dependencies [12a19a8]
|
|
215
|
+
- Updated dependencies [41dcda3]
|
|
216
|
+
- Updated dependencies [c8124e5]
|
|
217
|
+
- Updated dependencies [a1a4140]
|
|
218
|
+
- Updated dependencies [217e2e6]
|
|
219
|
+
- Updated dependencies [86a71d1]
|
|
220
|
+
- Updated dependencies [d5c75e2]
|
|
221
|
+
- Updated dependencies [03d26f7]
|
|
222
|
+
- Updated dependencies [4384921]
|
|
223
|
+
- Updated dependencies [3c628ce]
|
|
224
|
+
- Updated dependencies [7cb922e]
|
|
225
|
+
- Updated dependencies [1d22114]
|
|
226
|
+
- Updated dependencies [b5f9397]
|
|
227
|
+
- Updated dependencies [ed77493]
|
|
228
|
+
- Updated dependencies [58a03d2]
|
|
229
|
+
- Updated dependencies [dc530b4]
|
|
230
|
+
- Updated dependencies [e59786e]
|
|
231
|
+
- Updated dependencies [bcf1112]
|
|
232
|
+
- Updated dependencies [9774b78]
|
|
233
|
+
- Updated dependencies [b07d829]
|
|
234
|
+
- Updated dependencies [a648e96]
|
|
235
|
+
- Updated dependencies [a47ac06]
|
|
236
|
+
- Updated dependencies [e4c61a7]
|
|
237
|
+
- Updated dependencies [cc60165]
|
|
238
|
+
- Updated dependencies [081aa6f]
|
|
239
|
+
- Updated dependencies [91f4c78]
|
|
240
|
+
- Updated dependencies [e8d0c21]
|
|
241
|
+
- Updated dependencies [45dc446]
|
|
242
|
+
- Updated dependencies [c1d44f7]
|
|
243
|
+
- Updated dependencies [ab9fb5c]
|
|
244
|
+
- Updated dependencies [f985b3f]
|
|
245
|
+
- Updated dependencies [9a4932a]
|
|
246
|
+
- Updated dependencies [f9fc874]
|
|
247
|
+
- Updated dependencies [011b386]
|
|
248
|
+
- Updated dependencies [7777e8f]
|
|
249
|
+
- Updated dependencies [507b92a]
|
|
250
|
+
- Updated dependencies [7309c81]
|
|
251
|
+
- Updated dependencies [20bc1ec]
|
|
252
|
+
- Updated dependencies [90c2b15]
|
|
253
|
+
- Updated dependencies [42eeb7d]
|
|
254
|
+
- Updated dependencies [01e124d]
|
|
255
|
+
- Updated dependencies [7ce02eb]
|
|
256
|
+
- Updated dependencies [a13827e]
|
|
257
|
+
- Updated dependencies [7733604]
|
|
258
|
+
- Updated dependencies [40e420f]
|
|
259
|
+
- Updated dependencies [d13004a]
|
|
260
|
+
- Updated dependencies [be7360c]
|
|
261
|
+
- Updated dependencies [5b47ab5]
|
|
262
|
+
- Updated dependencies [b09d8d9]
|
|
263
|
+
- Updated dependencies [b09d8d9]
|
|
264
|
+
- Updated dependencies [8675db6]
|
|
265
|
+
- Updated dependencies [b09d8d9]
|
|
266
|
+
- Updated dependencies [3eb1b2b]
|
|
267
|
+
- Updated dependencies [59b85c0]
|
|
268
|
+
- Updated dependencies [6e357ed]
|
|
269
|
+
- Updated dependencies [d6938bf]
|
|
270
|
+
- Updated dependencies [31e0be9]
|
|
271
|
+
- Updated dependencies [4bfd455]
|
|
272
|
+
- Updated dependencies [ffd2ce2]
|
|
273
|
+
- Updated dependencies [62f8017]
|
|
274
|
+
- Updated dependencies [a831df1]
|
|
275
|
+
- Updated dependencies [f752ee3]
|
|
276
|
+
- Updated dependencies [a1b61e0]
|
|
277
|
+
- Updated dependencies [cd6b9f2]
|
|
278
|
+
- Updated dependencies [2cb6d3c]
|
|
279
|
+
- Updated dependencies [af2a095]
|
|
280
|
+
- Updated dependencies [ec796d5]
|
|
281
|
+
- Updated dependencies [e87fea1]
|
|
282
|
+
- Updated dependencies [c65e529]
|
|
283
|
+
- Updated dependencies [3ca34c1]
|
|
284
|
+
- Updated dependencies [239c3a3]
|
|
285
|
+
- Updated dependencies [94a0bbc]
|
|
286
|
+
- Updated dependencies [d6bfb3d]
|
|
287
|
+
- Updated dependencies [a2266a6]
|
|
288
|
+
- Updated dependencies [d25a0ec]
|
|
289
|
+
- Updated dependencies [667b83e]
|
|
290
|
+
- Updated dependencies [627b188]
|
|
291
|
+
- Updated dependencies [8d4eae7]
|
|
292
|
+
- Updated dependencies [857a6cf]
|
|
293
|
+
- Updated dependencies [65a3a84]
|
|
294
|
+
- Updated dependencies [ccd9397]
|
|
295
|
+
- Updated dependencies [bca935b]
|
|
296
|
+
- Updated dependencies [d92c72d]
|
|
297
|
+
- Updated dependencies [c54c822]
|
|
298
|
+
- Updated dependencies [8dcc0f5]
|
|
299
|
+
- Updated dependencies [75b9e51]
|
|
300
|
+
- Updated dependencies [0a2f233]
|
|
301
|
+
- Updated dependencies [8621cdd]
|
|
302
|
+
- Updated dependencies [6f23667]
|
|
303
|
+
- Updated dependencies [5d21a48]
|
|
304
|
+
- Updated dependencies [19365b7]
|
|
305
|
+
- Updated dependencies [b7ed26d]
|
|
306
|
+
- Updated dependencies [b3a3d83]
|
|
307
|
+
- Updated dependencies [7a55913]
|
|
308
|
+
- Updated dependencies [35accbf]
|
|
309
|
+
- Updated dependencies [6038de7]
|
|
310
|
+
- Updated dependencies [eb95d97]
|
|
311
|
+
- Updated dependencies [e4c2dc8]
|
|
312
|
+
- Updated dependencies [1bd2795]
|
|
313
|
+
- Updated dependencies [8186a70]
|
|
314
|
+
- Updated dependencies [a329cca]
|
|
315
|
+
- Updated dependencies [6eec18c]
|
|
316
|
+
- Updated dependencies [4d7bebf]
|
|
317
|
+
- Updated dependencies [821ac7a]
|
|
318
|
+
- Updated dependencies [8f81731]
|
|
319
|
+
- Updated dependencies [8b50cb3]
|
|
320
|
+
- Updated dependencies [8c2db68]
|
|
321
|
+
- Updated dependencies [22b5e54]
|
|
322
|
+
- Updated dependencies [0166bd5]
|
|
323
|
+
- Updated dependencies [9b702dc]
|
|
324
|
+
- Updated dependencies [ab16331]
|
|
325
|
+
- @objectstack/spec@17.0.0-rc.1
|
|
326
|
+
- @objectstack/core@17.0.0-rc.1
|
|
327
|
+
|
|
3
328
|
## 17.0.0-rc.0
|
|
4
329
|
|
|
5
330
|
### Patch Changes
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@objectstack/connector-mcp",
|
|
3
|
-
"version": "17.0.0-rc.
|
|
3
|
+
"version": "17.0.0-rc.2",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"description": "Model Context Protocol (MCP) connector for ObjectStack — a generic adapter that turns any MCP server's tools into a connector's actions on the automation engine's connector registry (ADR-0024).",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -13,15 +13,15 @@
|
|
|
13
13
|
}
|
|
14
14
|
},
|
|
15
15
|
"dependencies": {
|
|
16
|
-
"@modelcontextprotocol/sdk": "^1.
|
|
17
|
-
"@objectstack/core": "17.0.0-rc.
|
|
18
|
-
"@objectstack/spec": "17.0.0-rc.
|
|
16
|
+
"@modelcontextprotocol/sdk": "^1.30.0",
|
|
17
|
+
"@objectstack/core": "17.0.0-rc.2",
|
|
18
|
+
"@objectstack/spec": "17.0.0-rc.2"
|
|
19
19
|
},
|
|
20
20
|
"devDependencies": {
|
|
21
|
-
"@types/node": "^26.1.
|
|
21
|
+
"@types/node": "^26.1.2",
|
|
22
22
|
"typescript": "^6.0.3",
|
|
23
23
|
"vitest": "^4.1.10",
|
|
24
|
-
"@objectstack/service-automation": "17.0.0-rc.
|
|
24
|
+
"@objectstack/service-automation": "17.0.0-rc.2"
|
|
25
25
|
},
|
|
26
26
|
"keywords": [
|
|
27
27
|
"objectstack",
|
|
@@ -32,8 +32,14 @@
|
|
|
32
32
|
"ai",
|
|
33
33
|
"tools"
|
|
34
34
|
],
|
|
35
|
+
"files": [
|
|
36
|
+
"dist",
|
|
37
|
+
"README.md",
|
|
38
|
+
"CHANGELOG.md"
|
|
39
|
+
],
|
|
35
40
|
"scripts": {
|
|
36
41
|
"build": "tsup --config ../../../tsup.config.ts",
|
|
37
|
-
"test": "vitest run --passWithNoTests"
|
|
42
|
+
"test": "vitest run --passWithNoTests",
|
|
43
|
+
"typecheck": "tsc --noEmit"
|
|
38
44
|
}
|
|
39
45
|
}
|
package/.turbo/turbo-build.log
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
> @objectstack/connector-mcp@17.0.0-rc.0 build /home/runner/work/objectstack/objectstack/packages/connectors/connector-mcp
|
|
3
|
-
> tsup --config ../../../tsup.config.ts
|
|
4
|
-
|
|
5
|
-
[34mCLI[39m Building entry: src/index.ts
|
|
6
|
-
[34mCLI[39m Using tsconfig: tsconfig.json
|
|
7
|
-
[34mCLI[39m tsup v8.5.1
|
|
8
|
-
[34mCLI[39m Using tsup config: /home/runner/work/objectstack/objectstack/tsup.config.ts
|
|
9
|
-
[34mCLI[39m Target: es2020
|
|
10
|
-
[34mCLI[39m Cleaning output folder
|
|
11
|
-
[34mESM[39m Build start
|
|
12
|
-
[34mCJS[39m Build start
|
|
13
|
-
[32mESM[39m [1mdist/index.mjs [22m[32m10.44 KB[39m
|
|
14
|
-
[32mESM[39m [1mdist/index.mjs.map [22m[32m32.67 KB[39m
|
|
15
|
-
[32mESM[39m ⚡️ Build success in 67ms
|
|
16
|
-
[32mCJS[39m [1mdist/index.js [22m[32m12.20 KB[39m
|
|
17
|
-
[32mCJS[39m [1mdist/index.js.map [22m[32m34.21 KB[39m
|
|
18
|
-
[32mCJS[39m ⚡️ Build success in 79ms
|
|
19
|
-
[34mDTS[39m Build start
|
|
20
|
-
[32mDTS[39m ⚡️ Build success in 13691ms
|
|
21
|
-
[32mDTS[39m [1mdist/index.d.mts [22m[32m10.93 KB[39m
|
|
22
|
-
[32mDTS[39m [1mdist/index.d.ts [22m[32m10.93 KB[39m
|
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
|
|
2
|
-
|
|
3
|
-
import { describe, it, expect } from 'vitest';
|
|
4
|
-
import { LiteKernel } from '@objectstack/core';
|
|
5
|
-
import { AutomationServicePlugin, type AutomationEngine } from '@objectstack/service-automation';
|
|
6
|
-
import { ConnectorMcpPlugin } from './connector-mcp-plugin.js';
|
|
7
|
-
import type { McpClientLike, McpToolDescriptor } from './mcp-connector.js';
|
|
8
|
-
|
|
9
|
-
const TOOLS: McpToolDescriptor[] = [
|
|
10
|
-
{
|
|
11
|
-
name: 'create_issue',
|
|
12
|
-
description: 'Create a GitHub issue',
|
|
13
|
-
inputSchema: {
|
|
14
|
-
type: 'object',
|
|
15
|
-
properties: { repo: { type: 'string' }, title: { type: 'string' } },
|
|
16
|
-
required: ['repo', 'title'],
|
|
17
|
-
},
|
|
18
|
-
},
|
|
19
|
-
];
|
|
20
|
-
|
|
21
|
-
/** A fake MCP client recording calls; injected via the plugin's clientFactory. */
|
|
22
|
-
function fakeClient() {
|
|
23
|
-
const calls: Array<{ name: string; args: Record<string, unknown> }> = [];
|
|
24
|
-
let closed = false;
|
|
25
|
-
const client: McpClientLike = {
|
|
26
|
-
listTools: async () => TOOLS,
|
|
27
|
-
callTool: async (name, args) => {
|
|
28
|
-
calls.push({ name, args });
|
|
29
|
-
return { content: [{ type: 'text', text: 'created #42' }], structuredContent: { number: 42 } };
|
|
30
|
-
},
|
|
31
|
-
close: async () => { closed = true; },
|
|
32
|
-
};
|
|
33
|
-
return { client, calls, isClosed: () => closed };
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
describe('ConnectorMcpPlugin — end to end with the automation engine', () => {
|
|
37
|
-
it('registers the MCP-backed connector so a connector_action flow dispatches to tools/call', async () => {
|
|
38
|
-
const { client, calls, isClosed } = fakeClient();
|
|
39
|
-
|
|
40
|
-
const kernel = new LiteKernel();
|
|
41
|
-
kernel.use(new AutomationServicePlugin());
|
|
42
|
-
kernel.use(
|
|
43
|
-
new ConnectorMcpPlugin({
|
|
44
|
-
// NOTE deliberately no `declarativeStdio`: the #3055 default-deny
|
|
45
|
-
// policy gates DECLARATIVE instances only — this hand-wired stdio
|
|
46
|
-
// transport (host code, not metadata) must keep working un-gated.
|
|
47
|
-
name: 'github_mcp',
|
|
48
|
-
label: 'GitHub MCP',
|
|
49
|
-
transport: { kind: 'stdio', command: 'noop' },
|
|
50
|
-
clientFactory: async () => client,
|
|
51
|
-
}),
|
|
52
|
-
);
|
|
53
|
-
await kernel.bootstrap();
|
|
54
|
-
|
|
55
|
-
const engine = kernel.getService<AutomationEngine>('automation');
|
|
56
|
-
|
|
57
|
-
// The baseline node and the MCP-backed connector are both present; to the
|
|
58
|
-
// registry it is an ordinary connector.
|
|
59
|
-
expect(engine.getRegisteredNodeTypes()).toContain('connector_action');
|
|
60
|
-
expect(engine.getRegisteredConnectors()).toContain('github_mcp');
|
|
61
|
-
|
|
62
|
-
engine.registerFlow('open_issue', {
|
|
63
|
-
name: 'open_issue',
|
|
64
|
-
label: 'Open an issue via MCP',
|
|
65
|
-
type: 'autolaunched',
|
|
66
|
-
variables: [{ name: 'call.structuredContent', type: 'json', isOutput: true }],
|
|
67
|
-
nodes: [
|
|
68
|
-
{ id: 'start', type: 'start', label: 'Start' },
|
|
69
|
-
{
|
|
70
|
-
id: 'call',
|
|
71
|
-
type: 'connector_action',
|
|
72
|
-
label: 'create_issue',
|
|
73
|
-
connectorConfig: {
|
|
74
|
-
connectorId: 'github_mcp',
|
|
75
|
-
actionId: 'create_issue',
|
|
76
|
-
input: { repo: 'acme/app', title: 'Bug' },
|
|
77
|
-
},
|
|
78
|
-
},
|
|
79
|
-
{ id: 'end', type: 'end', label: 'End' },
|
|
80
|
-
],
|
|
81
|
-
edges: [
|
|
82
|
-
{ id: 'e1', source: 'start', target: 'call' },
|
|
83
|
-
{ id: 'e2', source: 'call', target: 'end' },
|
|
84
|
-
],
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
const result = await engine.execute('open_issue');
|
|
88
|
-
|
|
89
|
-
expect(result.success).toBe(true);
|
|
90
|
-
// The MCP connector handled the dispatch: one tools/call with the input.
|
|
91
|
-
expect(calls).toEqual([{ name: 'create_issue', args: { repo: 'acme/app', title: 'Bug' } }]);
|
|
92
|
-
// The normalised structuredContent propagated back into the flow.
|
|
93
|
-
expect(result.output).toEqual({ 'call.structuredContent': { number: 42 } });
|
|
94
|
-
|
|
95
|
-
// Shutdown tears the MCP connection down.
|
|
96
|
-
await kernel.shutdown();
|
|
97
|
-
expect(isClosed()).toBe(true);
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
it('plumbs declarativeStdio through to the registered provider factory (#3055)', async () => {
|
|
101
|
-
const { client } = fakeClient();
|
|
102
|
-
let registered: ((ctx: unknown) => Promise<unknown>) | undefined;
|
|
103
|
-
const automationStub = {
|
|
104
|
-
registerConnector: () => {},
|
|
105
|
-
unregisterConnector: () => {},
|
|
106
|
-
registerConnectorProvider: (_key: string, factory: never) => { registered = factory; },
|
|
107
|
-
};
|
|
108
|
-
const plugin = new ConnectorMcpPlugin({
|
|
109
|
-
clientFactory: async () => client,
|
|
110
|
-
declarativeStdio: ['trusted-mcp'],
|
|
111
|
-
});
|
|
112
|
-
await plugin.init({
|
|
113
|
-
getService: () => automationStub,
|
|
114
|
-
logger: { info: () => {}, warn: () => {} },
|
|
115
|
-
} as never);
|
|
116
|
-
expect(registered).toBeDefined();
|
|
117
|
-
|
|
118
|
-
const provider = registered!;
|
|
119
|
-
const declarativeCtx = (command: string) => ({
|
|
120
|
-
name: 'x', label: 'X', type: 'api',
|
|
121
|
-
providerConfig: { transport: { kind: 'stdio', command } },
|
|
122
|
-
});
|
|
123
|
-
// Allowlisted command materializes; anything else is denied by policy.
|
|
124
|
-
await expect(provider(declarativeCtx('trusted-mcp'))).resolves.toBeDefined();
|
|
125
|
-
await expect(provider(declarativeCtx('bash'))).rejects.toThrow(/declarativeStdio allowlist/);
|
|
126
|
-
});
|
|
127
|
-
});
|
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
|
|
2
|
-
|
|
3
|
-
import type { Plugin, PluginContext } from '@objectstack/core';
|
|
4
|
-
import type { Connector, ConnectorProviderFactory } from '@objectstack/spec/integration';
|
|
5
|
-
import { createMcpConnector, type McpConnectorOptions } from './mcp-connector.js';
|
|
6
|
-
import {
|
|
7
|
-
createMcpProviderFactory,
|
|
8
|
-
MCP_PROVIDER_KEY,
|
|
9
|
-
type McpDeclarativeStdioPolicy,
|
|
10
|
-
} from './mcp-provider.js';
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Minimal surface of the automation engine this plugin depends on — the
|
|
14
|
-
* connector registry (ADR-0018 §Addendum) plus the provider registry (ADR-0097).
|
|
15
|
-
* Kept structural so the plugin needs no runtime dependency on
|
|
16
|
-
* `@objectstack/service-automation`.
|
|
17
|
-
*/
|
|
18
|
-
export interface ConnectorRegistrySurface {
|
|
19
|
-
registerConnector(
|
|
20
|
-
def: Connector,
|
|
21
|
-
handlers: Record<
|
|
22
|
-
string,
|
|
23
|
-
(input: Record<string, unknown>, ctx: unknown) => Promise<Record<string, unknown>>
|
|
24
|
-
>,
|
|
25
|
-
): void;
|
|
26
|
-
unregisterConnector(name: string): void;
|
|
27
|
-
registerConnectorProvider(providerKey: string, factory: ConnectorProviderFactory): void;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Options for {@link ConnectorMcpPlugin}. All optional (ADR-0097): with no
|
|
32
|
-
* `transport` the plugin contributes only the `mcp` provider factory — so a
|
|
33
|
-
* stack can declare `provider: 'mcp'` instances as pure metadata. Supply a
|
|
34
|
-
* `transport` to ALSO connect one hand-wired MCP server at `start()`.
|
|
35
|
-
*/
|
|
36
|
-
export interface ConnectorMcpPluginOptions extends Partial<McpConnectorOptions> {
|
|
37
|
-
/**
|
|
38
|
-
* Policy for stdio transports on **declarative** `provider: 'mcp'`
|
|
39
|
-
* instances (#3055). Default **deny**: metadata (including a runtime Studio
|
|
40
|
-
* publish) must not spawn local processes unless the host opts in.
|
|
41
|
-
* `string[]` allowlists specific commands; `true` allows any. Hand-wired
|
|
42
|
-
* connectors configured via these plugin options are not subject to it —
|
|
43
|
-
* their command lives in host code, not metadata.
|
|
44
|
-
*/
|
|
45
|
-
declarativeStdio?: McpDeclarativeStdioPolicy;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* ConnectorMcpPlugin — contributes the generic MCP adapter (ADR-0024) in two forms:
|
|
50
|
-
*
|
|
51
|
-
* 1. **Provider factory** (`mcp`, ADR-0097): registered at `init()` so the
|
|
52
|
-
* automation service can materialize declarative `provider: 'mcp'`
|
|
53
|
-
* `connectors:` entries — connecting to the server and mapping its tools to
|
|
54
|
-
* connector actions — at boot.
|
|
55
|
-
* 2. **Hand-wired instance** (optional, back-compat): when constructed with a
|
|
56
|
-
* `transport`, it also connects that one server at `start()` and registers
|
|
57
|
-
* the resulting connector.
|
|
58
|
-
*
|
|
59
|
-
* Lifecycle: on `start()` a configured instance connects and builds the
|
|
60
|
-
* connector once; on `destroy()` it tears the MCP connection down. If no
|
|
61
|
-
* automation engine is present — or the server is unreachable at boot — the
|
|
62
|
-
* hand-wired path logs and skips: a missing optional connector is not fatal
|
|
63
|
-
* (unlike a *declarative* provider-bound instance, which fails boot loudly).
|
|
64
|
-
*/
|
|
65
|
-
export class ConnectorMcpPlugin implements Plugin {
|
|
66
|
-
name = 'com.objectstack.connector.mcp';
|
|
67
|
-
version = '1.0.0';
|
|
68
|
-
type = 'standard' as const;
|
|
69
|
-
// Ensure the automation engine (and its connector/provider registries) exist first.
|
|
70
|
-
dependencies = ['com.objectstack.service-automation'];
|
|
71
|
-
|
|
72
|
-
private readonly options: ConnectorMcpPluginOptions;
|
|
73
|
-
private connectorName?: string;
|
|
74
|
-
private automation?: ConnectorRegistrySurface;
|
|
75
|
-
private close?: () => Promise<void>;
|
|
76
|
-
|
|
77
|
-
constructor(options: ConnectorMcpPluginOptions = {}) {
|
|
78
|
-
this.options = options;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
async init(ctx: PluginContext): Promise<void> {
|
|
82
|
-
// Contribute the `mcp` provider factory (ADR-0097) before the automation
|
|
83
|
-
// service materializes declarative instances during its start().
|
|
84
|
-
const automation = this.tryGetAutomation(ctx);
|
|
85
|
-
if (automation && typeof automation.registerConnectorProvider === 'function') {
|
|
86
|
-
automation.registerConnectorProvider(
|
|
87
|
-
MCP_PROVIDER_KEY,
|
|
88
|
-
createMcpProviderFactory({
|
|
89
|
-
clientFactory: this.options.clientFactory,
|
|
90
|
-
declarativeStdio: this.options.declarativeStdio,
|
|
91
|
-
}),
|
|
92
|
-
);
|
|
93
|
-
ctx.logger.info("ConnectorMcpPlugin: registered 'mcp' connector provider");
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
async start(ctx: PluginContext): Promise<void> {
|
|
98
|
-
// Provider-only usage (no transport) contributes just the factory in init().
|
|
99
|
-
if (!this.options.transport) return;
|
|
100
|
-
|
|
101
|
-
const automation = this.tryGetAutomation(ctx);
|
|
102
|
-
if (!automation || typeof automation.registerConnector !== 'function') {
|
|
103
|
-
ctx.logger.info('ConnectorMcpPlugin: no automation engine — MCP connector not registered');
|
|
104
|
-
return;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
let bundle;
|
|
108
|
-
try {
|
|
109
|
-
bundle = await createMcpConnector(this.options as McpConnectorOptions);
|
|
110
|
-
} catch (err) {
|
|
111
|
-
// The MCP server is unreachable / failed discovery at boot. Skip the
|
|
112
|
-
// optional connector rather than failing the whole bootstrap.
|
|
113
|
-
ctx.logger.warn(
|
|
114
|
-
`ConnectorMcpPlugin: could not connect to MCP server — connector not registered: ${(err as Error).message}`,
|
|
115
|
-
);
|
|
116
|
-
return;
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
automation.registerConnector(bundle.def, bundle.handlers);
|
|
120
|
-
this.automation = automation;
|
|
121
|
-
this.connectorName = bundle.def.name;
|
|
122
|
-
this.close = bundle.close;
|
|
123
|
-
ctx.logger.info(
|
|
124
|
-
`ConnectorMcpPlugin: MCP connector '${bundle.def.name}' registered with ${bundle.def.actions?.length ?? 0} action(s)`,
|
|
125
|
-
);
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
/**
|
|
129
|
-
* Destroy phase — the kernel's shutdown hook (the `Plugin` lifecycle exposes
|
|
130
|
-
* `destroy()`, not `stop()`). Unregister the connector and tear the MCP
|
|
131
|
-
* connection down so no child process / socket is leaked.
|
|
132
|
-
*/
|
|
133
|
-
async destroy(): Promise<void> {
|
|
134
|
-
if (this.automation && this.connectorName) {
|
|
135
|
-
try { this.automation.unregisterConnector(this.connectorName); } catch { /* ignore */ }
|
|
136
|
-
}
|
|
137
|
-
if (this.close) {
|
|
138
|
-
try { await this.close(); } catch { /* ignore */ }
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
private tryGetAutomation(ctx: PluginContext): ConnectorRegistrySurface | undefined {
|
|
143
|
-
try {
|
|
144
|
-
return ctx.getService<ConnectorRegistrySurface>('automation');
|
|
145
|
-
} catch {
|
|
146
|
-
return undefined;
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
}
|