@celigo/api-specs 0.2.211 → 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.
@@ -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
@@ -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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@celigo/api-specs",
3
- "version": "0.2.211",
3
+ "version": "0.2.212",
4
4
  "private": false,
5
5
  "description": "Public OpenAPI bundles (dist/) and the celigo-cli lint schema pack (schemas.json).",
6
6
  "keywords": [
package/schemas.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "provenance": {
3
3
  "repo": "celigo/integrator-api-specs",
4
- "iasCommit": "055366b0",
4
+ "iasCommit": "dcc0e0ac",
5
5
  "generatedAt": "2026-10-30"
6
6
  },
7
7
  "roots": {