@toa.io/extensions.exposition 1.0.0-alpha.291 → 1.0.0-alpha.293
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/components/identity.basic/package.json +8 -0
- package/components/identity.federation/package.json +8 -0
- package/components/identity.passkeys/package.json +8 -0
- package/components/identity.tokens/package.json +10 -0
- package/package.json +25 -13
- package/transpiled/Discovery/Explorer.js +1 -1
- package/transpiled/Discovery/Explorer.js.map +1 -1
- package/transpiled/Discovery/Site.js +1 -1
- package/transpiled/Discovery/Site.js.map +1 -1
- package/transpiled/Discovery/trunk.js +1 -1
- package/transpiled/Discovery/trunk.js.map +1 -1
- package/transpiled/Endpoint.js +3 -0
- package/transpiled/Endpoint.js.map +1 -1
- package/transpiled/Factory.js +1 -1
- package/transpiled/Factory.js.map +1 -1
- package/transpiled/Gateway.js +1 -1
- package/transpiled/Gateway.js.map +1 -1
- package/transpiled/HTTP/Server.d.ts +1 -1
- package/transpiled/HTTP/Server.js +1 -1
- package/transpiled/HTTP/Server.js.map +1 -1
- package/transpiled/Introspection.d.ts +6 -0
- package/transpiled/Introspection.js +1 -0
- package/transpiled/Introspection.js.map +1 -1
- package/transpiled/MCP/Server.d.ts +1 -1
- package/transpiled/MCP/Server.js +1 -1
- package/transpiled/MCP/Server.js.map +1 -1
- package/transpiled/MCP/discover.d.ts +1 -1
- package/transpiled/MCP/schema.js +2 -2
- package/transpiled/Query.d.ts +2 -12
- package/transpiled/Query.js +3 -13
- package/transpiled/Query.js.map +1 -1
- package/transpiled/RPC/Dispatcher.d.ts +1 -1
- package/transpiled/RPC/Dispatcher.js +2 -2
- package/transpiled/RPC/Dispatcher.js.map +1 -1
- package/transpiled/RTD/Endpoint.d.ts +2 -3
- package/transpiled/RTD/Tree.js +1 -1
- package/transpiled/RTD/Tree.js.map +1 -1
- package/transpiled/RTD/factory.js +1 -1
- package/transpiled/RTD/factory.js.map +1 -1
- package/transpiled/RTD/syntax/index.d.ts +1 -2
- package/transpiled/RTD/syntax/index.js +1 -2
- package/transpiled/RTD/syntax/index.js.map +1 -1
- package/transpiled/Tenant.js +1 -1
- package/transpiled/Tenant.js.map +1 -1
- package/transpiled/directives/auth/Authorization.js +1 -1
- package/transpiled/directives/auth/Authorization.js.map +1 -1
- package/transpiled/directives/io/IO.js +1 -1
- package/transpiled/directives/io/IO.js.map +1 -1
- package/transpiled/directives/oauth/documents.d.ts +1 -1
- package/transpiled/index.d.ts +0 -2
- package/transpiled/index.js +0 -2
- package/transpiled/index.js.map +1 -1
- package/transpiled/service.js +1 -1
- package/transpiled/service.js.map +1 -1
- package/ui/dist/_app/immutable/assets/0.Cu0AnR_8.css +2 -0
- package/ui/dist/_app/immutable/assets/2.BghF56l_.css +1 -0
- package/ui/dist/_app/immutable/assets/ui.C8aD6zzF.css +1 -0
- package/ui/dist/_app/immutable/chunks/B8GvXrmq.js +1 -0
- package/ui/dist/_app/immutable/chunks/BVDJTrf4.js +3 -0
- package/ui/dist/_app/immutable/chunks/D6q28_Ok.js +86 -0
- package/ui/dist/_app/immutable/chunks/{D9tE1yyO.js → DVlaUfVU.js} +1 -1
- package/ui/dist/_app/immutable/chunks/DpB73ZB6.js +6 -0
- package/ui/dist/_app/immutable/entry/app.CTava8yn.js +2 -0
- package/ui/dist/_app/immutable/entry/start.yWN0gSLA.js +1 -0
- package/ui/dist/_app/immutable/nodes/0.HKRDBYrC.js +1 -0
- package/ui/dist/_app/immutable/nodes/1.CLa0ydOi.js +1 -0
- package/ui/dist/_app/immutable/nodes/2.C9Kaym8C.js +8 -0
- package/ui/dist/_app/immutable/nodes/3.C1X4_rXZ.js +1 -0
- package/ui/dist/_app/immutable/nodes/4.DdzDIi9E.js +1 -0
- package/ui/dist/_app/immutable/nodes/5.DpbmCMdw.js +1 -0
- package/ui/dist/_app/version.json +1 -1
- package/ui/dist/index.html +12 -12
- package/CHANGELOG.md +0 -35
- package/components/identity.bans/tsconfig.tsbuildinfo +0 -1
- package/components/identity.basic/source/lib/credentials.test.ts +0 -18
- package/components/identity.basic/tsconfig.tsbuildinfo +0 -1
- package/components/identity.clients/source/lib/canonical.test.ts +0 -43
- package/components/identity.clients/source/lib/cimd.test.ts +0 -122
- package/components/identity.clients/source/lib/redirect.test.ts +0 -47
- package/components/identity.clients/tsconfig.tsbuildinfo +0 -1
- package/components/identity.credentials/source/list.test.ts +0 -70
- package/components/identity.credentials/tsconfig.tsbuildinfo +0 -1
- package/components/identity.federation/source/lib/discovery.test.ts +0 -60
- package/components/identity.federation/source/list.test.ts +0 -41
- package/components/identity.federation/tsconfig.tsbuildinfo +0 -1
- package/components/identity.grants/tsconfig.tsbuildinfo +0 -1
- package/components/identity.keys/tsconfig.tsbuildinfo +0 -1
- package/components/identity.otp/tsconfig.tsbuildinfo +0 -1
- package/components/identity.passkeys/source/errors.test.ts +0 -34
- package/components/identity.passkeys/source/webauthn.test.ts +0 -26
- package/components/identity.passkeys/tsconfig.tsbuildinfo +0 -1
- package/components/identity.roles/tsconfig.tsbuildinfo +0 -1
- package/components/identity.tokens/source/authenticate.test.ts +0 -112
- package/components/identity.tokens/source/decrypt.test.ts +0 -216
- package/components/identity.tokens/source/encrypt.test.ts +0 -150
- package/components/identity.tokens/source/issue.test.ts +0 -73
- package/components/identity.tokens/source/lib/form.test.ts +0 -25
- package/components/identity.tokens/source/lib/paseto.test.ts +0 -62
- package/components/identity.tokens/tsconfig.tsbuildinfo +0 -1
- package/context.toa.yaml +0 -31
- package/cucumber.mjs +0 -7
- package/documentation/.assets/ia3-dark.jpg +0 -0
- package/documentation/.assets/ia3-light.jpg +0 -0
- package/documentation/.assets/overview-dark.jpg +0 -0
- package/documentation/.assets/overview-light.jpg +0 -0
- package/documentation/.assets/role-scopes-dark.jpg +0 -0
- package/documentation/.assets/role-scopes-light.jpg +0 -0
- package/documentation/.assets/rtd-dark.jpg +0 -0
- package/documentation/.assets/rtd-light.jpg +0 -0
- package/documentation/access.md +0 -350
- package/documentation/authorities.md +0 -51
- package/documentation/cache.md +0 -72
- package/documentation/components.md +0 -472
- package/documentation/consent.md +0 -101
- package/documentation/credentials.md +0 -88
- package/documentation/dev.md +0 -30
- package/documentation/discovery.md +0 -81
- package/documentation/flow.md +0 -44
- package/documentation/help.md +0 -122
- package/documentation/identity.md +0 -304
- package/documentation/introspection.md +0 -123
- package/documentation/io.md +0 -167
- package/documentation/ip.md +0 -24
- package/documentation/map.md +0 -123
- package/documentation/mcp.md +0 -183
- package/documentation/notes/desync.jpg +0 -0
- package/documentation/notes/peers.md +0 -59
- package/documentation/notes/sse.md +0 -71
- package/documentation/notes/throttling.md +0 -122
- package/documentation/oauth.md +0 -180
- package/documentation/octets.md +0 -334
- package/documentation/passkeys.md +0 -11
- package/documentation/protocol.md +0 -120
- package/documentation/query.md +0 -324
- package/documentation/require.md +0 -15
- package/documentation/rpc.md +0 -154
- package/documentation/tracing.md +0 -70
- package/documentation/tree.md +0 -199
- package/features/access.feature +0 -596
- package/features/annotation.feature +0 -32
- package/features/auth.assert.feature +0 -55
- package/features/auth.bearer.feature +0 -120
- package/features/auth.claims.feature +0 -171
- package/features/auth.incept.feature +0 -166
- package/features/auth.input.feature +0 -59
- package/features/authorities.basic.feature +0 -141
- package/features/authorities.feature +0 -71
- package/features/authorities.federation.feature +0 -100
- package/features/authorities.tokens.feature +0 -117
- package/features/body.feature +0 -76
- package/features/cache.feature +0 -368
- package/features/configuration.feature +0 -206
- package/features/cors.feature +0 -127
- package/features/credentials.feature +0 -106
- package/features/debug.feature +0 -34
- package/features/dev.feature +0 -90
- package/features/directives.feature +0 -61
- package/features/discovery.feature +0 -213
- package/features/discovery.ui.feature +0 -213
- package/features/dynamic.feature +0 -192
- package/features/errors.feature +0 -258
- package/features/etag.feature +0 -239
- package/features/flow.feature +0 -148
- package/features/help.feature +0 -512
- package/features/identity.bans.feature +0 -200
- package/features/identity.basic.feature +0 -666
- package/features/identity.feature +0 -240
- package/features/identity.federation.feature +0 -396
- package/features/identity.otp.feature +0 -142
- package/features/identity.roles.feature +0 -568
- package/features/identity.tokens.custom.feature +0 -430
- package/features/identity.tokens.feature +0 -131
- package/features/interruptions.feature +0 -20
- package/features/introspection.feature +0 -565
- package/features/introspection.map.feature +0 -108
- package/features/io.feature +0 -204
- package/features/io.throttle.feature +0 -166
- package/features/map.feature +0 -360
- package/features/mcp.feature +0 -753
- package/features/methods.feature +0 -48
- package/features/oauth.clients.feature +0 -195
- package/features/oauth.discovery.feature +0 -164
- package/features/oauth.grants.feature +0 -301
- package/features/octets.cloudinary.feature +0 -233
- package/features/octets.download.feature +0 -194
- package/features/octets.entries.feature +0 -83
- package/features/octets.feature +0 -306
- package/features/octets.head.feature +0 -40
- package/features/octets.location.feature +0 -83
- package/features/octets.meta.feature +0 -117
- package/features/octets.workflows.feature +0 -565
- package/features/passkeys.feature +0 -66
- package/features/probes.feature +0 -18
- package/features/query.feature +0 -389
- package/features/realtime.feature +0 -34
- package/features/require.feature +0 -66
- package/features/response.feature +0 -103
- package/features/routes.feature +0 -224
- package/features/rpc.feature +0 -429
- package/features/server.feature +0 -21
- package/features/site/_app/immutable/asset.js +0 -1
- package/features/site/favicon.ico +0 -0
- package/features/site/index.html +0 -10
- package/features/steps/.env.example +0 -5
- package/features/steps/Captures.ts +0 -20
- package/features/steps/Cloudinary.ts +0 -12
- package/features/steps/Common.ts +0 -38
- package/features/steps/Components.ts +0 -115
- package/features/steps/Database.ts +0 -106
- package/features/steps/Gateway.ts +0 -240
- package/features/steps/HTTP.ts +0 -96
- package/features/steps/IDP.ts +0 -361
- package/features/steps/Identity.ts +0 -54
- package/features/steps/OTP.ts +0 -42
- package/features/steps/Parameters.ts +0 -162
- package/features/steps/Probe.ts +0 -38
- package/features/steps/Realtime.ts +0 -175
- package/features/steps/Workspace.ts +0 -48
- package/features/steps/components/audit/manifest.toa.yaml +0 -20
- package/features/steps/components/audit/operations/record.js +0 -5
- package/features/steps/components/echo/manifest.toa.yaml +0 -59
- package/features/steps/components/echo/operations/affect.js +0 -3
- package/features/steps/components/echo/operations/compute.js +0 -3
- package/features/steps/components/echo/operations/echo.js +0 -3
- package/features/steps/components/echo/operations/error.js +0 -7
- package/features/steps/components/echo/operations/identity.js +0 -3
- package/features/steps/components/echo/operations/parameters.js +0 -3
- package/features/steps/components/echo/operations/ping.js +0 -3
- package/features/steps/components/echo/operations/unwrap.js +0 -3
- package/features/steps/components/echo.beacon/manifest.toa.yaml +0 -2
- package/features/steps/components/echo.beacon/operations/hello.js +0 -3
- package/features/steps/components/greeter/manifest.toa.yaml +0 -5
- package/features/steps/components/greeter/operations/greet.js +0 -3
- package/features/steps/components/notify/manifest.toa.yaml +0 -20
- package/features/steps/components/notify/operations/send.js +0 -5
- package/features/steps/components/octets.tester/manifest.toa.yaml +0 -73
- package/features/steps/components/octets.tester/operations/authority.js +0 -3
- package/features/steps/components/octets.tester/operations/bar.js +0 -9
- package/features/steps/components/octets.tester/operations/baz.js +0 -9
- package/features/steps/components/octets.tester/operations/concat.js +0 -5
- package/features/steps/components/octets.tester/operations/echo.js +0 -5
- package/features/steps/components/octets.tester/operations/err.js +0 -14
- package/features/steps/components/octets.tester/operations/foo.js +0 -5
- package/features/steps/components/octets.tester/operations/id.js +0 -5
- package/features/steps/components/octets.tester/operations/identity.js +0 -5
- package/features/steps/components/octets.tester/operations/lenna.png +0 -0
- package/features/steps/components/octets.tester/operations/redirect.js +0 -17
- package/features/steps/components/octets.tester/operations/yex.js +0 -14
- package/features/steps/components/octets.tester/operations/yield.js +0 -11
- package/features/steps/components/orders/manifest.toa.yaml +0 -30
- package/features/steps/components/orders/operations/create.js +0 -7
- package/features/steps/components/pots/manifest.toa.yaml +0 -91
- package/features/steps/components/pots/migrations/0002-indexes.yaml +0 -4
- package/features/steps/components/pricing/manifest.toa.yaml +0 -13
- package/features/steps/components/pricing/operations/quote.js +0 -3
- package/features/steps/components/sequences/manifest.toa.yaml +0 -11
- package/features/steps/components/sequences/operations/numbers.js +0 -5
- package/features/steps/components/sequences/operations/tokens.js +0 -14
- package/features/steps/components/users/manifest.toa.yaml +0 -30
- package/features/steps/components/users/operations/create.js +0 -11
- package/features/steps/components/users.properties/manifest.toa.yaml +0 -22
- package/features/steps/map.ts +0 -30
- package/features/steps/tsconfig.json +0 -9
- package/features/streams.feature +0 -35
- package/features/timestamps.feature +0 -41
- package/features/timing.feature +0 -49
- package/features/tracing.feature +0 -123
- package/schemas/annotation.cos.yaml +0 -125
- package/schemas/call.cos.yaml +0 -18
- package/schemas/directive.cos.yaml +0 -7
- package/schemas/method.cos.yaml +0 -23
- package/schemas/node.cos.yaml +0 -22
- package/schemas/query.cos.yaml +0 -31
- package/schemas/querystring.cos.yaml +0 -19
- package/schemas/range.cos.yaml +0 -10
- package/schemas/route.cos.yaml +0 -6
- package/source/Annotation.ts +0 -89
- package/source/Branch.test.ts +0 -40
- package/source/Branch.ts +0 -44
- package/source/Composition.ts +0 -51
- package/source/Context.ts +0 -11
- package/source/Directive.test.ts +0 -199
- package/source/Directive.ts +0 -248
- package/source/Discovery/Explorer.ts +0 -34
- package/source/Discovery/Site.test.ts +0 -147
- package/source/Discovery/Site.ts +0 -202
- package/source/Discovery/index.ts +0 -3
- package/source/Discovery/tree.test.ts +0 -175
- package/source/Discovery/tree.ts +0 -77
- package/source/Discovery/trunk.ts +0 -33
- package/source/Endpoint.test.ts +0 -67
- package/source/Endpoint.ts +0 -157
- package/source/Factory.ts +0 -42
- package/source/Gateway.ts +0 -390
- package/source/HTTP/Context.ts +0 -143
- package/source/HTTP/Probe.ts +0 -99
- package/source/HTTP/Server.ts +0 -430
- package/source/HTTP/Timing.ts +0 -14
- package/source/HTTP/address.test.ts +0 -28
- package/source/HTTP/address.ts +0 -16
- package/source/HTTP/exceptions.ts +0 -99
- package/source/HTTP/formats/form.ts +0 -21
- package/source/HTTP/formats/index.ts +0 -36
- package/source/HTTP/formats/json.ts +0 -14
- package/source/HTTP/formats/msgpack.ts +0 -14
- package/source/HTTP/formats/text.ts +0 -10
- package/source/HTTP/formats/yaml.test.ts +0 -22
- package/source/HTTP/formats/yaml.ts +0 -40
- package/source/HTTP/index.ts +0 -6
- package/source/HTTP/messages.test.ts +0 -196
- package/source/HTTP/messages.ts +0 -186
- package/source/HTTP/types.ts +0 -39
- package/source/Interception.ts +0 -37
- package/source/Introspection.ts +0 -179
- package/source/MCP/Server.ts +0 -335
- package/source/MCP/discover.ts +0 -51
- package/source/MCP/errors.ts +0 -80
- package/source/MCP/index.ts +0 -1
- package/source/MCP/schema.test.ts +0 -91
- package/source/MCP/schema.ts +0 -94
- package/source/MCP/tools.ts +0 -144
- package/source/MCP/types.ts +0 -84
- package/source/Mapping.ts +0 -101
- package/source/Query.test.ts +0 -54
- package/source/Query.ts +0 -277
- package/source/RPC/Context.ts +0 -75
- package/source/RPC/Dispatcher.ts +0 -150
- package/source/RPC/errors.test.ts +0 -77
- package/source/RPC/errors.ts +0 -82
- package/source/RPC/index.ts +0 -1
- package/source/RPC/names.test.ts +0 -141
- package/source/RPC/names.ts +0 -176
- package/source/RPC/types.ts +0 -34
- package/source/RTD/Context.ts +0 -16
- package/source/RTD/Directives.ts +0 -126
- package/source/RTD/Endpoint.ts +0 -27
- package/source/RTD/Match.ts +0 -11
- package/source/RTD/Method.ts +0 -39
- package/source/RTD/Node.ts +0 -169
- package/source/RTD/Route.ts +0 -93
- package/source/RTD/Tree.ts +0 -137
- package/source/RTD/expiration.test.ts +0 -81
- package/source/RTD/factory.ts +0 -105
- package/source/RTD/index.ts +0 -8
- package/source/RTD/segment.test.ts +0 -35
- package/source/RTD/segment.ts +0 -51
- package/source/RTD/syntax/index.ts +0 -2
- package/source/RTD/syntax/parse.test.ts +0 -196
- package/source/RTD/syntax/parse.ts +0 -171
- package/source/RTD/syntax/types.ts +0 -69
- package/source/RTD/walk.test.ts +0 -147
- package/source/Remotes.test.ts +0 -79
- package/source/Remotes.ts +0 -39
- package/source/Tenant.ts +0 -73
- package/source/const.ts +0 -45
- package/source/deployment.ts +0 -96
- package/source/directives/auth/Anonymous.test.ts +0 -70
- package/source/directives/auth/Anonymous.ts +0 -36
- package/source/directives/auth/Anyone.ts +0 -23
- package/source/directives/auth/Assert.ts +0 -43
- package/source/directives/auth/Authorization.test.ts +0 -24
- package/source/directives/auth/Authorization.ts +0 -388
- package/source/directives/auth/Delegate.test.ts +0 -36
- package/source/directives/auth/Delegate.ts +0 -54
- package/source/directives/auth/Echo.ts +0 -24
- package/source/directives/auth/Federation.ts +0 -104
- package/source/directives/auth/Id.ts +0 -37
- package/source/directives/auth/Incept.ts +0 -117
- package/source/directives/auth/Input.ts +0 -92
- package/source/directives/auth/Role.test.ts +0 -147
- package/source/directives/auth/Role.ts +0 -99
- package/source/directives/auth/Rule.ts +0 -59
- package/source/directives/auth/Scheme.ts +0 -31
- package/source/directives/auth/create.ts +0 -11
- package/source/directives/auth/index.ts +0 -3
- package/source/directives/auth/schemes.test.ts +0 -18
- package/source/directives/auth/schemes.ts +0 -39
- package/source/directives/auth/split.ts +0 -14
- package/source/directives/auth/types.ts +0 -75
- package/source/directives/cache/Cache.ts +0 -92
- package/source/directives/cache/Control.ts +0 -81
- package/source/directives/cache/Exact.ts +0 -7
- package/source/directives/cache/etag.ts +0 -38
- package/source/directives/cache/index.ts +0 -3
- package/source/directives/cache/types.ts +0 -9
- package/source/directives/cors/CORS.test.ts +0 -75
- package/source/directives/cors/CORS.ts +0 -88
- package/source/directives/cors/index.ts +0 -3
- package/source/directives/dev/Development.ts +0 -41
- package/source/directives/dev/Faulty.ts +0 -31
- package/source/directives/dev/Sleep.ts +0 -53
- package/source/directives/dev/Stub.ts +0 -14
- package/source/directives/dev/Throw.ts +0 -14
- package/source/directives/dev/index.ts +0 -3
- package/source/directives/dev/types.ts +0 -5
- package/source/directives/flow/Compose.ts +0 -98
- package/source/directives/flow/Fetch.ts +0 -86
- package/source/directives/flow/Flow.ts +0 -43
- package/source/directives/flow/index.ts +0 -3
- package/source/directives/flow/types.ts +0 -7
- package/source/directives/help/Family.ts +0 -122
- package/source/directives/help/Help.test.ts +0 -227
- package/source/directives/help/Help.ts +0 -47
- package/source/directives/help/Parameters.ts +0 -47
- package/source/directives/help/described.ts +0 -57
- package/source/directives/help/index.ts +0 -45
- package/source/directives/index.ts +0 -33
- package/source/directives/io/Directive.ts +0 -17
- package/source/directives/io/IO.ts +0 -118
- package/source/directives/io/Input.ts +0 -55
- package/source/directives/io/Message.ts +0 -1
- package/source/directives/io/Output.ts +0 -81
- package/source/directives/io/Status.test.ts +0 -88
- package/source/directives/io/Status.ts +0 -47
- package/source/directives/io/Throttle.ts +0 -30
- package/source/directives/io/index.ts +0 -3
- package/source/directives/io/lib/throttle/Configuration.test.ts +0 -72
- package/source/directives/io/lib/throttle/Configuration.ts +0 -68
- package/source/directives/io/lib/throttle/Keys.ts +0 -53
- package/source/directives/io/lib/throttle/Quotas.test.ts +0 -411
- package/source/directives/io/lib/throttle/Quotas.ts +0 -190
- package/source/directives/io/lib/throttle/Sync.test.ts +0 -163
- package/source/directives/io/lib/throttle/Sync.ts +0 -93
- package/source/directives/io/lib/throttle/Warning.test.ts +0 -32
- package/source/directives/io/lib/throttle/Warning.ts +0 -29
- package/source/directives/io/lib/throttle/components/Component.ts +0 -7
- package/source/directives/io/lib/throttle/components/IP.ts +0 -30
- package/source/directives/io/lib/throttle/components/Identity.ts +0 -19
- package/source/directives/io/lib/throttle/components/Path.ts +0 -8
- package/source/directives/io/lib/throttle/components/Route.ts +0 -19
- package/source/directives/io/lib/throttle/components/Segment.ts +0 -19
- package/source/directives/io/lib/throttle/components/index.ts +0 -19
- package/source/directives/io/lib/throttle/conditions/Condition.ts +0 -5
- package/source/directives/io/lib/throttle/conditions/Status.ts +0 -17
- package/source/directives/io/lib/throttle/conditions/index.ts +0 -11
- package/source/directives/io/lib/throttle/index.ts +0 -4
- package/source/directives/io/schemas.test.ts +0 -40
- package/source/directives/io/schemas.ts +0 -16
- package/source/directives/map/Authority.ts +0 -15
- package/source/directives/map/Buffer.ts +0 -15
- package/source/directives/map/Claims.ts +0 -63
- package/source/directives/map/Directive.ts +0 -4
- package/source/directives/map/Headers.ts +0 -60
- package/source/directives/map/Language.ts +0 -45
- package/source/directives/map/Languages.ts +0 -17
- package/source/directives/map/Map.ts +0 -85
- package/source/directives/map/Mapping.ts +0 -45
- package/source/directives/map/Properties.ts +0 -15
- package/source/directives/map/Segments.ts +0 -52
- package/source/directives/map/index.ts +0 -3
- package/source/directives/mcp/MCP.ts +0 -33
- package/source/directives/mcp/Tool.test.ts +0 -56
- package/source/directives/mcp/Tool.ts +0 -32
- package/source/directives/mcp/index.ts +0 -6
- package/source/directives/oauth/Discovery.ts +0 -66
- package/source/directives/oauth/documents.ts +0 -110
- package/source/directives/oauth/index.ts +0 -3
- package/source/directives/octets/Context.ts +0 -23
- package/source/directives/octets/Delete.ts +0 -96
- package/source/directives/octets/Directive.ts +0 -21
- package/source/directives/octets/Get.ts +0 -88
- package/source/directives/octets/Octets.ts +0 -82
- package/source/directives/octets/Put.ts +0 -186
- package/source/directives/octets/Workflow.ts +0 -60
- package/source/directives/octets/bytes.test.ts +0 -33
- package/source/directives/octets/bytes.ts +0 -18
- package/source/directives/octets/index.ts +0 -3
- package/source/directives/octets/schemas.test.ts +0 -20
- package/source/directives/octets/schemas.ts +0 -15
- package/source/directives/octets/types.ts +0 -9
- package/source/directives/octets/workflows/Execution.ts +0 -130
- package/source/directives/octets/workflows/Workflow.ts +0 -51
- package/source/directives/octets/workflows/index.ts +0 -1
- package/source/directives/require/Directive.ts +0 -5
- package/source/directives/require/Headers.ts +0 -19
- package/source/directives/require/Require.ts +0 -27
- package/source/directives/require/index.ts +0 -3
- package/source/discovery.ts +0 -1
- package/source/exceptions.ts +0 -47
- package/source/index.ts +0 -12
- package/source/io.ts +0 -4
- package/source/manifest.test.ts +0 -56
- package/source/manifest.ts +0 -56
- package/source/octets.d.ts +0 -17
- package/source/root.ts +0 -59
- package/source/schemas.test.ts +0 -31
- package/source/schemas.ts +0 -15
- package/source/service.ts +0 -94
- package/source/shortcuts.ts +0 -14
- package/source/userland.ts +0 -47
- package/transpiled/Annotation.d.ts +0 -70
- package/transpiled/Annotation.js +0 -2
- package/transpiled/Annotation.js.map +0 -1
- package/transpiled/RTD/syntax/parse.d.ts +0 -4
- package/transpiled/RTD/syntax/parse.js +0 -112
- package/transpiled/RTD/syntax/parse.js.map +0 -1
- package/transpiled/RTD/syntax/types.d.ts +0 -52
- package/transpiled/RTD/syntax/types.js +0 -11
- package/transpiled/RTD/syntax/types.js.map +0 -1
- package/transpiled/const.d.ts +0 -36
- package/transpiled/const.js +0 -37
- package/transpiled/const.js.map +0 -1
- package/transpiled/deployment.d.ts +0 -6
- package/transpiled/deployment.js +0 -76
- package/transpiled/deployment.js.map +0 -1
- package/transpiled/manifest.d.ts +0 -3
- package/transpiled/manifest.js +0 -39
- package/transpiled/manifest.js.map +0 -1
- package/transpiled/schemas.d.ts +0 -9
- package/transpiled/schemas.js +0 -9
- package/transpiled/schemas.js.map +0 -1
- package/transpiled/shortcuts.d.ts +0 -3
- package/transpiled/shortcuts.js +0 -13
- package/transpiled/shortcuts.js.map +0 -1
- package/tsconfig.json +0 -13
- package/tsconfig.tsbuildinfo +0 -1
- package/ui/dist/_app/immutable/assets/0.Bl7vLmIK.css +0 -2
- package/ui/dist/_app/immutable/assets/2.BC0-Jhqu.css +0 -1
- package/ui/dist/_app/immutable/chunks/B_pK3U1C.js +0 -6
- package/ui/dist/_app/immutable/chunks/CiKbPLyY.js +0 -1
- package/ui/dist/_app/immutable/chunks/DjIYL2zC.js +0 -3
- package/ui/dist/_app/immutable/entry/app.DMqmL4NY.js +0 -2
- package/ui/dist/_app/immutable/entry/start.CRe7HWBI.js +0 -1
- package/ui/dist/_app/immutable/nodes/0.D9m-6cbM.js +0 -1
- package/ui/dist/_app/immutable/nodes/1.Cgi_RcSO.js +0 -1
- package/ui/dist/_app/immutable/nodes/2.D_Cbxgz4.js +0 -14
package/features/mcp.feature
DELETED
|
@@ -1,753 +0,0 @@
|
|
|
1
|
-
@security
|
|
2
|
-
Feature: Model Context Protocol
|
|
3
|
-
|
|
4
|
-
A tool is a procedure a method is published as. A method says so with `mcp:tool`, and a
|
|
5
|
-
default denies: a tree holds everything an application serves and most of it is machinery
|
|
6
|
-
a model has no business reading. What the tool is called and what it is for is
|
|
7
|
-
`help:method`, which is what describes the method everywhere else as well. What a tool
|
|
8
|
-
takes and answers is what the method says of itself, and what a caller may do with it is
|
|
9
|
-
what `auth` says.
|
|
10
|
-
|
|
11
|
-
What a tool is, is stated on the route and nowhere else. The operation states what it is
|
|
12
|
-
too, and that is not this: one operation mounted on two routes is two tools. A `title`
|
|
13
|
-
beside the description is what a person is shown where a client lists what it may call.
|
|
14
|
-
|
|
15
|
-
Two revisions are answered from one endpoint that remembers nothing between requests: the
|
|
16
|
-
modern one, where every request carries its own version and capabilities, and the one
|
|
17
|
-
before it, which opens with `initialize`. Neither is given a session, and neither is given
|
|
18
|
-
a stream.
|
|
19
|
-
|
|
20
|
-
Background:
|
|
21
|
-
Given the annotation:
|
|
22
|
-
"""yaml
|
|
23
|
-
mcp:
|
|
24
|
-
name: Teapots
|
|
25
|
-
instructions: A pot is read by its id.
|
|
26
|
-
anonymous: true
|
|
27
|
-
"""
|
|
28
|
-
And the `pots` is running with the following manifest:
|
|
29
|
-
"""yaml
|
|
30
|
-
exposition:
|
|
31
|
-
/:
|
|
32
|
-
io:output: [id, title, volume]
|
|
33
|
-
GET:
|
|
34
|
-
mcp:tool: true
|
|
35
|
-
help:method:
|
|
36
|
-
description: All the pots, newest first.
|
|
37
|
-
endpoint: enumerate
|
|
38
|
-
POST:
|
|
39
|
-
mcp:tool: true
|
|
40
|
-
help:method:
|
|
41
|
-
description: Start a new pot brewing.
|
|
42
|
-
endpoint: create
|
|
43
|
-
/:id:
|
|
44
|
-
GET:
|
|
45
|
-
mcp:tool: true
|
|
46
|
-
help:method:
|
|
47
|
-
description: One pot, by its id.
|
|
48
|
-
endpoint: observe
|
|
49
|
-
/large:
|
|
50
|
-
GET:
|
|
51
|
-
query:
|
|
52
|
-
criteria: volume>=100
|
|
53
|
-
mcp:tool: true
|
|
54
|
-
help:method:
|
|
55
|
-
title: Large pots
|
|
56
|
-
description: The pots that hold a hundred or more, newest first.
|
|
57
|
-
endpoint: enumerate
|
|
58
|
-
/unpublished:
|
|
59
|
-
GET: enumerate
|
|
60
|
-
/guarded:
|
|
61
|
-
isolated: true
|
|
62
|
-
GET:
|
|
63
|
-
auth:role: admin
|
|
64
|
-
mcp:tool: true
|
|
65
|
-
help:method:
|
|
66
|
-
description: Every pot there is, for whoever may see them all.
|
|
67
|
-
endpoint: enumerate
|
|
68
|
-
"""
|
|
69
|
-
And the `pots` database contains:
|
|
70
|
-
| _id | title | volume |
|
|
71
|
-
| 4c4759e6f9c74da989d64511df42d6f4 | First pot | 100 |
|
|
72
|
-
|
|
73
|
-
Scenario: What the server is
|
|
74
|
-
When the following request is received:
|
|
75
|
-
"""
|
|
76
|
-
POST /.mcp HTTP/1.1
|
|
77
|
-
host: nex.toa.io
|
|
78
|
-
accept: application/yaml
|
|
79
|
-
content-type: application/json
|
|
80
|
-
mcp-protocol-version: 2026-07-28
|
|
81
|
-
mcp-method: server/discover
|
|
82
|
-
|
|
83
|
-
{"jsonrpc": "2.0", "id": 1, "method": "server/discover",
|
|
84
|
-
"params": {"_meta": {"io.modelcontextprotocol/protocolVersion": "2026-07-28",
|
|
85
|
-
"io.modelcontextprotocol/clientCapabilities": {}}}}
|
|
86
|
-
"""
|
|
87
|
-
Then the following reply is sent:
|
|
88
|
-
"""
|
|
89
|
-
200 OK
|
|
90
|
-
cache-control: no-store
|
|
91
|
-
|
|
92
|
-
jsonrpc: '2.0'
|
|
93
|
-
id: 1
|
|
94
|
-
result:
|
|
95
|
-
supportedVersions:
|
|
96
|
-
- '2026-07-28'
|
|
97
|
-
- '2025-11-25'
|
|
98
|
-
capabilities:
|
|
99
|
-
tools: {}
|
|
100
|
-
instructions: A pot is read by its id.
|
|
101
|
-
ttlMs: 1800000
|
|
102
|
-
cacheScope: public
|
|
103
|
-
resultType: complete
|
|
104
|
-
"""
|
|
105
|
-
|
|
106
|
-
Scenario: What a client of an earlier revision opens with
|
|
107
|
-
No session is made, and none is named back.
|
|
108
|
-
|
|
109
|
-
When the following request is received:
|
|
110
|
-
"""
|
|
111
|
-
POST /.mcp HTTP/1.1
|
|
112
|
-
host: nex.toa.io
|
|
113
|
-
accept: application/yaml
|
|
114
|
-
content-type: application/json
|
|
115
|
-
|
|
116
|
-
{"jsonrpc": "2.0", "id": 1, "method": "initialize",
|
|
117
|
-
"params": {"protocolVersion": "2025-11-25", "capabilities": {},
|
|
118
|
-
"clientInfo": {"name": "Inspector", "version": "2.5.0"}}}
|
|
119
|
-
"""
|
|
120
|
-
Then the following reply is sent:
|
|
121
|
-
"""
|
|
122
|
-
200 OK
|
|
123
|
-
|
|
124
|
-
jsonrpc: '2.0'
|
|
125
|
-
id: 1
|
|
126
|
-
result:
|
|
127
|
-
protocolVersion: '2025-11-25'
|
|
128
|
-
capabilities:
|
|
129
|
-
tools: {}
|
|
130
|
-
serverInfo:
|
|
131
|
-
name: Teapots
|
|
132
|
-
instructions: A pot is read by its id.
|
|
133
|
-
"""
|
|
134
|
-
And the reply does not contain:
|
|
135
|
-
"""
|
|
136
|
-
mcp-session-id
|
|
137
|
-
"""
|
|
138
|
-
When the following request is received:
|
|
139
|
-
"""
|
|
140
|
-
POST /.mcp HTTP/1.1
|
|
141
|
-
host: nex.toa.io
|
|
142
|
-
content-type: application/json
|
|
143
|
-
|
|
144
|
-
{"jsonrpc": "2.0", "method": "notifications/initialized"}
|
|
145
|
-
"""
|
|
146
|
-
Then the following reply is sent:
|
|
147
|
-
"""
|
|
148
|
-
202 Accepted
|
|
149
|
-
"""
|
|
150
|
-
|
|
151
|
-
Scenario: What the tools are
|
|
152
|
-
Every method that is published and the caller may reach. One the caller may not, and
|
|
153
|
-
one that is published as nothing at all, are both absent.
|
|
154
|
-
|
|
155
|
-
When the following request is received:
|
|
156
|
-
"""
|
|
157
|
-
POST /.mcp HTTP/1.1
|
|
158
|
-
host: nex.toa.io
|
|
159
|
-
accept: application/yaml
|
|
160
|
-
content-type: application/json
|
|
161
|
-
mcp-protocol-version: 2026-07-28
|
|
162
|
-
mcp-method: tools/list
|
|
163
|
-
|
|
164
|
-
{"jsonrpc": "2.0", "id": 2, "method": "tools/list",
|
|
165
|
-
"params": {"_meta": {"io.modelcontextprotocol/protocolVersion": "2026-07-28",
|
|
166
|
-
"io.modelcontextprotocol/clientCapabilities": {}}}}
|
|
167
|
-
"""
|
|
168
|
-
Then the following reply is sent:
|
|
169
|
-
"""
|
|
170
|
-
200 OK
|
|
171
|
-
|
|
172
|
-
jsonrpc: '2.0'
|
|
173
|
-
id: 2
|
|
174
|
-
result:
|
|
175
|
-
tools:
|
|
176
|
-
- name: pots.GET
|
|
177
|
-
description: All the pots, newest first.
|
|
178
|
-
inputSchema:
|
|
179
|
-
type: object
|
|
180
|
-
properties:
|
|
181
|
-
query:
|
|
182
|
-
type: object
|
|
183
|
-
properties:
|
|
184
|
-
criteria:
|
|
185
|
-
type: string
|
|
186
|
-
limit:
|
|
187
|
-
type: integer
|
|
188
|
-
minimum: 1
|
|
189
|
-
maximum: 100
|
|
190
|
-
default: 10
|
|
191
|
-
additionalProperties: false
|
|
192
|
-
annotations:
|
|
193
|
-
readOnlyHint: true
|
|
194
|
-
- name: pots.POST
|
|
195
|
-
description: Start a new pot brewing.
|
|
196
|
-
inputSchema:
|
|
197
|
-
type: object
|
|
198
|
-
properties:
|
|
199
|
-
title:
|
|
200
|
-
type: string
|
|
201
|
-
maxLength: 64
|
|
202
|
-
volume:
|
|
203
|
-
type: number
|
|
204
|
-
required:
|
|
205
|
-
- title
|
|
206
|
-
- volume
|
|
207
|
-
additionalProperties: false
|
|
208
|
-
- name: pots._id.GET
|
|
209
|
-
description: One pot, by its id.
|
|
210
|
-
inputSchema:
|
|
211
|
-
type: object
|
|
212
|
-
properties:
|
|
213
|
-
id:
|
|
214
|
-
type: string
|
|
215
|
-
required:
|
|
216
|
-
- id
|
|
217
|
-
additionalProperties: false
|
|
218
|
-
- name: pots.large.GET
|
|
219
|
-
title: Large pots
|
|
220
|
-
description: The pots that hold a hundred or more, newest first.
|
|
221
|
-
annotations:
|
|
222
|
-
readOnlyHint: true
|
|
223
|
-
ttlMs: 1800000
|
|
224
|
-
cacheScope: private
|
|
225
|
-
resultType: complete
|
|
226
|
-
"""
|
|
227
|
-
And the reply does not contain:
|
|
228
|
-
"""
|
|
229
|
-
pots.guarded.GET
|
|
230
|
-
"""
|
|
231
|
-
And the reply does not contain:
|
|
232
|
-
"""
|
|
233
|
-
pots.unpublished.GET
|
|
234
|
-
"""
|
|
235
|
-
And the reply does not contain:
|
|
236
|
-
"""
|
|
237
|
-
Put a pot on to brew.
|
|
238
|
-
"""
|
|
239
|
-
|
|
240
|
-
Scenario: A method that is published as nothing is not called by guessing its name
|
|
241
|
-
A route the application did not publish is served over HTTP exactly as before. What it
|
|
242
|
-
does not have is a name here, and naming it anyway reaches nothing.
|
|
243
|
-
|
|
244
|
-
When the following request is received:
|
|
245
|
-
"""
|
|
246
|
-
POST /.mcp HTTP/1.1
|
|
247
|
-
host: nex.toa.io
|
|
248
|
-
accept: application/yaml
|
|
249
|
-
content-type: application/json
|
|
250
|
-
mcp-protocol-version: 2026-07-28
|
|
251
|
-
mcp-method: tools/call
|
|
252
|
-
mcp-name: pots.unpublished.GET
|
|
253
|
-
|
|
254
|
-
{"jsonrpc": "2.0", "id": 30, "method": "tools/call",
|
|
255
|
-
"params": {"name": "pots.unpublished.GET", "arguments": {},
|
|
256
|
-
"_meta": {"io.modelcontextprotocol/protocolVersion": "2026-07-28",
|
|
257
|
-
"io.modelcontextprotocol/clientCapabilities": {}}}}
|
|
258
|
-
"""
|
|
259
|
-
Then the following reply is sent:
|
|
260
|
-
"""
|
|
261
|
-
404 Not Found
|
|
262
|
-
|
|
263
|
-
jsonrpc: '2.0'
|
|
264
|
-
id: null
|
|
265
|
-
error:
|
|
266
|
-
code: -32601
|
|
267
|
-
"""
|
|
268
|
-
|
|
269
|
-
Scenario: A tool that takes an identity is not listed to nobody
|
|
270
|
-
`tools/list` answers what this caller may reach, and it is the description that decides
|
|
271
|
-
— the same one `OPTIONS` answers. A model is not shown a tool it would be refused.
|
|
272
|
-
|
|
273
|
-
Given the annotation:
|
|
274
|
-
"""yaml
|
|
275
|
-
mcp:
|
|
276
|
-
name: Pots
|
|
277
|
-
anonymous: true
|
|
278
|
-
/:
|
|
279
|
-
anonymous: true
|
|
280
|
-
/pots/:id:
|
|
281
|
-
isolated: true
|
|
282
|
-
GET:
|
|
283
|
-
anonymous: true
|
|
284
|
-
mcp:tool: true
|
|
285
|
-
help:method: One pot, by its id.
|
|
286
|
-
dev:stub: []
|
|
287
|
-
PATCH:
|
|
288
|
-
auth:id: id
|
|
289
|
-
mcp:tool: true
|
|
290
|
-
help:method: Change your own pot.
|
|
291
|
-
dev:stub: []
|
|
292
|
-
"""
|
|
293
|
-
When the following request is received:
|
|
294
|
-
"""
|
|
295
|
-
POST /.mcp HTTP/1.1
|
|
296
|
-
host: nex.toa.io
|
|
297
|
-
accept: application/yaml
|
|
298
|
-
content-type: application/json
|
|
299
|
-
mcp-protocol-version: 2026-07-28
|
|
300
|
-
mcp-method: tools/list
|
|
301
|
-
|
|
302
|
-
{"jsonrpc": "2.0", "id": 3, "method": "tools/list",
|
|
303
|
-
"params": {"_meta": {"io.modelcontextprotocol/protocolVersion": "2026-07-28",
|
|
304
|
-
"io.modelcontextprotocol/clientCapabilities": {}}}}
|
|
305
|
-
"""
|
|
306
|
-
Then the following reply is sent:
|
|
307
|
-
"""
|
|
308
|
-
200 OK
|
|
309
|
-
|
|
310
|
-
- name: pots._id.GET
|
|
311
|
-
"""
|
|
312
|
-
And the reply does not contain:
|
|
313
|
-
"""
|
|
314
|
-
pots._id.PATCH
|
|
315
|
-
"""
|
|
316
|
-
|
|
317
|
-
Scenario: A credential does not hide an anonymous tool
|
|
318
|
-
A client here always presents one, and what refuses a credentialed request at an
|
|
319
|
-
`anonymous` route is that the reply would not be cacheable — which a tool's is not.
|
|
320
|
-
|
|
321
|
-
# developer:secret
|
|
322
|
-
Given the `identity.basic` database contains:
|
|
323
|
-
| _id | authority | username | password |
|
|
324
|
-
| efe3a65ebbee47ed95a73edd911ea328 | nex | developer | $2b$10$ZRSKkgZoGnrcTNA5w5eCcu3pxDzdTduhteVYXcp56AaNcilNkwJ.O |
|
|
325
|
-
And the `identity.bans` database is empty
|
|
326
|
-
When the following request is received:
|
|
327
|
-
"""
|
|
328
|
-
POST /.mcp HTTP/1.1
|
|
329
|
-
host: nex.toa.io
|
|
330
|
-
authorization: Basic ZGV2ZWxvcGVyOnNlY3JldA==
|
|
331
|
-
accept: application/yaml
|
|
332
|
-
content-type: application/json
|
|
333
|
-
mcp-protocol-version: 2026-07-28
|
|
334
|
-
mcp-method: tools/list
|
|
335
|
-
|
|
336
|
-
{"jsonrpc": "2.0", "id": 20, "method": "tools/list",
|
|
337
|
-
"params": {"_meta": {"io.modelcontextprotocol/protocolVersion": "2026-07-28",
|
|
338
|
-
"io.modelcontextprotocol/clientCapabilities": {}}}}
|
|
339
|
-
"""
|
|
340
|
-
Then the following reply is sent:
|
|
341
|
-
"""
|
|
342
|
-
200 OK
|
|
343
|
-
|
|
344
|
-
jsonrpc: '2.0'
|
|
345
|
-
id: 20
|
|
346
|
-
result:
|
|
347
|
-
tools:
|
|
348
|
-
- name: pots.GET
|
|
349
|
-
"""
|
|
350
|
-
|
|
351
|
-
Scenario: A tool takes what the procedure takes
|
|
352
|
-
When the following request is received:
|
|
353
|
-
"""
|
|
354
|
-
POST /.mcp HTTP/1.1
|
|
355
|
-
host: nex.toa.io
|
|
356
|
-
accept: application/yaml
|
|
357
|
-
content-type: application/json
|
|
358
|
-
mcp-protocol-version: 2026-07-28
|
|
359
|
-
mcp-method: tools/call
|
|
360
|
-
mcp-name: pots._id.GET
|
|
361
|
-
|
|
362
|
-
{"jsonrpc": "2.0", "id": 3, "method": "tools/call",
|
|
363
|
-
"params": {"name": "pots._id.GET",
|
|
364
|
-
"arguments": {"id": "4c4759e6f9c74da989d64511df42d6f4"},
|
|
365
|
-
"_meta": {"io.modelcontextprotocol/protocolVersion": "2026-07-28",
|
|
366
|
-
"io.modelcontextprotocol/clientCapabilities": {}}}}
|
|
367
|
-
"""
|
|
368
|
-
Then the following reply is sent:
|
|
369
|
-
"""
|
|
370
|
-
200 OK
|
|
371
|
-
|
|
372
|
-
jsonrpc: '2.0'
|
|
373
|
-
id: 3
|
|
374
|
-
result:
|
|
375
|
-
structuredContent:
|
|
376
|
-
id: 4c4759e6f9c74da989d64511df42d6f4
|
|
377
|
-
title: First pot
|
|
378
|
-
volume: 100
|
|
379
|
-
resultType: complete
|
|
380
|
-
"""
|
|
381
|
-
|
|
382
|
-
Scenario: What is left of the arguments is the input
|
|
383
|
-
When the following request is received:
|
|
384
|
-
"""
|
|
385
|
-
POST /.mcp HTTP/1.1
|
|
386
|
-
host: nex.toa.io
|
|
387
|
-
accept: application/yaml
|
|
388
|
-
content-type: application/json
|
|
389
|
-
mcp-protocol-version: 2026-07-28
|
|
390
|
-
mcp-method: tools/call
|
|
391
|
-
mcp-name: pots.POST
|
|
392
|
-
|
|
393
|
-
{"jsonrpc": "2.0", "id": 4, "method": "tools/call",
|
|
394
|
-
"params": {"name": "pots.POST", "arguments": {"title": "Kettle", "volume": 1.7},
|
|
395
|
-
"_meta": {"io.modelcontextprotocol/protocolVersion": "2026-07-28",
|
|
396
|
-
"io.modelcontextprotocol/clientCapabilities": {}}}}
|
|
397
|
-
"""
|
|
398
|
-
Then the following reply is sent:
|
|
399
|
-
"""
|
|
400
|
-
200 OK
|
|
401
|
-
|
|
402
|
-
jsonrpc: '2.0'
|
|
403
|
-
id: 4
|
|
404
|
-
result:
|
|
405
|
-
structuredContent:
|
|
406
|
-
id:
|
|
407
|
-
"""
|
|
408
|
-
|
|
409
|
-
Scenario: A name nothing answers to
|
|
410
|
-
|
|
411
|
-
When the following request is received:
|
|
412
|
-
"""
|
|
413
|
-
POST /.mcp HTTP/1.1
|
|
414
|
-
host: nex.toa.io
|
|
415
|
-
accept: application/yaml
|
|
416
|
-
content-type: application/json
|
|
417
|
-
mcp-protocol-version: 2026-07-28
|
|
418
|
-
mcp-method: tools/call
|
|
419
|
-
mcp-name: kettles.GET
|
|
420
|
-
|
|
421
|
-
{"jsonrpc": "2.0", "id": 5, "method": "tools/call",
|
|
422
|
-
"params": {"name": "kettles.GET", "arguments": {},
|
|
423
|
-
"_meta": {"io.modelcontextprotocol/protocolVersion": "2026-07-28",
|
|
424
|
-
"io.modelcontextprotocol/clientCapabilities": {}}}}
|
|
425
|
-
"""
|
|
426
|
-
Then the following reply is sent:
|
|
427
|
-
"""
|
|
428
|
-
404 Not Found
|
|
429
|
-
"""
|
|
430
|
-
|
|
431
|
-
Scenario: A method this server does not answer
|
|
432
|
-
The status is what tells a client that this endpoint is here and the method is not.
|
|
433
|
-
|
|
434
|
-
When the following request is received:
|
|
435
|
-
"""
|
|
436
|
-
POST /.mcp HTTP/1.1
|
|
437
|
-
host: nex.toa.io
|
|
438
|
-
accept: application/yaml
|
|
439
|
-
content-type: application/json
|
|
440
|
-
mcp-protocol-version: 2026-07-28
|
|
441
|
-
mcp-method: prompts/list
|
|
442
|
-
|
|
443
|
-
{"jsonrpc": "2.0", "id": 6, "method": "prompts/list",
|
|
444
|
-
"params": {"_meta": {"io.modelcontextprotocol/protocolVersion": "2026-07-28",
|
|
445
|
-
"io.modelcontextprotocol/clientCapabilities": {}}}}
|
|
446
|
-
"""
|
|
447
|
-
Then the following reply is sent:
|
|
448
|
-
"""
|
|
449
|
-
404 Not Found
|
|
450
|
-
|
|
451
|
-
jsonrpc: '2.0'
|
|
452
|
-
id: 6
|
|
453
|
-
error:
|
|
454
|
-
code: -32601
|
|
455
|
-
"""
|
|
456
|
-
|
|
457
|
-
Scenario: A header saying one thing and a body another
|
|
458
|
-
What routes a request and what answers it must not be told two different things.
|
|
459
|
-
|
|
460
|
-
When the following request is received:
|
|
461
|
-
"""
|
|
462
|
-
POST /.mcp HTTP/1.1
|
|
463
|
-
host: nex.toa.io
|
|
464
|
-
accept: application/yaml
|
|
465
|
-
content-type: application/json
|
|
466
|
-
mcp-protocol-version: 2026-07-28
|
|
467
|
-
mcp-method: tools/call
|
|
468
|
-
mcp-name: pots.GET
|
|
469
|
-
|
|
470
|
-
{"jsonrpc": "2.0", "id": 7, "method": "tools/call",
|
|
471
|
-
"params": {"name": "pots.POST", "arguments": {},
|
|
472
|
-
"_meta": {"io.modelcontextprotocol/protocolVersion": "2026-07-28",
|
|
473
|
-
"io.modelcontextprotocol/clientCapabilities": {}}}}
|
|
474
|
-
"""
|
|
475
|
-
Then the following reply is sent:
|
|
476
|
-
"""
|
|
477
|
-
400 Bad Request
|
|
478
|
-
|
|
479
|
-
jsonrpc: '2.0'
|
|
480
|
-
id: 7
|
|
481
|
-
error:
|
|
482
|
-
code: -32020
|
|
483
|
-
"""
|
|
484
|
-
|
|
485
|
-
Scenario: A revision neither served
|
|
486
|
-
When the following request is received:
|
|
487
|
-
"""
|
|
488
|
-
POST /.mcp HTTP/1.1
|
|
489
|
-
host: nex.toa.io
|
|
490
|
-
accept: application/yaml
|
|
491
|
-
content-type: application/json
|
|
492
|
-
mcp-protocol-version: 1900-01-01
|
|
493
|
-
mcp-method: tools/list
|
|
494
|
-
|
|
495
|
-
{"jsonrpc": "2.0", "id": 8, "method": "tools/list", "params": {}}
|
|
496
|
-
"""
|
|
497
|
-
Then the following reply is sent:
|
|
498
|
-
"""
|
|
499
|
-
400 Bad Request
|
|
500
|
-
|
|
501
|
-
jsonrpc: '2.0'
|
|
502
|
-
id: 8
|
|
503
|
-
error:
|
|
504
|
-
code: -32022
|
|
505
|
-
data:
|
|
506
|
-
supported:
|
|
507
|
-
- '2026-07-28'
|
|
508
|
-
- '2025-11-25'
|
|
509
|
-
requested: '1900-01-01'
|
|
510
|
-
"""
|
|
511
|
-
|
|
512
|
-
Scenario: What the endpoint does not serve
|
|
513
|
-
A stream is what these were for, and this endpoint has none.
|
|
514
|
-
|
|
515
|
-
When the following request is received:
|
|
516
|
-
"""
|
|
517
|
-
GET /.mcp HTTP/1.1
|
|
518
|
-
host: nex.toa.io
|
|
519
|
-
"""
|
|
520
|
-
Then the following reply is sent:
|
|
521
|
-
"""
|
|
522
|
-
405 Method Not Allowed
|
|
523
|
-
allow: POST
|
|
524
|
-
"""
|
|
525
|
-
|
|
526
|
-
Scenario: Without the annotation nothing answers there
|
|
527
|
-
Given the annotation:
|
|
528
|
-
"""yaml
|
|
529
|
-
{}
|
|
530
|
-
"""
|
|
531
|
-
When the following request is received:
|
|
532
|
-
"""
|
|
533
|
-
POST /.mcp HTTP/1.1
|
|
534
|
-
host: nex.toa.io
|
|
535
|
-
content-type: application/json
|
|
536
|
-
|
|
537
|
-
{"jsonrpc": "2.0", "id": 9, "method": "tools/list", "params": {}}
|
|
538
|
-
"""
|
|
539
|
-
Then the following reply is sent:
|
|
540
|
-
"""
|
|
541
|
-
404 Not Found
|
|
542
|
-
"""
|
|
543
|
-
|
|
544
|
-
Scenario: A tool the caller may not call
|
|
545
|
-
What `auth` makes of a call is a refusal of the call, not of the credential: the model
|
|
546
|
-
named a record that is not the caller's, which it may correct itself by naming another.
|
|
547
|
-
A challenge here would send the client to ask for a scope that would not help.
|
|
548
|
-
|
|
549
|
-
# developer:secret, who is not an `admin` and so may not reach `pots.guarded.GET`
|
|
550
|
-
Given the `identity.basic` database contains:
|
|
551
|
-
| _id | authority | username | password |
|
|
552
|
-
| efe3a65ebbee47ed95a73edd911ea328 | nex | developer | $2b$10$ZRSKkgZoGnrcTNA5w5eCcu3pxDzdTduhteVYXcp56AaNcilNkwJ.O |
|
|
553
|
-
And the `identity.bans` database is empty
|
|
554
|
-
When the following request is received:
|
|
555
|
-
"""
|
|
556
|
-
POST /.mcp HTTP/1.1
|
|
557
|
-
host: nex.toa.io
|
|
558
|
-
authorization: Basic ZGV2ZWxvcGVyOnNlY3JldA==
|
|
559
|
-
accept: application/yaml
|
|
560
|
-
content-type: application/json
|
|
561
|
-
mcp-protocol-version: 2026-07-28
|
|
562
|
-
mcp-method: tools/call
|
|
563
|
-
mcp-name: pots.guarded.GET
|
|
564
|
-
|
|
565
|
-
{"jsonrpc": "2.0", "id": 31, "method": "tools/call",
|
|
566
|
-
"params": {"name": "pots.guarded.GET", "arguments": {},
|
|
567
|
-
"_meta": {"io.modelcontextprotocol/protocolVersion": "2026-07-28",
|
|
568
|
-
"io.modelcontextprotocol/clientCapabilities": {}}}}
|
|
569
|
-
"""
|
|
570
|
-
Then the following reply is sent:
|
|
571
|
-
"""
|
|
572
|
-
200 OK
|
|
573
|
-
|
|
574
|
-
jsonrpc: '2.0'
|
|
575
|
-
id: 31
|
|
576
|
-
result:
|
|
577
|
-
isError: true
|
|
578
|
-
"""
|
|
579
|
-
And the reply does not contain:
|
|
580
|
-
"""
|
|
581
|
-
insufficient_scope
|
|
582
|
-
"""
|
|
583
|
-
|
|
584
|
-
Scenario: An argument the schemas would not take
|
|
585
|
-
What the arguments are refused for is the model's to correct by sending others, so it
|
|
586
|
-
is a result and not an error of the protocol.
|
|
587
|
-
|
|
588
|
-
When the following request is received:
|
|
589
|
-
"""
|
|
590
|
-
POST /.mcp HTTP/1.1
|
|
591
|
-
host: nex.toa.io
|
|
592
|
-
accept: application/yaml
|
|
593
|
-
content-type: application/json
|
|
594
|
-
mcp-protocol-version: 2026-07-28
|
|
595
|
-
mcp-method: tools/call
|
|
596
|
-
mcp-name: pots._id.GET
|
|
597
|
-
|
|
598
|
-
{"jsonrpc": "2.0", "id": 32, "method": "tools/call",
|
|
599
|
-
"params": {"name": "pots._id.GET",
|
|
600
|
-
"arguments": {"id": "not-an-id"},
|
|
601
|
-
"_meta": {"io.modelcontextprotocol/protocolVersion": "2026-07-28",
|
|
602
|
-
"io.modelcontextprotocol/clientCapabilities": {}}}}
|
|
603
|
-
"""
|
|
604
|
-
Then the following reply is sent:
|
|
605
|
-
"""
|
|
606
|
-
200 OK
|
|
607
|
-
|
|
608
|
-
jsonrpc: '2.0'
|
|
609
|
-
id: 32
|
|
610
|
-
result:
|
|
611
|
-
isError: true
|
|
612
|
-
"""
|
|
613
|
-
|
|
614
|
-
Scenario: What the operation refused with
|
|
615
|
-
A refusal is a value a model reads and may correct itself by, so it is a result rather
|
|
616
|
-
than an error of the protocol.
|
|
617
|
-
|
|
618
|
-
Given the `echo` is running with the following manifest:
|
|
619
|
-
"""yaml
|
|
620
|
-
exposition:
|
|
621
|
-
/:
|
|
622
|
-
io:output: true
|
|
623
|
-
GET:
|
|
624
|
-
mcp:tool: true
|
|
625
|
-
help:method:
|
|
626
|
-
description: Refuses, with what it was given.
|
|
627
|
-
endpoint: error
|
|
628
|
-
"""
|
|
629
|
-
When the following request is received:
|
|
630
|
-
"""
|
|
631
|
-
POST /.mcp HTTP/1.1
|
|
632
|
-
host: nex.toa.io
|
|
633
|
-
accept: application/yaml
|
|
634
|
-
content-type: application/json
|
|
635
|
-
mcp-protocol-version: 2026-07-28
|
|
636
|
-
mcp-method: tools/call
|
|
637
|
-
mcp-name: echo.GET
|
|
638
|
-
|
|
639
|
-
{"jsonrpc": "2.0", "id": 10, "method": "tools/call",
|
|
640
|
-
"params": {"name": "echo.GET", "arguments": {},
|
|
641
|
-
"_meta": {"io.modelcontextprotocol/protocolVersion": "2026-07-28",
|
|
642
|
-
"io.modelcontextprotocol/clientCapabilities": {}}}}
|
|
643
|
-
"""
|
|
644
|
-
Then the following reply is sent:
|
|
645
|
-
"""
|
|
646
|
-
200 OK
|
|
647
|
-
|
|
648
|
-
jsonrpc: '2.0'
|
|
649
|
-
id: 10
|
|
650
|
-
result:
|
|
651
|
-
content:
|
|
652
|
-
- type: text
|
|
653
|
-
text: message
|
|
654
|
-
isError: true
|
|
655
|
-
resultType: complete
|
|
656
|
-
"""
|
|
657
|
-
|
|
658
|
-
Scenario: An operation that declares no output
|
|
659
|
-
A schema the revision would have the reply validated against is worse said emptily than
|
|
660
|
-
left unsaid — and the reply is answered all the same.
|
|
661
|
-
|
|
662
|
-
Given the `echo` is running with the following manifest:
|
|
663
|
-
"""yaml
|
|
664
|
-
exposition:
|
|
665
|
-
/:
|
|
666
|
-
io:output: true
|
|
667
|
-
GET:
|
|
668
|
-
mcp:tool: true
|
|
669
|
-
help:method:
|
|
670
|
-
description: Answers with what it was given.
|
|
671
|
-
endpoint: echo
|
|
672
|
-
"""
|
|
673
|
-
When the following request is received:
|
|
674
|
-
"""
|
|
675
|
-
POST /.mcp HTTP/1.1
|
|
676
|
-
host: nex.toa.io
|
|
677
|
-
accept: application/yaml
|
|
678
|
-
content-type: application/json
|
|
679
|
-
mcp-protocol-version: 2026-07-28
|
|
680
|
-
mcp-method: tools/call
|
|
681
|
-
mcp-name: echo.GET
|
|
682
|
-
|
|
683
|
-
{"jsonrpc": "2.0", "id": 11, "method": "tools/call",
|
|
684
|
-
"params": {"name": "echo.GET", "arguments": {"greeting": "hello"},
|
|
685
|
-
"_meta": {"io.modelcontextprotocol/protocolVersion": "2026-07-28",
|
|
686
|
-
"io.modelcontextprotocol/clientCapabilities": {}}}}
|
|
687
|
-
"""
|
|
688
|
-
Then the following reply is sent:
|
|
689
|
-
"""
|
|
690
|
-
200 OK
|
|
691
|
-
|
|
692
|
-
jsonrpc: '2.0'
|
|
693
|
-
id: 11
|
|
694
|
-
result:
|
|
695
|
-
structuredContent:
|
|
696
|
-
greeting: hello
|
|
697
|
-
resultType: complete
|
|
698
|
-
"""
|
|
699
|
-
|
|
700
|
-
Scenario: An origin that is not listed
|
|
701
|
-
The revision requires this against DNS rebinding, and an empty list admits none.
|
|
702
|
-
|
|
703
|
-
When the following request is received:
|
|
704
|
-
"""
|
|
705
|
-
POST /.mcp HTTP/1.1
|
|
706
|
-
host: nex.toa.io
|
|
707
|
-
origin: https://elsewhere.example
|
|
708
|
-
accept: application/yaml
|
|
709
|
-
content-type: application/json
|
|
710
|
-
mcp-protocol-version: 2026-07-28
|
|
711
|
-
mcp-method: tools/list
|
|
712
|
-
|
|
713
|
-
{"jsonrpc": "2.0", "id": 12, "method": "tools/list",
|
|
714
|
-
"params": {"_meta": {"io.modelcontextprotocol/protocolVersion": "2026-07-28",
|
|
715
|
-
"io.modelcontextprotocol/clientCapabilities": {}}}}
|
|
716
|
-
"""
|
|
717
|
-
Then the following reply is sent:
|
|
718
|
-
"""
|
|
719
|
-
403 Forbidden
|
|
720
|
-
"""
|
|
721
|
-
|
|
722
|
-
Scenario: Without a credential
|
|
723
|
-
A request without one is where the authorization flow starts, so the refusal carries
|
|
724
|
-
the document that says where to get a token.
|
|
725
|
-
|
|
726
|
-
Given the annotation:
|
|
727
|
-
"""yaml
|
|
728
|
-
authorities:
|
|
729
|
-
nex: nex.toa.io
|
|
730
|
-
oauth:
|
|
731
|
-
authorize: https://app.nex.toa.io/oauth/authorize
|
|
732
|
-
resources: ['/.mcp']
|
|
733
|
-
mcp:
|
|
734
|
-
name: Teapots
|
|
735
|
-
"""
|
|
736
|
-
When the following request is received:
|
|
737
|
-
"""
|
|
738
|
-
POST /.mcp HTTP/1.1
|
|
739
|
-
host: nex.toa.io
|
|
740
|
-
accept: application/yaml
|
|
741
|
-
content-type: application/json
|
|
742
|
-
mcp-protocol-version: 2026-07-28
|
|
743
|
-
mcp-method: tools/list
|
|
744
|
-
|
|
745
|
-
{"jsonrpc": "2.0", "id": 13, "method": "tools/list",
|
|
746
|
-
"params": {"_meta": {"io.modelcontextprotocol/protocolVersion": "2026-07-28",
|
|
747
|
-
"io.modelcontextprotocol/clientCapabilities": {}}}}
|
|
748
|
-
"""
|
|
749
|
-
Then the following reply is sent:
|
|
750
|
-
"""
|
|
751
|
-
401 Unauthorized
|
|
752
|
-
www-authenticate: Bearer resource_metadata="https://nex.toa.io/.well-known/oauth-protected-resource/.mcp"
|
|
753
|
-
"""
|