@celigo/api-specs 0.2.210 → 0.2.212
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/dist/import.yml +45 -15
- package/dist/mcp-registry.yml +865 -0
- package/dist/mcp-server.yml +4 -0
- package/dist/tool.yml +82 -15
- package/package.json +1 -1
- package/schemas.json +2 -2
package/dist/import.yml
CHANGED
|
@@ -4286,13 +4286,13 @@ components:
|
|
|
4286
4286
|
jsonPath:
|
|
4287
4287
|
type: string
|
|
4288
4288
|
description: |
|
|
4289
|
-
JSONPath
|
|
4290
|
-
data feeding this subrecord. Semantics depend
|
|
4289
|
+
JSONPath from the source record root that selects
|
|
4290
|
+
the data feeding this subrecord. Semantics depend
|
|
4291
4291
|
on placement:
|
|
4292
4292
|
* Line-level (on `lists[].fields[].`
|
|
4293
|
-
`subRecordMapping`) —
|
|
4294
|
-
|
|
4295
|
-
|
|
4293
|
+
`subRecordMapping`) — the array of lines the
|
|
4294
|
+
sublist iterates (`lineItems`); `$` only when
|
|
4295
|
+
each record is itself one line.
|
|
4296
4296
|
* Body-level (on `fields[].subRecordMapping`)
|
|
4297
4297
|
— a path into the source record root.
|
|
4298
4298
|
Defaults to `$`.
|
|
@@ -4484,9 +4484,10 @@ components:
|
|
|
4484
4484
|
type: boolean
|
|
4485
4485
|
description: |-
|
|
4486
4486
|
When true, this field is a key for matching the record's existing sublist lines: a
|
|
4487
|
-
mapped line updates the one existing line whose key fields hold the same values
|
|
4488
|
-
|
|
4489
|
-
|
|
4487
|
+
mapped line updates the one existing line whose key fields hold the same values —
|
|
4488
|
+
every key field must match, so several keys narrow the match. `lists` says which
|
|
4489
|
+
records match lines, the keys used when no field sets `isKey`, and what a line that
|
|
4490
|
+
matches no line, or several, does.
|
|
4490
4491
|
immutable:
|
|
4491
4492
|
type: boolean
|
|
4492
4493
|
description: When true, this field is only set on record creation, not on updates.
|
|
@@ -4565,13 +4566,19 @@ components:
|
|
|
4565
4566
|
jsonPath:
|
|
4566
4567
|
type: string
|
|
4567
4568
|
description: |
|
|
4568
|
-
|
|
4569
|
-
|
|
4570
|
-
subrecord
|
|
4571
|
-
|
|
4572
|
-
|
|
4573
|
-
|
|
4574
|
-
Defaults to `$`.
|
|
4569
|
+
Path from the source record root to the
|
|
4570
|
+
array of lines whose elements feed this
|
|
4571
|
+
subrecord — the same array the sublist
|
|
4572
|
+
iterates (`lineItems`, `items`); the n-th
|
|
4573
|
+
element populates the n-th sublist line.
|
|
4574
|
+
`$` only when each source record is itself
|
|
4575
|
+
one line. Defaults to `$`.
|
|
4576
|
+
x-celigo-ai-guidance:
|
|
4577
|
+
- |-
|
|
4578
|
+
`$` on a record whose lines sit under a field renders no subrecord for any
|
|
4579
|
+
line, and NetSuite rejects the first numbered line with `Please configure the
|
|
4580
|
+
inventory detail in line N of the item list`; name the line array
|
|
4581
|
+
(`lineItems`), never the current-line context.
|
|
4575
4582
|
mapping:
|
|
4576
4583
|
type: object
|
|
4577
4584
|
description: |
|
|
@@ -4682,6 +4689,11 @@ components:
|
|
|
4682
4689
|
with `MULTIPLE_LINES_WITH_SAME_KEYS` ("Multiple lines found with keys item=<value> ..."). A
|
|
4683
4690
|
line that matches none is added as a new line, which an item fulfillment's `item` sublist
|
|
4684
4691
|
refuses with `SSS_INVALID_SUBLIST_OPERATION`: its lines are its order's.
|
|
4692
|
+
|
|
4693
|
+
On a fulfillment created from an order, a kit's lot-, serial- or bin-managed components are
|
|
4694
|
+
lines of their own under the kit's line, each with its own `line` and `orderline` (the
|
|
4695
|
+
component's own order line) and `kitmemberof` holding the kit line's id; the inventory detail
|
|
4696
|
+
belongs on those component lines, and a kit line refuses it.
|
|
4685
4697
|
x-celigo-ai-guidance:
|
|
4686
4698
|
- |-
|
|
4687
4699
|
To make an update replace a sublist's lines, also map the body field
|
|
@@ -4696,6 +4708,24 @@ components:
|
|
|
4696
4708
|
field, or, on a fulfillment, the order line's id mapped to `orderline`. Keying on the item fails
|
|
4697
4709
|
with `MULTIPLE_LINES_WITH_SAME_KEYS` when an order holds the same item on two lines, and records
|
|
4698
4710
|
that already hold repeated lines fail the same way once a key is set.
|
|
4711
|
+
- |-
|
|
4712
|
+
A key field is read from the existing lines, never written, so a read-only field keys as well
|
|
4713
|
+
as a writable one. The mapper's "Items : Line ID" is `line` (the fulfillment's own line number,
|
|
4714
|
+
equal to the order line only on a fresh full transform) and "Items : Line Number" is `linenum`;
|
|
4715
|
+
`orderline` and `kitmemberof` are not in its picker — type `item[*].orderline` /
|
|
4716
|
+
`item[*].kitmemberof` as the destination.
|
|
4717
|
+
- |-
|
|
4718
|
+
Kit components on a fulfillment: the item is the only default key that reaches a component
|
|
4719
|
+
line, so a component two kit lines share fails with `MULTIPLE_LINES_WITH_SAME_KEYS`. Keying the
|
|
4720
|
+
component rows on the KIT's order line (`line` or `orderline`) selects the kit line instead and
|
|
4721
|
+
the save fails with `You cannot create an inventory detail for this item`. When the source
|
|
4722
|
+
carries the kit's order line on its component rows, keep the item as a key and add
|
|
4723
|
+
`item[*].kitmemberof` mapped from that line id as a second key, keep the kit rows in the list
|
|
4724
|
+
(their empty `kitmemberof` matches the kit line) with `item[*].celigo_ignore_current_line_invdetail_subrecord`
|
|
4725
|
+
true so no inventory detail is written on them, and build the inventory detail from each
|
|
4726
|
+
component row's own picks; component rows alone leave every kit line unfulfilled (`You must
|
|
4727
|
+
enter at least one line item for this transaction`). When the source can supply each
|
|
4728
|
+
component line's own order line id, key every row on `orderline` instead.
|
|
4699
4729
|
x-celigo-agent:
|
|
4700
4730
|
- mapping
|
|
4701
4731
|
lookups:
|
|
@@ -0,0 +1,865 @@
|
|
|
1
|
+
openapi: 3.2.0
|
|
2
|
+
info:
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
title: MCP Registry
|
|
5
|
+
description: Read-only MCP Registry v0.1 discovery of the MCP servers a credential can connect to, one registry per account environment alias.
|
|
6
|
+
servers:
|
|
7
|
+
- url: https://api.integrator.io
|
|
8
|
+
description: Production (US / default region)
|
|
9
|
+
- url: https://api.eu.integrator.io
|
|
10
|
+
description: Production (EU region)
|
|
11
|
+
- url: https://api.au.integrator.io
|
|
12
|
+
description: Production (AU region)
|
|
13
|
+
- url: https://api.ca.integrator.io
|
|
14
|
+
description: Production (CA region)
|
|
15
|
+
security:
|
|
16
|
+
- bearerAuth: []
|
|
17
|
+
- {}
|
|
18
|
+
tags:
|
|
19
|
+
- name: MCP Registry
|
|
20
|
+
description: |-
|
|
21
|
+
Every account environment that has an MCP account alias has a registry at
|
|
22
|
+
`https://api.integrator.io/mcp/{accountAlias}/registry` (the region's API
|
|
23
|
+
host for EU / AU / CA) — one URL that lists the environment's enabled MCP
|
|
24
|
+
servers, each with the URL a client connects to, in the MCP Registry v0.1
|
|
25
|
+
format. It is read-only and grants nothing: a caller sees exactly the
|
|
26
|
+
servers its credential can already connect to — every enabled server for a
|
|
27
|
+
full-access API token, the account owner, administrators and users with
|
|
28
|
+
access to all MCP servers; the selected servers for a custom-scoped token;
|
|
29
|
+
the granted servers for other workspace users, personal access tokens
|
|
30
|
+
(their owner's access at the moment of the request) and end users. A
|
|
31
|
+
sign-in lists only servers with an identity provider (Celigo Identity or
|
|
32
|
+
Token validation), since it cannot connect to a token-only server.
|
|
33
|
+
Disabled, deleted and sandbox servers are never listed, and the list
|
|
34
|
+
changes on the next read when access or a server changes. Servers are
|
|
35
|
+
created and changed through `/v1/mcpservers`; this surface is a
|
|
36
|
+
projection, never a write path. The registry is not an MCP server — add
|
|
37
|
+
each server's own `remotes[].url` to an AI client, never the registry URL.
|
|
38
|
+
|
|
39
|
+
On a private alias — every account today — a missing, invalid, expired or
|
|
40
|
+
revoked bearer draws `401` with `WWW-Authenticate: Bearer
|
|
41
|
+
resource_metadata="<registry PRM URL>"`, identical for real and unknown
|
|
42
|
+
aliases (a registry reader that sends no credential, such as VS Code's
|
|
43
|
+
gallery, sees `401` and no servers), and a valid credential never draws
|
|
44
|
+
the challenge: one that can reach nothing, belongs to another account or
|
|
45
|
+
environment, or names an unknown alias gets `200` with `{servers: [],
|
|
46
|
+
metadata: {count: 0}}` on the listing endpoints, so a response never
|
|
47
|
+
reveals which accounts or servers exist. The version item (`GET
|
|
48
|
+
…/versions/{version}`, including `latest`) is the only read that answers
|
|
49
|
+
`404`, uniformly, when the version is not visible. Registry CORS allows
|
|
50
|
+
every origin on `GET` and exposes `WWW-Authenticate` so browser clients
|
|
51
|
+
can read the challenge.
|
|
52
|
+
|
|
53
|
+
Accounts opted into the public-listing lane — a pre-GA account setting with
|
|
54
|
+
no product surface yet, paired with a per-server publish flag — answer
|
|
55
|
+
anonymous reads with their published servers (`200`, possibly empty)
|
|
56
|
+
instead of `401`, and an authenticated read with the published set joined
|
|
57
|
+
to the entitled set; `_meta["io.celigo.registry/entry"].visibility` tells
|
|
58
|
+
the two apart, and each operation below states its opted-in result.
|
|
59
|
+
|
|
60
|
+
## MCP registry schemas
|
|
61
|
+
|
|
62
|
+
{% openapi-schemas spec="mcp-registry" schemas="ServerListResponse,ServerResponse,ProtectedResourceMetadata,Problem" grouped="true" %}
|
|
63
|
+
paths:
|
|
64
|
+
/mcp/{accountAlias}/registry/v0.1/servers:
|
|
65
|
+
get:
|
|
66
|
+
x-internal: false
|
|
67
|
+
summary: List discoverable MCP servers
|
|
68
|
+
description: |-
|
|
69
|
+
Lists the MCP servers the presented credential can connect to on this
|
|
70
|
+
alias as an MCP Registry v0.1 `ServerListResponse`. `search` matches
|
|
71
|
+
`name` and `title`; `limit` defaults to 30 and values above 100 are
|
|
72
|
+
clamped to 100. Entries are sorted by `server.name`, then by internal
|
|
73
|
+
id, in binary order. Disabled, deleted and sandbox servers are never
|
|
74
|
+
listed, nor is the platform's own `io-mcp-server`. Every registry
|
|
75
|
+
response carries an `X-Request-Id` header.
|
|
76
|
+
|
|
77
|
+
On a private alias (every account today — the public-listing opt-in is
|
|
78
|
+
pre-GA) a missing or invalid bearer draws `401` with the `WWW-Authenticate`
|
|
79
|
+
challenge, and a valid credential never does: when it can reach nothing,
|
|
80
|
+
belongs to another account or environment, or the alias is unknown, the
|
|
81
|
+
response is `200` with `{servers: [], metadata: {count: 0}}`. On an alias
|
|
82
|
+
opted into the public-listing lane, an anonymous or wrong-account caller
|
|
83
|
+
gets the published set (`200`, possibly empty) instead of the `401` or the
|
|
84
|
+
empty list, and an authenticated caller its entitled set joined to the
|
|
85
|
+
published set; an invalid bearer still draws `401` there. This listing
|
|
86
|
+
never answers `404` for lack of visibility. Requests carrying
|
|
87
|
+
`updated_since` or `include_deleted` receive `400`.
|
|
88
|
+
operationId: listMcpRegistryServers
|
|
89
|
+
tags:
|
|
90
|
+
- MCP Registry
|
|
91
|
+
security:
|
|
92
|
+
- bearerAuth: []
|
|
93
|
+
- {}
|
|
94
|
+
parameters:
|
|
95
|
+
- $ref: '#/components/parameters/AccountAlias'
|
|
96
|
+
- name: limit
|
|
97
|
+
in: query
|
|
98
|
+
description: Page size. Defaults to 30. Values above 100 are clamped to 100 rather than rejected; non-integer values return `400`.
|
|
99
|
+
schema:
|
|
100
|
+
type: integer
|
|
101
|
+
default: 30
|
|
102
|
+
minimum: 1
|
|
103
|
+
maximum: 100
|
|
104
|
+
- name: cursor
|
|
105
|
+
in: query
|
|
106
|
+
description: Opaque pagination cursor from the previous response's `metadata.nextCursor`. Cursors that cannot be decoded return `400`.
|
|
107
|
+
schema:
|
|
108
|
+
type: string
|
|
109
|
+
- name: search
|
|
110
|
+
in: query
|
|
111
|
+
description: Case-insensitive substring match against each entry's `name` and `title`. Applied after visibility filtering, so search never widens visibility.
|
|
112
|
+
schema:
|
|
113
|
+
type: string
|
|
114
|
+
responses:
|
|
115
|
+
'200':
|
|
116
|
+
description: |-
|
|
117
|
+
Servers visible on this lane. Opted-in with zero published servers
|
|
118
|
+
returns `{servers:[], metadata:{count:0}}`.
|
|
119
|
+
content:
|
|
120
|
+
application/json:
|
|
121
|
+
schema:
|
|
122
|
+
$ref: '#/components/schemas/ServerListResponse'
|
|
123
|
+
examples:
|
|
124
|
+
entitled:
|
|
125
|
+
summary: One visible server, more pages available
|
|
126
|
+
value:
|
|
127
|
+
servers:
|
|
128
|
+
- server:
|
|
129
|
+
$schema: https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json
|
|
130
|
+
name: com.celigo.acme-corp-prod/support-tools
|
|
131
|
+
title: Support tools
|
|
132
|
+
description: Ticket lookup and escalation tools for the support team.
|
|
133
|
+
version: 1.0.0
|
|
134
|
+
remotes:
|
|
135
|
+
- type: streamable-http
|
|
136
|
+
url: https://api.integrator.io/mcp/acme-corp-prod/support-tools
|
|
137
|
+
_meta:
|
|
138
|
+
io.modelcontextprotocol.registry/official:
|
|
139
|
+
status: active
|
|
140
|
+
publishedAt: '2026-03-02T09:14:00.000Z'
|
|
141
|
+
updatedAt: '2026-08-14T09:12:33.000Z'
|
|
142
|
+
statusChangedAt: '2026-03-02T09:14:00.000Z'
|
|
143
|
+
isLatest: true
|
|
144
|
+
io.celigo.registry/entry:
|
|
145
|
+
visibility: entitled
|
|
146
|
+
access: entitled
|
|
147
|
+
metadata:
|
|
148
|
+
count: 1
|
|
149
|
+
nextCursor: eyJuIjoiU3VwcG9ydCBUb29scyIsImlkIjoiNjY1ZjFjMmU5YjBjNGQwMDFlOGY3YTIzIn0
|
|
150
|
+
empty:
|
|
151
|
+
summary: Allowed on this lane with nothing visible
|
|
152
|
+
value:
|
|
153
|
+
servers: []
|
|
154
|
+
metadata:
|
|
155
|
+
count: 0
|
|
156
|
+
'400':
|
|
157
|
+
$ref: '#/components/responses/400-bad-request'
|
|
158
|
+
'401':
|
|
159
|
+
$ref: '#/components/responses/401-unauthorized'
|
|
160
|
+
'429':
|
|
161
|
+
$ref: '#/components/responses/429-too-many-requests'
|
|
162
|
+
'503':
|
|
163
|
+
$ref: '#/components/responses/503-service-unavailable'
|
|
164
|
+
/mcp/{accountAlias}/registry/v0.1/servers/{serverName}/versions:
|
|
165
|
+
get:
|
|
166
|
+
x-internal: false
|
|
167
|
+
summary: List versions of an MCP server
|
|
168
|
+
description: |-
|
|
169
|
+
Versions listing for one server. Celigo servers are single-version, so
|
|
170
|
+
a visible server returns exactly one entry (`1.0.0`, `isLatest: true`).
|
|
171
|
+
|
|
172
|
+
This is a listing endpoint: a caller allowed on its lane for whom the
|
|
173
|
+
server is not visible gets `200` with an empty list — never `404`. On a
|
|
174
|
+
private alias a missing or invalid bearer draws `401` with the
|
|
175
|
+
`WWW-Authenticate` challenge and a valid credential without access to
|
|
176
|
+
the server (a wrong-account one included) gets the empty list; on an
|
|
177
|
+
alias opted into the pre-GA public-listing lane an anonymous or
|
|
178
|
+
wrong-account caller sees a published server's entry (or an empty list
|
|
179
|
+
for an unpublished one), an authenticated caller sees it when it is
|
|
180
|
+
published or entitled, and an invalid bearer still draws `401`.
|
|
181
|
+
operationId: listMcpRegistryServerVersions
|
|
182
|
+
tags:
|
|
183
|
+
- MCP Registry
|
|
184
|
+
security:
|
|
185
|
+
- bearerAuth: []
|
|
186
|
+
- {}
|
|
187
|
+
parameters:
|
|
188
|
+
- $ref: '#/components/parameters/AccountAlias'
|
|
189
|
+
- $ref: '#/components/parameters/ServerName'
|
|
190
|
+
responses:
|
|
191
|
+
'200':
|
|
192
|
+
description: |-
|
|
193
|
+
One version when the server is visible on this lane; empty list
|
|
194
|
+
when the caller is allowed and nothing is visible.
|
|
195
|
+
content:
|
|
196
|
+
application/json:
|
|
197
|
+
schema:
|
|
198
|
+
$ref: '#/components/schemas/ServerListResponse'
|
|
199
|
+
examples:
|
|
200
|
+
visible:
|
|
201
|
+
summary: Constant 1.0.0 entry
|
|
202
|
+
value:
|
|
203
|
+
servers:
|
|
204
|
+
- server:
|
|
205
|
+
$schema: https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json
|
|
206
|
+
name: com.celigo.acme-corp-prod/support-tools
|
|
207
|
+
title: Support tools
|
|
208
|
+
description: Ticket lookup and escalation tools for the support team.
|
|
209
|
+
version: 1.0.0
|
|
210
|
+
remotes:
|
|
211
|
+
- type: streamable-http
|
|
212
|
+
url: https://api.integrator.io/mcp/acme-corp-prod/support-tools
|
|
213
|
+
_meta:
|
|
214
|
+
io.modelcontextprotocol.registry/official:
|
|
215
|
+
status: active
|
|
216
|
+
publishedAt: '2026-03-02T09:14:00.000Z'
|
|
217
|
+
updatedAt: '2026-08-14T09:12:33.000Z'
|
|
218
|
+
statusChangedAt: '2026-03-02T09:14:00.000Z'
|
|
219
|
+
isLatest: true
|
|
220
|
+
io.celigo.registry/entry:
|
|
221
|
+
visibility: entitled
|
|
222
|
+
access: entitled
|
|
223
|
+
metadata:
|
|
224
|
+
count: 1
|
|
225
|
+
empty:
|
|
226
|
+
summary: Allowed on this lane with nothing visible
|
|
227
|
+
value:
|
|
228
|
+
servers: []
|
|
229
|
+
metadata:
|
|
230
|
+
count: 0
|
|
231
|
+
'401':
|
|
232
|
+
$ref: '#/components/responses/401-unauthorized'
|
|
233
|
+
'429':
|
|
234
|
+
$ref: '#/components/responses/429-too-many-requests'
|
|
235
|
+
'503':
|
|
236
|
+
$ref: '#/components/responses/503-service-unavailable'
|
|
237
|
+
/mcp/{accountAlias}/registry/v0.1/servers/{serverName}/versions/{version}:
|
|
238
|
+
get:
|
|
239
|
+
x-internal: false
|
|
240
|
+
summary: Get an MCP server version
|
|
241
|
+
description: |-
|
|
242
|
+
Per-version read. `{version}` accepts the literal `latest` or `1.0.0`
|
|
243
|
+
— they are equivalent. Any other version string is not visible.
|
|
244
|
+
|
|
245
|
+
This is the only registry item read: when the version is not visible
|
|
246
|
+
to the caller the response is a uniform `404` (unknown server, wrong
|
|
247
|
+
version, unpublished, or no access — indistinguishable), with the body
|
|
248
|
+
`detail` "Server not found."; listing endpoints never use this `404`.
|
|
249
|
+
On a private alias a missing or invalid bearer draws `401` with the
|
|
250
|
+
`WWW-Authenticate` challenge and a valid credential never does (a
|
|
251
|
+
wrong-account credential gets the `404`); on an alias opted into the
|
|
252
|
+
pre-GA public-listing lane an anonymous or wrong-account caller gets
|
|
253
|
+
`200` for a published version and `404` otherwise, an authenticated
|
|
254
|
+
caller `200` when it is published or entitled, and an invalid bearer
|
|
255
|
+
still draws `401`.
|
|
256
|
+
operationId: getMcpRegistryServerVersion
|
|
257
|
+
tags:
|
|
258
|
+
- MCP Registry
|
|
259
|
+
security:
|
|
260
|
+
- bearerAuth: []
|
|
261
|
+
- {}
|
|
262
|
+
parameters:
|
|
263
|
+
- $ref: '#/components/parameters/AccountAlias'
|
|
264
|
+
- $ref: '#/components/parameters/ServerName'
|
|
265
|
+
- name: version
|
|
266
|
+
in: path
|
|
267
|
+
required: true
|
|
268
|
+
description: The literal `latest`, or `1.0.0`. They resolve to the same entry.
|
|
269
|
+
schema:
|
|
270
|
+
type: string
|
|
271
|
+
examples:
|
|
272
|
+
- latest
|
|
273
|
+
- 1.0.0
|
|
274
|
+
responses:
|
|
275
|
+
'200':
|
|
276
|
+
description: The registry entry for the requested version.
|
|
277
|
+
content:
|
|
278
|
+
application/json:
|
|
279
|
+
schema:
|
|
280
|
+
$ref: '#/components/schemas/ServerResponse'
|
|
281
|
+
examples:
|
|
282
|
+
default:
|
|
283
|
+
summary: Visible version
|
|
284
|
+
value:
|
|
285
|
+
server:
|
|
286
|
+
$schema: https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json
|
|
287
|
+
name: com.celigo.acme-corp-prod/support-tools
|
|
288
|
+
title: Support tools
|
|
289
|
+
description: Ticket lookup and escalation tools for the support team.
|
|
290
|
+
version: 1.0.0
|
|
291
|
+
remotes:
|
|
292
|
+
- type: streamable-http
|
|
293
|
+
url: https://api.integrator.io/mcp/acme-corp-prod/support-tools
|
|
294
|
+
_meta:
|
|
295
|
+
io.modelcontextprotocol.registry/official:
|
|
296
|
+
status: active
|
|
297
|
+
publishedAt: '2026-03-02T09:14:00.000Z'
|
|
298
|
+
updatedAt: '2026-08-14T09:12:33.000Z'
|
|
299
|
+
statusChangedAt: '2026-03-02T09:14:00.000Z'
|
|
300
|
+
isLatest: true
|
|
301
|
+
io.celigo.registry/entry:
|
|
302
|
+
visibility: entitled
|
|
303
|
+
access: entitled
|
|
304
|
+
'401':
|
|
305
|
+
$ref: '#/components/responses/401-unauthorized'
|
|
306
|
+
'404':
|
|
307
|
+
$ref: '#/components/responses/404-not-found'
|
|
308
|
+
'429':
|
|
309
|
+
$ref: '#/components/responses/429-too-many-requests'
|
|
310
|
+
'503':
|
|
311
|
+
$ref: '#/components/responses/503-service-unavailable'
|
|
312
|
+
/.well-known/oauth-protected-resource/mcp/{accountAlias}/registry:
|
|
313
|
+
get:
|
|
314
|
+
x-internal: false
|
|
315
|
+
summary: Get registry protected resource metadata
|
|
316
|
+
description: |-
|
|
317
|
+
RFC 9728 OAuth protected resource metadata for the account's
|
|
318
|
+
registry. Anonymous: never `401`, even with an invalid bearer; a
|
|
319
|
+
bearer sent during an authentication-service outage returns `503`.
|
|
320
|
+
The payload is account-independent apart from echoing the alias in
|
|
321
|
+
`resource`, and is served with `Cache-Control: max-age=3600`.
|
|
322
|
+
Advertised scope is `mcp:read`. Registry `401` challenges point at
|
|
323
|
+
this URL.
|
|
324
|
+
operationId: getMcpRegistryProtectedResourceMetadata
|
|
325
|
+
tags:
|
|
326
|
+
- MCP Registry
|
|
327
|
+
security:
|
|
328
|
+
- {}
|
|
329
|
+
parameters:
|
|
330
|
+
- $ref: '#/components/parameters/AccountAlias'
|
|
331
|
+
responses:
|
|
332
|
+
'200':
|
|
333
|
+
description: Protected resource metadata for the aliased registry. Returned for any alias value, known or not.
|
|
334
|
+
headers:
|
|
335
|
+
Cache-Control:
|
|
336
|
+
description: Always `max-age=3600`.
|
|
337
|
+
schema:
|
|
338
|
+
type: string
|
|
339
|
+
examples:
|
|
340
|
+
- max-age=3600
|
|
341
|
+
content:
|
|
342
|
+
application/json:
|
|
343
|
+
schema:
|
|
344
|
+
$ref: '#/components/schemas/ProtectedResourceMetadata'
|
|
345
|
+
examples:
|
|
346
|
+
default:
|
|
347
|
+
value:
|
|
348
|
+
resource: https://api.integrator.io/mcp/acme-corp-prod/registry
|
|
349
|
+
authorization_servers:
|
|
350
|
+
- https://integrator.io
|
|
351
|
+
scopes_supported:
|
|
352
|
+
- mcp:read
|
|
353
|
+
bearer_methods_supported:
|
|
354
|
+
- header
|
|
355
|
+
resource_signing_alg_values_supported:
|
|
356
|
+
- RS256
|
|
357
|
+
'429':
|
|
358
|
+
$ref: '#/components/responses/429-too-many-requests'
|
|
359
|
+
'503':
|
|
360
|
+
$ref: '#/components/responses/503-service-unavailable'
|
|
361
|
+
components:
|
|
362
|
+
securitySchemes:
|
|
363
|
+
bearerAuth:
|
|
364
|
+
type: http
|
|
365
|
+
scheme: bearer
|
|
366
|
+
description: |-
|
|
367
|
+
Optional on the three registry reads. Accepted credentials are a Celigo
|
|
368
|
+
API token, a personal access token (PAT), or a Celigo-issued MCP OAuth
|
|
369
|
+
access token. A valid credential never draws `WWW-Authenticate`. A token
|
|
370
|
+
issued by an MCP server's external identity provider is not a registry
|
|
371
|
+
credential; on a private alias it receives `401`. An `Authorization`
|
|
372
|
+
header with any scheme other than `Bearer` is dropped and the request
|
|
373
|
+
is treated as anonymous.
|
|
374
|
+
parameters:
|
|
375
|
+
AccountAlias:
|
|
376
|
+
name: accountAlias
|
|
377
|
+
in: path
|
|
378
|
+
required: true
|
|
379
|
+
description: |-
|
|
380
|
+
Account environment alias that anchors this registry URL. Anonymous callers
|
|
381
|
+
cannot distinguish a private alias from an unknown one (`401` plus the same
|
|
382
|
+
`WWW-Authenticate` challenge). A valid credential against a private or
|
|
383
|
+
unknown alias receives `200` empty on listing endpoints.
|
|
384
|
+
schema:
|
|
385
|
+
type: string
|
|
386
|
+
examples:
|
|
387
|
+
- acme-corp-prod
|
|
388
|
+
ServerName:
|
|
389
|
+
name: serverName
|
|
390
|
+
in: path
|
|
391
|
+
required: true
|
|
392
|
+
description: |-
|
|
393
|
+
Registry server name, URL-encoded (for example
|
|
394
|
+
`com.celigo.acme-corp-prod%2Fsupport-tools`). The unencoded form with
|
|
395
|
+
a literal `/` is also accepted. A malformed name returns `404` on the
|
|
396
|
+
version item and `200` empty on the versions list. Celigo names follow
|
|
397
|
+
`com.celigo.<accountAlias>/<relativeURI segment>` — take them from
|
|
398
|
+
`server.name` on list responses. Unpublished and unknown names stay
|
|
399
|
+
opaque to the unentitled.
|
|
400
|
+
schema:
|
|
401
|
+
type: string
|
|
402
|
+
pattern: ^[a-zA-Z0-9.-]+/[a-zA-Z0-9._-]+$
|
|
403
|
+
examples:
|
|
404
|
+
- com.celigo.acme-corp-prod/support-tools
|
|
405
|
+
schemas:
|
|
406
|
+
Remote:
|
|
407
|
+
type: object
|
|
408
|
+
description: |-
|
|
409
|
+
Transport entry describing how to connect to the MCP server. Celigo
|
|
410
|
+
projects exactly one remote per server — always Streamable HTTP at the
|
|
411
|
+
aliased connection URL. Token-identity callers receive an
|
|
412
|
+
`Authorization` header hint; OAuth-identity callers do not.
|
|
413
|
+
required:
|
|
414
|
+
- type
|
|
415
|
+
- url
|
|
416
|
+
properties:
|
|
417
|
+
type:
|
|
418
|
+
type: string
|
|
419
|
+
enum:
|
|
420
|
+
- streamable-http
|
|
421
|
+
x-enumDescriptions:
|
|
422
|
+
streamable-http: MCP Streamable HTTP transport
|
|
423
|
+
description: Transport protocol used to connect to the server. Celigo MCP servers are served over Streamable HTTP only.
|
|
424
|
+
url:
|
|
425
|
+
type: string
|
|
426
|
+
format: uri
|
|
427
|
+
description: |-
|
|
428
|
+
Connection URL for the server
|
|
429
|
+
(`https://api.integrator.io/mcp/<accountAlias><relativeURI>`).
|
|
430
|
+
examples:
|
|
431
|
+
- https://api.integrator.io/mcp/acme-corp-prod/support-tools
|
|
432
|
+
headers:
|
|
433
|
+
type: array
|
|
434
|
+
description: |-
|
|
435
|
+
HTTP headers the client must send when connecting. Present on remotes
|
|
436
|
+
projected for Celigo API token and PAT callers; absent for MCP OAuth
|
|
437
|
+
callers, which discover credentials through the server's own PRM.
|
|
438
|
+
items:
|
|
439
|
+
type: object
|
|
440
|
+
required:
|
|
441
|
+
- name
|
|
442
|
+
properties:
|
|
443
|
+
name:
|
|
444
|
+
type: string
|
|
445
|
+
description: Header name to send.
|
|
446
|
+
examples:
|
|
447
|
+
- Authorization
|
|
448
|
+
description:
|
|
449
|
+
type: string
|
|
450
|
+
description: What the client should place in the header value.
|
|
451
|
+
examples:
|
|
452
|
+
- Bearer token for the MCP server.
|
|
453
|
+
isRequired:
|
|
454
|
+
type: boolean
|
|
455
|
+
description: When true, the client must send this header to connect.
|
|
456
|
+
isSecret:
|
|
457
|
+
type: boolean
|
|
458
|
+
description: When true, the header value is a credential and should be masked in client UIs and logs.
|
|
459
|
+
ServerJSON:
|
|
460
|
+
type: object
|
|
461
|
+
description: |-
|
|
462
|
+
MCP Registry `server.json` document (2025-12-11 schema) — the subset
|
|
463
|
+
of fields Celigo emits. Each document projects one enabled Celigo MCP
|
|
464
|
+
server. Version is the constant `1.0.0`. Publisher extension blocks
|
|
465
|
+
are not emitted; auth discovery is via PRM.
|
|
466
|
+
required:
|
|
467
|
+
- $schema
|
|
468
|
+
- name
|
|
469
|
+
- title
|
|
470
|
+
- description
|
|
471
|
+
- version
|
|
472
|
+
- remotes
|
|
473
|
+
properties:
|
|
474
|
+
$schema:
|
|
475
|
+
type: string
|
|
476
|
+
format: uri
|
|
477
|
+
description: JSON Schema identifier of the `server.json` format version this document follows.
|
|
478
|
+
examples:
|
|
479
|
+
- https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json
|
|
480
|
+
name:
|
|
481
|
+
type: string
|
|
482
|
+
maxLength: 200
|
|
483
|
+
pattern: ^[a-zA-Z0-9.-]+/[a-zA-Z0-9._-]+$
|
|
484
|
+
description: |-
|
|
485
|
+
Registry server name in reverse-DNS form:
|
|
486
|
+
`com.celigo.<accountAlias>/<segment>`, where the segment is the
|
|
487
|
+
server's `relativeURI` without the leading slash. Use its
|
|
488
|
+
URL-encoded form as the `{serverName}` path parameter.
|
|
489
|
+
examples:
|
|
490
|
+
- com.celigo.acme-corp-prod/support-tools
|
|
491
|
+
title:
|
|
492
|
+
type: string
|
|
493
|
+
maxLength: 100
|
|
494
|
+
description: Human-readable display name, taken from the Celigo MCP server's `name`.
|
|
495
|
+
examples:
|
|
496
|
+
- Support tools
|
|
497
|
+
description:
|
|
498
|
+
type: string
|
|
499
|
+
minLength: 1
|
|
500
|
+
maxLength: 100
|
|
501
|
+
description: |-
|
|
502
|
+
Server description, truncated to 100 characters. When the Celigo
|
|
503
|
+
server has no description, one is synthesized from the server name
|
|
504
|
+
so clients that drop empty descriptions still render the entry.
|
|
505
|
+
examples:
|
|
506
|
+
- Ticket lookup and escalation tools for the support team.
|
|
507
|
+
version:
|
|
508
|
+
type: string
|
|
509
|
+
description: |-
|
|
510
|
+
Always `1.0.0`. `latest` on the version-item path is equivalent.
|
|
511
|
+
Configuration changes surface through
|
|
512
|
+
`_meta["io.modelcontextprotocol.registry/official"].updatedAt`.
|
|
513
|
+
examples:
|
|
514
|
+
- 1.0.0
|
|
515
|
+
remotes:
|
|
516
|
+
type: array
|
|
517
|
+
description: Exactly one Streamable HTTP remote. Celigo never emits `packages`.
|
|
518
|
+
items:
|
|
519
|
+
$ref: '#/components/schemas/Remote'
|
|
520
|
+
RegistryOfficialMeta:
|
|
521
|
+
type: object
|
|
522
|
+
description: |-
|
|
523
|
+
Registry-managed metadata (`io.modelcontextprotocol.registry/official`)
|
|
524
|
+
for one server entry, per the MCP Registry v0.1 specification.
|
|
525
|
+
required:
|
|
526
|
+
- status
|
|
527
|
+
- publishedAt
|
|
528
|
+
- updatedAt
|
|
529
|
+
- statusChangedAt
|
|
530
|
+
- isLatest
|
|
531
|
+
properties:
|
|
532
|
+
status:
|
|
533
|
+
type: string
|
|
534
|
+
enum:
|
|
535
|
+
- active
|
|
536
|
+
x-enumDescriptions:
|
|
537
|
+
active: The server is live and connectable
|
|
538
|
+
description: Lifecycle status of the entry. Only enabled, listable servers are projected, so entries are always `active`.
|
|
539
|
+
publishedAt:
|
|
540
|
+
type: string
|
|
541
|
+
format: date-time
|
|
542
|
+
description: When the server was created in Celigo.
|
|
543
|
+
examples:
|
|
544
|
+
- '2026-03-02T09:14:00.000Z'
|
|
545
|
+
updatedAt:
|
|
546
|
+
type: string
|
|
547
|
+
format: date-time
|
|
548
|
+
description: When the server's configuration last changed. Celigo servers use a constant `1.0.0`, so this is the only change signal.
|
|
549
|
+
examples:
|
|
550
|
+
- '2026-08-14T09:12:33.000Z'
|
|
551
|
+
statusChangedAt:
|
|
552
|
+
type: string
|
|
553
|
+
format: date-time
|
|
554
|
+
description: When the entry's status last changed. Matches `publishedAt`, since only `active` entries are projected.
|
|
555
|
+
examples:
|
|
556
|
+
- '2026-03-02T09:14:00.000Z'
|
|
557
|
+
isLatest:
|
|
558
|
+
type: boolean
|
|
559
|
+
description: When true, this entry is the server's latest version. Always true — Celigo MCP servers are single-version live resources.
|
|
560
|
+
RegistryEntryMeta:
|
|
561
|
+
type: object
|
|
562
|
+
description: |-
|
|
563
|
+
Celigo registry-entry markers (`io.celigo.registry/entry`) on every
|
|
564
|
+
projected server. `visibility` is a property of the server;
|
|
565
|
+
`access` is a property of this response.
|
|
566
|
+
required:
|
|
567
|
+
- visibility
|
|
568
|
+
- access
|
|
569
|
+
properties:
|
|
570
|
+
visibility:
|
|
571
|
+
type: string
|
|
572
|
+
enum:
|
|
573
|
+
- public
|
|
574
|
+
- entitled
|
|
575
|
+
x-enumDescriptions:
|
|
576
|
+
public: The server's publish flag is set and the account is opted in
|
|
577
|
+
entitled: The server is visible only through entitlement
|
|
578
|
+
description: Whether the server is in the published set or only visible through entitlement.
|
|
579
|
+
access:
|
|
580
|
+
type: string
|
|
581
|
+
enum:
|
|
582
|
+
- entitled
|
|
583
|
+
- anonymous
|
|
584
|
+
x-enumDescriptions:
|
|
585
|
+
entitled: The presenting credential can connect on the protocol path
|
|
586
|
+
anonymous: Listed via the published lane; connecting requires the server's own auth
|
|
587
|
+
description: How this response presented the entry.
|
|
588
|
+
ServerResponse:
|
|
589
|
+
type: object
|
|
590
|
+
description: |-
|
|
591
|
+
One registry entry — the `server.json` document plus registry-managed
|
|
592
|
+
metadata, per the MCP Registry v0.1 specification. `_meta` carries the
|
|
593
|
+
official block and the `io.celigo.registry/entry` extension.
|
|
594
|
+
required:
|
|
595
|
+
- server
|
|
596
|
+
- _meta
|
|
597
|
+
properties:
|
|
598
|
+
server:
|
|
599
|
+
$ref: '#/components/schemas/ServerJSON'
|
|
600
|
+
_meta:
|
|
601
|
+
type: object
|
|
602
|
+
description: Registry-managed metadata envelope for the entry.
|
|
603
|
+
required:
|
|
604
|
+
- io.modelcontextprotocol.registry/official
|
|
605
|
+
- io.celigo.registry/entry
|
|
606
|
+
properties:
|
|
607
|
+
io.modelcontextprotocol.registry/official:
|
|
608
|
+
$ref: '#/components/schemas/RegistryOfficialMeta'
|
|
609
|
+
io.celigo.registry/entry:
|
|
610
|
+
$ref: '#/components/schemas/RegistryEntryMeta'
|
|
611
|
+
ServerListResponse:
|
|
612
|
+
type: object
|
|
613
|
+
description: |-
|
|
614
|
+
Paginated list of registry entries, per the MCP Registry v0.1
|
|
615
|
+
specification. An empty list (`count: 0`, no `nextCursor`) is list
|
|
616
|
+
semantics for a caller who is allowed on that lane when nothing is
|
|
617
|
+
visible — including an opted-in account with zero published servers.
|
|
618
|
+
required:
|
|
619
|
+
- servers
|
|
620
|
+
- metadata
|
|
621
|
+
properties:
|
|
622
|
+
servers:
|
|
623
|
+
type: array
|
|
624
|
+
description: Registry entries for this page, sorted by server name ascending.
|
|
625
|
+
items:
|
|
626
|
+
$ref: '#/components/schemas/ServerResponse'
|
|
627
|
+
metadata:
|
|
628
|
+
type: object
|
|
629
|
+
description: Pagination metadata for the page.
|
|
630
|
+
required:
|
|
631
|
+
- count
|
|
632
|
+
properties:
|
|
633
|
+
count:
|
|
634
|
+
type: integer
|
|
635
|
+
description: Number of entries in this page.
|
|
636
|
+
examples:
|
|
637
|
+
- 1
|
|
638
|
+
nextCursor:
|
|
639
|
+
type: string
|
|
640
|
+
description: Opaque cursor for the next page — pass it back as the `cursor` query parameter. Absent on the final page.
|
|
641
|
+
examples:
|
|
642
|
+
- eyJuIjoiU3VwcG9ydCBUb29scyIsImlkIjoiNjY1ZjFjMmU5YjBjNGQwMDFlOGY3YTIzIn0
|
|
643
|
+
Problem:
|
|
644
|
+
type: object
|
|
645
|
+
description: |-
|
|
646
|
+
RFC 9457 problem details. Registry errors use this shape on every
|
|
647
|
+
documented error status — not an `errors[]` envelope and not a Celigo
|
|
648
|
+
error code.
|
|
649
|
+
required:
|
|
650
|
+
- type
|
|
651
|
+
- title
|
|
652
|
+
- status
|
|
653
|
+
properties:
|
|
654
|
+
type:
|
|
655
|
+
type: string
|
|
656
|
+
format: uri
|
|
657
|
+
description: URI reference that identifies the problem type. Registry problems use `about:blank`.
|
|
658
|
+
examples:
|
|
659
|
+
- about:blank
|
|
660
|
+
title:
|
|
661
|
+
type: string
|
|
662
|
+
description: Short, human-readable summary of the problem type.
|
|
663
|
+
examples:
|
|
664
|
+
- Not Found
|
|
665
|
+
status:
|
|
666
|
+
type: integer
|
|
667
|
+
description: HTTP status code generated by the origin server for this occurrence of the problem.
|
|
668
|
+
examples:
|
|
669
|
+
- 404
|
|
670
|
+
detail:
|
|
671
|
+
type: string
|
|
672
|
+
description: Human-readable explanation specific to this occurrence of the problem.
|
|
673
|
+
examples:
|
|
674
|
+
- Server not found.
|
|
675
|
+
instance:
|
|
676
|
+
type: string
|
|
677
|
+
description: URI reference that identifies the specific occurrence of the problem.
|
|
678
|
+
examples:
|
|
679
|
+
- /mcp/acme-corp-prod/registry/v0.1/servers/com.celigo.acme-corp-prod/billing-tools
|
|
680
|
+
ProtectedResourceMetadata:
|
|
681
|
+
type: object
|
|
682
|
+
description: |-
|
|
683
|
+
RFC 9728 OAuth protected resource metadata for the account's
|
|
684
|
+
registry. Anonymous. Advertised scope is `mcp:read`.
|
|
685
|
+
`authorization_servers` contains exactly one entry — Celigo's OIDC
|
|
686
|
+
issuer. The `WWW-Authenticate` challenge on registry `401`s points
|
|
687
|
+
here.
|
|
688
|
+
required:
|
|
689
|
+
- resource
|
|
690
|
+
- authorization_servers
|
|
691
|
+
- scopes_supported
|
|
692
|
+
- bearer_methods_supported
|
|
693
|
+
- resource_signing_alg_values_supported
|
|
694
|
+
properties:
|
|
695
|
+
resource:
|
|
696
|
+
type: string
|
|
697
|
+
format: uri
|
|
698
|
+
description: The protected resource this metadata describes — the registry base URL for the account alias.
|
|
699
|
+
examples:
|
|
700
|
+
- https://api.integrator.io/mcp/acme-corp-prod/registry
|
|
701
|
+
authorization_servers:
|
|
702
|
+
type: array
|
|
703
|
+
description: Authorization servers that issue access tokens accepted by the registry. Contains the regional Celigo OIDC issuer.
|
|
704
|
+
items:
|
|
705
|
+
type: string
|
|
706
|
+
format: uri
|
|
707
|
+
examples:
|
|
708
|
+
- - https://integrator.io
|
|
709
|
+
scopes_supported:
|
|
710
|
+
type: array
|
|
711
|
+
description: OAuth scopes that grant registry access.
|
|
712
|
+
items:
|
|
713
|
+
type: string
|
|
714
|
+
examples:
|
|
715
|
+
- - mcp:read
|
|
716
|
+
bearer_methods_supported:
|
|
717
|
+
type: array
|
|
718
|
+
description: How bearer tokens are presented to the registry — the `Authorization` header only.
|
|
719
|
+
items:
|
|
720
|
+
type: string
|
|
721
|
+
examples:
|
|
722
|
+
- - header
|
|
723
|
+
resource_signing_alg_values_supported:
|
|
724
|
+
type: array
|
|
725
|
+
description: JWS algorithms the registry supports for signed resource metadata. Always `RS256`.
|
|
726
|
+
items:
|
|
727
|
+
type: string
|
|
728
|
+
examples:
|
|
729
|
+
- - RS256
|
|
730
|
+
responses:
|
|
731
|
+
400-bad-request:
|
|
732
|
+
description: |-
|
|
733
|
+
Malformed query parameter (`detail` is `Invalid limit.`, `Invalid
|
|
734
|
+
search.`, or `Invalid cursor.`), or a request that carries
|
|
735
|
+
`updated_since` or `include_deleted`. Those two parameters are unsupported (no
|
|
736
|
+
incremental sync, no tombstones) and are rejected with this status
|
|
737
|
+
rather than honored or ignored.
|
|
738
|
+
content:
|
|
739
|
+
application/problem+json:
|
|
740
|
+
schema:
|
|
741
|
+
$ref: '#/components/schemas/Problem'
|
|
742
|
+
examples:
|
|
743
|
+
default:
|
|
744
|
+
value:
|
|
745
|
+
type: about:blank
|
|
746
|
+
title: Bad Request
|
|
747
|
+
status: 400
|
|
748
|
+
detail: The updated_since parameter is not supported.
|
|
749
|
+
401-unauthorized:
|
|
750
|
+
description: |-
|
|
751
|
+
Missing or invalid/expired bearer. Body is RFC 9457 problem details
|
|
752
|
+
(`title: Unauthorized`, `type: about:blank`). The
|
|
753
|
+
`WWW-Authenticate` header is required and identical for real and
|
|
754
|
+
unknown aliases.
|
|
755
|
+
headers:
|
|
756
|
+
WWW-Authenticate:
|
|
757
|
+
$ref: '#/components/headers/WwwAuthenticate'
|
|
758
|
+
content:
|
|
759
|
+
application/problem+json:
|
|
760
|
+
schema:
|
|
761
|
+
$ref: '#/components/schemas/Problem'
|
|
762
|
+
examples:
|
|
763
|
+
default:
|
|
764
|
+
value:
|
|
765
|
+
type: about:blank
|
|
766
|
+
title: Unauthorized
|
|
767
|
+
status: 401
|
|
768
|
+
detail: Authentication required.
|
|
769
|
+
instance: /mcp/acme-corp-prod/registry/v0.1/servers
|
|
770
|
+
429-too-many-requests:
|
|
771
|
+
description: |-
|
|
772
|
+
Rate limited — keyed per caller identity when authenticated and per source
|
|
773
|
+
IP when anonymous. The gateway's credential check also returns this status
|
|
774
|
+
when the authentication service rate-limits a presented bearer. Wait for
|
|
775
|
+
`Retry-After` when present.
|
|
776
|
+
headers:
|
|
777
|
+
Retry-After:
|
|
778
|
+
$ref: '#/components/headers/RetryAfter'
|
|
779
|
+
X-Request-Id:
|
|
780
|
+
$ref: '#/components/headers/RequestId'
|
|
781
|
+
content:
|
|
782
|
+
application/problem+json:
|
|
783
|
+
schema:
|
|
784
|
+
$ref: '#/components/schemas/Problem'
|
|
785
|
+
examples:
|
|
786
|
+
default:
|
|
787
|
+
value:
|
|
788
|
+
type: about:blank
|
|
789
|
+
title: Too Many Requests
|
|
790
|
+
status: 429
|
|
791
|
+
detail: Rate limit exceeded.
|
|
792
|
+
instance: /mcp/acme-corp-prod/registry/v0.1/servers
|
|
793
|
+
503-service-unavailable:
|
|
794
|
+
description: |-
|
|
795
|
+
A presented bearer could not be checked because the authentication
|
|
796
|
+
service failed or timed out. Anonymous requests skip the check, and the
|
|
797
|
+
response never carries `WWW-Authenticate`, so an outage does not become
|
|
798
|
+
a client login loop. Retry the same request later.
|
|
799
|
+
content:
|
|
800
|
+
application/problem+json:
|
|
801
|
+
schema:
|
|
802
|
+
$ref: '#/components/schemas/Problem'
|
|
803
|
+
examples:
|
|
804
|
+
gateway:
|
|
805
|
+
summary: The gateway's credential check (registry reads)
|
|
806
|
+
value:
|
|
807
|
+
type: about:blank
|
|
808
|
+
title: Service Unavailable
|
|
809
|
+
status: 503
|
|
810
|
+
detail: Authentication service unavailable.
|
|
811
|
+
instance: /mcp/acme-corp-prod/registry/v0.1/servers
|
|
812
|
+
registry:
|
|
813
|
+
summary: The registry service's credential check
|
|
814
|
+
value:
|
|
815
|
+
type: about:blank
|
|
816
|
+
title: Service Unavailable
|
|
817
|
+
status: 503
|
|
818
|
+
detail: Service unavailable.
|
|
819
|
+
instance: /mcp/acme-corp-prod/registry/v0.1/servers
|
|
820
|
+
404-not-found:
|
|
821
|
+
description: |-
|
|
822
|
+
The requested version is not visible to this caller — unknown server,
|
|
823
|
+
unpublished name, wrong version, or unentitled. Uniform `404`; the
|
|
824
|
+
cases are indistinguishable. Same RFC 9457 schema as `401`.
|
|
825
|
+
content:
|
|
826
|
+
application/problem+json:
|
|
827
|
+
schema:
|
|
828
|
+
$ref: '#/components/schemas/Problem'
|
|
829
|
+
examples:
|
|
830
|
+
default:
|
|
831
|
+
value:
|
|
832
|
+
type: about:blank
|
|
833
|
+
title: Not Found
|
|
834
|
+
status: 404
|
|
835
|
+
detail: Server not found.
|
|
836
|
+
instance: /mcp/acme-corp-prod/registry/v0.1/servers/com.celigo.acme-corp-prod%2Fbilling-tools/versions/1.0.0
|
|
837
|
+
headers:
|
|
838
|
+
WwwAuthenticate:
|
|
839
|
+
required: true
|
|
840
|
+
description: |-
|
|
841
|
+
RFC 6750 challenge. Always
|
|
842
|
+
`Bearer resource_metadata="<registry PRM URL>"`, pattern-derived from
|
|
843
|
+
the request path and identical for real and unknown aliases.
|
|
844
|
+
schema:
|
|
845
|
+
type: string
|
|
846
|
+
examples:
|
|
847
|
+
- Bearer resource_metadata="https://api.integrator.io/.well-known/oauth-protected-resource/mcp/acme-corp-prod/registry"
|
|
848
|
+
RetryAfter:
|
|
849
|
+
description: |-
|
|
850
|
+
Seconds to wait before retrying. Present when set: the registry rate
|
|
851
|
+
limiter always sets it, and a `429` from the gateway's credential check
|
|
852
|
+
carries it only when the authentication service supplied one.
|
|
853
|
+
schema:
|
|
854
|
+
type: integer
|
|
855
|
+
examples:
|
|
856
|
+
- 30
|
|
857
|
+
RequestId:
|
|
858
|
+
description: Correlation ID for this request; quote it when reporting a problem.
|
|
859
|
+
schema:
|
|
860
|
+
type: string
|
|
861
|
+
maxLength: 128
|
|
862
|
+
examples:
|
|
863
|
+
- 3f2b9c1e-7a4d-4b8e-9f0a-1c2d3e4f5a6b
|
|
864
|
+
x-enable-proxy: true
|
|
865
|
+
x-internal: false
|
package/dist/mcp-server.yml
CHANGED
|
@@ -4233,6 +4233,10 @@ components:
|
|
|
4233
4233
|
description: |-
|
|
4234
4234
|
Tool entries referencing Celigo Tool resources. Duplicate `_toolId`
|
|
4235
4235
|
values are rejected. Names must be unique across both `tools` and `apis`.
|
|
4236
|
+
Every `tools/call` through the server hands the Tool a caller `context`
|
|
4237
|
+
(`token`, `byUser`, `source`, `client` — see `context` on
|
|
4238
|
+
`POST /v1/tools/{_id}/invoke`) that its steps read as `{{context.*}}`;
|
|
4239
|
+
APIs on the server and proxied upstream capabilities get none.
|
|
4236
4240
|
x-celigo-ai-guidance:
|
|
4237
4241
|
- |-
|
|
4238
4242
|
Tool entries reference Celigo Tool resources;
|
package/dist/tool.yml
CHANGED
|
@@ -1156,6 +1156,35 @@ paths:
|
|
|
1156
1156
|
format: objectId
|
|
1157
1157
|
x-celigo-refModel: connections
|
|
1158
1158
|
description: Connection to run the step with; may equal `_abstractId` to keep the authored connection.
|
|
1159
|
+
context:
|
|
1160
|
+
type: object
|
|
1161
|
+
additionalProperties: true
|
|
1162
|
+
description: |-
|
|
1163
|
+
Caller context that the Tool's steps read as `{{context.*}}` in templates,
|
|
1164
|
+
`options.context` in hooks and scripts, and `["context", "<path>"]` in filter
|
|
1165
|
+
rules: `token` (the credential — `type` is `oauth`, `personal`, or `service`),
|
|
1166
|
+
`byUser` (the signed-in person; absent on an API-token call), `source` (the MCP
|
|
1167
|
+
server the call arrived through), and `client` (what the MCP client said about
|
|
1168
|
+
itself — unverified). Only a Celigo MCP server populates it, on `tools/call`; a
|
|
1169
|
+
value sent on this endpoint is dropped, so a direct invoke runs with no `context`:
|
|
1170
|
+
a step that reads `{{context.*}}` in its URL fails the invoke with 422
|
|
1171
|
+
`handlebars_template_parse_error` (`Unable to read "token" from undefined`); a
|
|
1172
|
+
header template that reads it fails the step too; a database query that reads it
|
|
1173
|
+
fails and returns no records; a body or a mapping renders it as empty text and the
|
|
1174
|
+
request goes out matching nothing. Keep a caller filter unconditional (`WHERE owner_email =
|
|
1175
|
+
{{context.byUser.email}}`): every one of those outcomes returns no records, which
|
|
1176
|
+
is the safe result, while wrapping the predicate in `{{#if context.byUser}}`
|
|
1177
|
+
returns every record to a caller without one.
|
|
1178
|
+
x-celigo-ai-guidance:
|
|
1179
|
+
- |-
|
|
1180
|
+
Never send `context` on this endpoint and never wrap a caller filter in
|
|
1181
|
+
`{{#if context}}` or `{{#if context.byUser}}`. The direct path drops the key: a
|
|
1182
|
+
`{{context.*}}` URL template fails the invoke with 422
|
|
1183
|
+
`handlebars_template_parse_error`, a header template fails the step, a database
|
|
1184
|
+
query that reads it fails with no records, a body or mapping renders it as empty
|
|
1185
|
+
text and matches nothing — every way no records, the intended fail-closed
|
|
1186
|
+
result. A guarded predicate is the only way a caller-filtered Tool returns
|
|
1187
|
+
everyone's records. Tools that read the caller run through an MCP server.
|
|
1159
1188
|
additionalProperties: true
|
|
1160
1189
|
examples:
|
|
1161
1190
|
withInput:
|
|
@@ -2478,6 +2507,14 @@ paths:
|
|
|
2478
2507
|
state."), even after that run has finished. Runs with different `triggeredAt` values run at
|
|
2479
2508
|
the same time, each returning its own result.
|
|
2480
2509
|
|
|
2510
|
+
A test run carries a fixed sample caller context in place of a real caller:
|
|
2511
|
+
`{{context.*}}`, `options.context` and filter-rule `["context", …]` references
|
|
2512
|
+
resolve to `sample.user@example.com` (`byUser`), `token.type` `oauth`, source
|
|
2513
|
+
`Sample MCP Server` and client `sample-client` — visible in the step's `request`
|
|
2514
|
+
stage — so a Tool that filters on the caller runs end to end before any client
|
|
2515
|
+
has called it. A step that writes to a destination writes those sample values.
|
|
2516
|
+
Only a call through an MCP server carries the real caller.
|
|
2517
|
+
|
|
2481
2518
|
Test runs are a separate, short-lived history from normal runs — capture
|
|
2482
2519
|
any follow-up step or log details soon after the run completes.
|
|
2483
2520
|
operationId: testRunTool
|
|
@@ -16495,13 +16532,13 @@ components:
|
|
|
16495
16532
|
jsonPath:
|
|
16496
16533
|
type: string
|
|
16497
16534
|
description: |
|
|
16498
|
-
JSONPath
|
|
16499
|
-
data feeding this subrecord. Semantics depend
|
|
16535
|
+
JSONPath from the source record root that selects
|
|
16536
|
+
the data feeding this subrecord. Semantics depend
|
|
16500
16537
|
on placement:
|
|
16501
16538
|
* Line-level (on `lists[].fields[].`
|
|
16502
|
-
`subRecordMapping`) —
|
|
16503
|
-
|
|
16504
|
-
|
|
16539
|
+
`subRecordMapping`) — the array of lines the
|
|
16540
|
+
sublist iterates (`lineItems`); `$` only when
|
|
16541
|
+
each record is itself one line.
|
|
16505
16542
|
* Body-level (on `fields[].subRecordMapping`)
|
|
16506
16543
|
— a path into the source record root.
|
|
16507
16544
|
Defaults to `$`.
|
|
@@ -16693,9 +16730,10 @@ components:
|
|
|
16693
16730
|
type: boolean
|
|
16694
16731
|
description: |-
|
|
16695
16732
|
When true, this field is a key for matching the record's existing sublist lines: a
|
|
16696
|
-
mapped line updates the one existing line whose key fields hold the same values
|
|
16697
|
-
|
|
16698
|
-
|
|
16733
|
+
mapped line updates the one existing line whose key fields hold the same values —
|
|
16734
|
+
every key field must match, so several keys narrow the match. `lists` says which
|
|
16735
|
+
records match lines, the keys used when no field sets `isKey`, and what a line that
|
|
16736
|
+
matches no line, or several, does.
|
|
16699
16737
|
immutable:
|
|
16700
16738
|
type: boolean
|
|
16701
16739
|
description: When true, this field is only set on record creation, not on updates.
|
|
@@ -16774,13 +16812,19 @@ components:
|
|
|
16774
16812
|
jsonPath:
|
|
16775
16813
|
type: string
|
|
16776
16814
|
description: |
|
|
16777
|
-
|
|
16778
|
-
|
|
16779
|
-
subrecord
|
|
16780
|
-
|
|
16781
|
-
|
|
16782
|
-
|
|
16783
|
-
Defaults to `$`.
|
|
16815
|
+
Path from the source record root to the
|
|
16816
|
+
array of lines whose elements feed this
|
|
16817
|
+
subrecord — the same array the sublist
|
|
16818
|
+
iterates (`lineItems`, `items`); the n-th
|
|
16819
|
+
element populates the n-th sublist line.
|
|
16820
|
+
`$` only when each source record is itself
|
|
16821
|
+
one line. Defaults to `$`.
|
|
16822
|
+
x-celigo-ai-guidance:
|
|
16823
|
+
- |-
|
|
16824
|
+
`$` on a record whose lines sit under a field renders no subrecord for any
|
|
16825
|
+
line, and NetSuite rejects the first numbered line with `Please configure the
|
|
16826
|
+
inventory detail in line N of the item list`; name the line array
|
|
16827
|
+
(`lineItems`), never the current-line context.
|
|
16784
16828
|
mapping:
|
|
16785
16829
|
type: object
|
|
16786
16830
|
description: |
|
|
@@ -16891,6 +16935,11 @@ components:
|
|
|
16891
16935
|
with `MULTIPLE_LINES_WITH_SAME_KEYS` ("Multiple lines found with keys item=<value> ..."). A
|
|
16892
16936
|
line that matches none is added as a new line, which an item fulfillment's `item` sublist
|
|
16893
16937
|
refuses with `SSS_INVALID_SUBLIST_OPERATION`: its lines are its order's.
|
|
16938
|
+
|
|
16939
|
+
On a fulfillment created from an order, a kit's lot-, serial- or bin-managed components are
|
|
16940
|
+
lines of their own under the kit's line, each with its own `line` and `orderline` (the
|
|
16941
|
+
component's own order line) and `kitmemberof` holding the kit line's id; the inventory detail
|
|
16942
|
+
belongs on those component lines, and a kit line refuses it.
|
|
16894
16943
|
x-celigo-ai-guidance:
|
|
16895
16944
|
- |-
|
|
16896
16945
|
To make an update replace a sublist's lines, also map the body field
|
|
@@ -16905,6 +16954,24 @@ components:
|
|
|
16905
16954
|
field, or, on a fulfillment, the order line's id mapped to `orderline`. Keying on the item fails
|
|
16906
16955
|
with `MULTIPLE_LINES_WITH_SAME_KEYS` when an order holds the same item on two lines, and records
|
|
16907
16956
|
that already hold repeated lines fail the same way once a key is set.
|
|
16957
|
+
- |-
|
|
16958
|
+
A key field is read from the existing lines, never written, so a read-only field keys as well
|
|
16959
|
+
as a writable one. The mapper's "Items : Line ID" is `line` (the fulfillment's own line number,
|
|
16960
|
+
equal to the order line only on a fresh full transform) and "Items : Line Number" is `linenum`;
|
|
16961
|
+
`orderline` and `kitmemberof` are not in its picker — type `item[*].orderline` /
|
|
16962
|
+
`item[*].kitmemberof` as the destination.
|
|
16963
|
+
- |-
|
|
16964
|
+
Kit components on a fulfillment: the item is the only default key that reaches a component
|
|
16965
|
+
line, so a component two kit lines share fails with `MULTIPLE_LINES_WITH_SAME_KEYS`. Keying the
|
|
16966
|
+
component rows on the KIT's order line (`line` or `orderline`) selects the kit line instead and
|
|
16967
|
+
the save fails with `You cannot create an inventory detail for this item`. When the source
|
|
16968
|
+
carries the kit's order line on its component rows, keep the item as a key and add
|
|
16969
|
+
`item[*].kitmemberof` mapped from that line id as a second key, keep the kit rows in the list
|
|
16970
|
+
(their empty `kitmemberof` matches the kit line) with `item[*].celigo_ignore_current_line_invdetail_subrecord`
|
|
16971
|
+
true so no inventory detail is written on them, and build the inventory detail from each
|
|
16972
|
+
component row's own picks; component rows alone leave every kit line unfulfilled (`You must
|
|
16973
|
+
enter at least one line item for this transaction`). When the source can supply each
|
|
16974
|
+
component line's own order line id, key every row on `orderline` instead.
|
|
16908
16975
|
x-celigo-agent:
|
|
16909
16976
|
- mapping
|
|
16910
16977
|
lookups:
|
package/package.json
CHANGED