mcp-auth-server 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +207 -2
- package/bin/keygen.mjs +26 -0
- package/lib/adapters/express/express.middleware.d.ts +4 -0
- package/lib/adapters/express/express.middleware.js +23 -0
- package/lib/adapters/express/express.middleware.js.map +1 -0
- package/lib/adapters/fastify/fastify.plugin.d.ts +4 -0
- package/lib/adapters/fastify/fastify.plugin.js +32 -0
- package/lib/adapters/fastify/fastify.plugin.js.map +1 -0
- package/lib/adapters/fetch/create.fetch.handler.d.ts +3 -0
- package/lib/adapters/fetch/create.fetch.handler.js +13 -0
- package/lib/adapters/fetch/create.fetch.handler.js.map +1 -0
- package/lib/adapters/fetch/to.http.request.d.ts +3 -0
- package/lib/adapters/fetch/to.http.request.js +22 -0
- package/lib/adapters/fetch/to.http.request.js.map +1 -0
- package/lib/adapters/fetch/to.response.d.ts +3 -0
- package/lib/adapters/fetch/to.response.js +10 -0
- package/lib/adapters/fetch/to.response.js.map +1 -0
- package/lib/adapters/koa/koa.middleware.d.ts +4 -0
- package/lib/adapters/koa/koa.middleware.js +19 -0
- package/lib/adapters/koa/koa.middleware.js.map +1 -0
- package/lib/adapters/node/create.node.handler.d.ts +4 -0
- package/lib/adapters/node/create.node.handler.js +16 -0
- package/lib/adapters/node/create.node.handler.js.map +1 -0
- package/lib/adapters/node/node.ssrf.guard.d.ts +2 -0
- package/lib/adapters/node/node.ssrf.guard.js +16 -0
- package/lib/adapters/node/node.ssrf.guard.js.map +1 -0
- package/lib/adapters/node/parse.node.body.d.ts +3 -0
- package/lib/adapters/node/parse.node.body.js +16 -0
- package/lib/adapters/node/parse.node.body.js.map +1 -0
- package/lib/adapters/node/read.node.body.d.ts +3 -0
- package/lib/adapters/node/read.node.body.js +10 -0
- package/lib/adapters/node/read.node.body.js.map +1 -0
- package/lib/adapters/node/to.node.http.request.d.ts +4 -0
- package/lib/adapters/node/to.node.http.request.js +20 -0
- package/lib/adapters/node/to.node.http.request.js.map +1 -0
- package/lib/adapters/node/write.node.response.d.ts +4 -0
- package/lib/adapters/node/write.node.response.js +10 -0
- package/lib/adapters/node/write.node.response.js.map +1 -0
- package/lib/cache/lru.metadata.cache.d.ts +10 -0
- package/lib/cache/lru.metadata.cache.js +31 -0
- package/lib/cache/lru.metadata.cache.js.map +1 -0
- package/lib/functions/body/parse.body.d.ts +2 -0
- package/lib/functions/body/parse.body.js +20 -0
- package/lib/functions/body/parse.body.js.map +1 -0
- package/lib/functions/body/parse.query.d.ts +2 -0
- package/lib/functions/body/parse.query.js +16 -0
- package/lib/functions/body/parse.query.js.map +1 -0
- package/lib/functions/cimd/assert.public.host.d.ts +2 -0
- package/lib/functions/cimd/assert.public.host.js +15 -0
- package/lib/functions/cimd/assert.public.host.js.map +1 -0
- package/lib/functions/cimd/cache.seconds.d.ts +2 -0
- package/lib/functions/cimd/cache.seconds.js +16 -0
- package/lib/functions/cimd/cache.seconds.js.map +1 -0
- package/lib/functions/cimd/create.metadata.resolver.d.ts +5 -0
- package/lib/functions/cimd/create.metadata.resolver.js +53 -0
- package/lib/functions/cimd/create.metadata.resolver.js.map +1 -0
- package/lib/functions/cimd/host.matches.d.ts +2 -0
- package/lib/functions/cimd/host.matches.js +5 -0
- package/lib/functions/cimd/host.matches.js.map +1 -0
- package/lib/functions/cimd/is.metadata.client.id.d.ts +2 -0
- package/lib/functions/cimd/is.metadata.client.id.js +14 -0
- package/lib/functions/cimd/is.metadata.client.id.js.map +1 -0
- package/lib/functions/cimd/is.private.ipv4.d.ts +2 -0
- package/lib/functions/cimd/is.private.ipv4.js +18 -0
- package/lib/functions/cimd/is.private.ipv4.js.map +1 -0
- package/lib/functions/cimd/is.private.ipv6.d.ts +2 -0
- package/lib/functions/cimd/is.private.ipv6.js +17 -0
- package/lib/functions/cimd/is.private.ipv6.js.map +1 -0
- package/lib/functions/cimd/read.limited.d.ts +2 -0
- package/lib/functions/cimd/read.limited.js +32 -0
- package/lib/functions/cimd/read.limited.js.map +1 -0
- package/lib/functions/cimd/validate.metadata.document.d.ts +3 -0
- package/lib/functions/cimd/validate.metadata.document.js +25 -0
- package/lib/functions/cimd/validate.metadata.document.js.map +1 -0
- package/lib/functions/consent/consent.styles.d.ts +2 -0
- package/lib/functions/consent/consent.styles.js +20 -0
- package/lib/functions/consent/consent.styles.js.map +1 -0
- package/lib/functions/consent/escape.html.d.ts +2 -0
- package/lib/functions/consent/escape.html.js +5 -0
- package/lib/functions/consent/escape.html.js.map +1 -0
- package/lib/functions/consent/render.default.consent.d.ts +3 -0
- package/lib/functions/consent/render.default.consent.js +50 -0
- package/lib/functions/consent/render.default.consent.js.map +1 -0
- package/lib/functions/crypto/random.id.d.ts +2 -0
- package/lib/functions/crypto/random.id.js +5 -0
- package/lib/functions/crypto/random.id.js.map +1 -0
- package/lib/functions/crypto/random.token.d.ts +2 -0
- package/lib/functions/crypto/random.token.js +9 -0
- package/lib/functions/crypto/random.token.js.map +1 -0
- package/lib/functions/crypto/sha256.base64.url.d.ts +2 -0
- package/lib/functions/crypto/sha256.base64.url.js +10 -0
- package/lib/functions/crypto/sha256.base64.url.js.map +1 -0
- package/lib/functions/crypto/sha256.digest.d.ts +2 -0
- package/lib/functions/crypto/sha256.digest.js +5 -0
- package/lib/functions/crypto/sha256.digest.js.map +1 -0
- package/lib/functions/crypto/sha256.hex.d.ts +2 -0
- package/lib/functions/crypto/sha256.hex.js +9 -0
- package/lib/functions/crypto/sha256.hex.js.map +1 -0
- package/lib/functions/crypto/to.base64.url.d.ts +2 -0
- package/lib/functions/crypto/to.base64.url.js +10 -0
- package/lib/functions/crypto/to.base64.url.js.map +1 -0
- package/lib/functions/http/form.params.d.ts +2 -0
- package/lib/functions/http/form.params.js +5 -0
- package/lib/functions/http/form.params.js.map +1 -0
- package/lib/functions/http/header.value.d.ts +3 -0
- package/lib/functions/http/header.value.js +8 -0
- package/lib/functions/http/header.value.js.map +1 -0
- package/lib/functions/http/json.response.d.ts +3 -0
- package/lib/functions/http/json.response.js +9 -0
- package/lib/functions/http/json.response.js.map +1 -0
- package/lib/functions/http/oauth.error.response.d.ts +3 -0
- package/lib/functions/http/oauth.error.response.js +9 -0
- package/lib/functions/http/oauth.error.response.js.map +1 -0
- package/lib/functions/http/plain.error.response.d.ts +3 -0
- package/lib/functions/http/plain.error.response.js +5 -0
- package/lib/functions/http/plain.error.response.js.map +1 -0
- package/lib/functions/http/query.param.d.ts +3 -0
- package/lib/functions/http/query.param.js +8 -0
- package/lib/functions/http/query.param.js.map +1 -0
- package/lib/functions/http/redirect.response.d.ts +3 -0
- package/lib/functions/http/redirect.response.js +5 -0
- package/lib/functions/http/redirect.response.js.map +1 -0
- package/lib/functions/http/text.value.d.ts +2 -0
- package/lib/functions/http/text.value.js +5 -0
- package/lib/functions/http/text.value.js.map +1 -0
- package/lib/functions/http/trim.trailing.slashes.d.ts +2 -0
- package/lib/functions/http/trim.trailing.slashes.js +10 -0
- package/lib/functions/http/trim.trailing.slashes.js.map +1 -0
- package/lib/functions/jwt/sign.access.token.d.ts +4 -0
- package/lib/functions/jwt/sign.access.token.js +21 -0
- package/lib/functions/jwt/sign.access.token.js.map +1 -0
- package/lib/functions/jwt/verify.access.token.d.ts +4 -0
- package/lib/functions/jwt/verify.access.token.js +16 -0
- package/lib/functions/jwt/verify.access.token.js.map +1 -0
- package/lib/functions/keys/der.length.d.ts +2 -0
- package/lib/functions/keys/der.length.js +12 -0
- package/lib/functions/keys/der.length.js.map +1 -0
- package/lib/functions/keys/is.rsa.key.d.ts +2 -0
- package/lib/functions/keys/is.rsa.key.js +8 -0
- package/lib/functions/keys/is.rsa.key.js.map +1 -0
- package/lib/functions/keys/normalize.pem.d.ts +2 -0
- package/lib/functions/keys/normalize.pem.js +16 -0
- package/lib/functions/keys/normalize.pem.js.map +1 -0
- package/lib/functions/keys/pkcs1.to.pkcs8.d.ts +2 -0
- package/lib/functions/keys/pkcs1.to.pkcs8.js +14 -0
- package/lib/functions/keys/pkcs1.to.pkcs8.js.map +1 -0
- package/lib/functions/keys/resolve.key.pair.d.ts +3 -0
- package/lib/functions/keys/resolve.key.pair.js +27 -0
- package/lib/functions/keys/resolve.key.pair.js.map +1 -0
- package/lib/functions/keys/signing.key.from.env.d.ts +2 -0
- package/lib/functions/keys/signing.key.from.env.js +14 -0
- package/lib/functions/keys/signing.key.from.env.js.map +1 -0
- package/lib/functions/keys/wrap.pem.d.ts +2 -0
- package/lib/functions/keys/wrap.pem.js +11 -0
- package/lib/functions/keys/wrap.pem.js.map +1 -0
- package/lib/functions/redirect/build.error.redirect.d.ts +2 -0
- package/lib/functions/redirect/build.error.redirect.js +9 -0
- package/lib/functions/redirect/build.error.redirect.js.map +1 -0
- package/lib/functions/redirect/build.redirect.d.ts +2 -0
- package/lib/functions/redirect/build.redirect.js +12 -0
- package/lib/functions/redirect/build.redirect.js.map +1 -0
- package/lib/functions/redirect/describe.redirect.target.d.ts +2 -0
- package/lib/functions/redirect/describe.redirect.target.js +8 -0
- package/lib/functions/redirect/describe.redirect.target.js.map +1 -0
- package/lib/functions/redirect/is.allowed.redirect.uri.d.ts +3 -0
- package/lib/functions/redirect/is.allowed.redirect.uri.js +19 -0
- package/lib/functions/redirect/is.allowed.redirect.uri.js.map +1 -0
- package/lib/functions/redirect/is.loopback.redirect.d.ts +2 -0
- package/lib/functions/redirect/is.loopback.redirect.js +13 -0
- package/lib/functions/redirect/is.loopback.redirect.js.map +1 -0
- package/lib/functions/redirect/is.safe.metadata.redirect.uri.d.ts +2 -0
- package/lib/functions/redirect/is.safe.metadata.redirect.uri.js +20 -0
- package/lib/functions/redirect/is.safe.metadata.redirect.uri.js.map +1 -0
- package/lib/functions/redirect/parse.url.d.ts +2 -0
- package/lib/functions/redirect/parse.url.js +14 -0
- package/lib/functions/redirect/parse.url.js.map +1 -0
- package/lib/functions/server/attach.and.continue.d.ts +6 -0
- package/lib/functions/server/attach.and.continue.js +15 -0
- package/lib/functions/server/attach.and.continue.js.map +1 -0
- package/lib/functions/server/authenticate.request.d.ts +5 -0
- package/lib/functions/server/authenticate.request.js +24 -0
- package/lib/functions/server/authenticate.request.js.map +1 -0
- package/lib/functions/server/awaiting.consent.d.ts +5 -0
- package/lib/functions/server/awaiting.consent.js +18 -0
- package/lib/functions/server/awaiting.consent.js.map +1 -0
- package/lib/functions/server/build.routes.d.ts +4 -0
- package/lib/functions/server/build.routes.js +40 -0
- package/lib/functions/server/build.routes.js.map +1 -0
- package/lib/functions/server/build.upstream.context.d.ts +6 -0
- package/lib/functions/server/build.upstream.context.js +11 -0
- package/lib/functions/server/build.upstream.context.js.map +1 -0
- package/lib/functions/server/challenge.response.d.ts +4 -0
- package/lib/functions/server/challenge.response.js +14 -0
- package/lib/functions/server/challenge.response.js.map +1 -0
- package/lib/functions/server/continue.with.user.d.ts +5 -0
- package/lib/functions/server/continue.with.user.js +18 -0
- package/lib/functions/server/continue.with.user.js.map +1 -0
- package/lib/functions/server/create.client.resolver.d.ts +6 -0
- package/lib/functions/server/create.client.resolver.js +26 -0
- package/lib/functions/server/create.client.resolver.js.map +1 -0
- package/lib/functions/server/create.mcp.auth.context.d.ts +4 -0
- package/lib/functions/server/create.mcp.auth.context.js +38 -0
- package/lib/functions/server/create.mcp.auth.context.js.map +1 -0
- package/lib/functions/server/create.mcp.auth.d.ts +4 -0
- package/lib/functions/server/create.mcp.auth.js +25 -0
- package/lib/functions/server/create.mcp.auth.js.map +1 -0
- package/lib/functions/server/deny.authorization.d.ts +5 -0
- package/lib/functions/server/deny.authorization.js +13 -0
- package/lib/functions/server/deny.authorization.js.map +1 -0
- package/lib/functions/server/exchange.authorization.code.d.ts +4 -0
- package/lib/functions/server/exchange.authorization.code.js +32 -0
- package/lib/functions/server/exchange.authorization.code.js.map +1 -0
- package/lib/functions/server/find.route.d.ts +4 -0
- package/lib/functions/server/find.route.js +5 -0
- package/lib/functions/server/find.route.js.map +1 -0
- package/lib/functions/server/handle.request.d.ts +6 -0
- package/lib/functions/server/handle.request.js +21 -0
- package/lib/functions/server/handle.request.js.map +1 -0
- package/lib/functions/server/has.credentials.d.ts +3 -0
- package/lib/functions/server/has.credentials.js +9 -0
- package/lib/functions/server/has.credentials.js.map +1 -0
- package/lib/functions/server/issue.authorization.code.d.ts +5 -0
- package/lib/functions/server/issue.authorization.code.js +24 -0
- package/lib/functions/server/issue.authorization.code.js.map +1 -0
- package/lib/functions/server/issue.tokens.d.ts +4 -0
- package/lib/functions/server/issue.tokens.js +30 -0
- package/lib/functions/server/issue.tokens.js.map +1 -0
- package/lib/functions/server/load.pending.d.ts +5 -0
- package/lib/functions/server/load.pending.js +13 -0
- package/lib/functions/server/load.pending.js.map +1 -0
- package/lib/functions/server/rotate.refresh.token.d.ts +4 -0
- package/lib/functions/server/rotate.refresh.token.js +33 -0
- package/lib/functions/server/rotate.refresh.token.js.map +1 -0
- package/lib/functions/server/token.failure.d.ts +3 -0
- package/lib/functions/server/token.failure.js +9 -0
- package/lib/functions/server/token.failure.js.map +1 -0
- package/lib/functions/sql/from.better.sqlite3.d.ts +10 -0
- package/lib/functions/sql/from.better.sqlite3.js +11 -0
- package/lib/functions/sql/from.better.sqlite3.js.map +1 -0
- package/lib/functions/sql/from.bun.sqlite.d.ts +7 -0
- package/lib/functions/sql/from.bun.sqlite.js +5 -0
- package/lib/functions/sql/from.bun.sqlite.js.map +1 -0
- package/lib/functions/sql/from.d1.d.ts +11 -0
- package/lib/functions/sql/from.d1.js +8 -0
- package/lib/functions/sql/from.d1.js.map +1 -0
- package/lib/functions/sql/from.node.sqlite.d.ts +7 -0
- package/lib/functions/sql/from.node.sqlite.js +5 -0
- package/lib/functions/sql/from.node.sqlite.js.map +1 -0
- package/lib/functions/sql/from.pg.d.ts +7 -0
- package/lib/functions/sql/from.pg.js +5 -0
- package/lib/functions/sql/from.pg.js.map +1 -0
- package/lib/functions/sql/from.postgres.js.d.ts +5 -0
- package/lib/functions/sql/from.postgres.js.js +5 -0
- package/lib/functions/sql/from.postgres.js.js.map +1 -0
- package/lib/functions/sql/optional.date.d.ts +2 -0
- package/lib/functions/sql/optional.date.js +5 -0
- package/lib/functions/sql/optional.date.js.map +1 -0
- package/lib/functions/sql/optional.number.d.ts +2 -0
- package/lib/functions/sql/optional.number.js +5 -0
- package/lib/functions/sql/optional.number.js.map +1 -0
- package/lib/functions/sql/optional.text.d.ts +2 -0
- package/lib/functions/sql/optional.text.js +5 -0
- package/lib/functions/sql/optional.text.js.map +1 -0
- package/lib/functions/sql/row.to.client.d.ts +4 -0
- package/lib/functions/sql/row.to.client.js +18 -0
- package/lib/functions/sql/row.to.client.js.map +1 -0
- package/lib/functions/sql/row.to.code.d.ts +4 -0
- package/lib/functions/sql/row.to.code.js +21 -0
- package/lib/functions/sql/row.to.code.js.map +1 -0
- package/lib/functions/sql/row.to.pending.d.ts +4 -0
- package/lib/functions/sql/row.to.pending.js +21 -0
- package/lib/functions/sql/row.to.pending.js.map +1 -0
- package/lib/functions/sql/row.to.refresh.token.d.ts +4 -0
- package/lib/functions/sql/row.to.refresh.token.js +22 -0
- package/lib/functions/sql/row.to.refresh.token.js.map +1 -0
- package/lib/functions/sql/sql.schema.d.ts +3 -0
- package/lib/functions/sql/sql.schema.js +62 -0
- package/lib/functions/sql/sql.schema.js.map +1 -0
- package/lib/functions/sql/to.dialect.sql.d.ts +3 -0
- package/lib/functions/sql/to.dialect.sql.js +13 -0
- package/lib/functions/sql/to.dialect.sql.js.map +1 -0
- package/lib/functions/upstream/app.session.upstream.d.ts +4 -0
- package/lib/functions/upstream/app.session.upstream.js +18 -0
- package/lib/functions/upstream/app.session.upstream.js.map +1 -0
- package/lib/functions/upstream/entra.upstream.d.ts +11 -0
- package/lib/functions/upstream/entra.upstream.js +16 -0
- package/lib/functions/upstream/entra.upstream.js.map +1 -0
- package/lib/functions/upstream/oidc.upstream.d.ts +4 -0
- package/lib/functions/upstream/oidc.upstream.js +82 -0
- package/lib/functions/upstream/oidc.upstream.js.map +1 -0
- package/lib/functions/upstream/verify.id.token.d.ts +3 -0
- package/lib/functions/upstream/verify.id.token.js +16 -0
- package/lib/functions/upstream/verify.id.token.js.map +1 -0
- package/lib/handlers/authorization.server.metadata.handler.d.ts +4 -0
- package/lib/handlers/authorization.server.metadata.handler.js +24 -0
- package/lib/handlers/authorization.server.metadata.handler.js.map +1 -0
- package/lib/handlers/authorize.handler.d.ts +5 -0
- package/lib/handlers/authorize.handler.js +58 -0
- package/lib/handlers/authorize.handler.js.map +1 -0
- package/lib/handlers/callback.handler.d.ts +5 -0
- package/lib/handlers/callback.handler.js +32 -0
- package/lib/handlers/callback.handler.js.map +1 -0
- package/lib/handlers/consent.decision.handler.d.ts +5 -0
- package/lib/handlers/consent.decision.handler.js +30 -0
- package/lib/handlers/consent.decision.handler.js.map +1 -0
- package/lib/handlers/consent.page.handler.d.ts +5 -0
- package/lib/handlers/consent.page.handler.js +43 -0
- package/lib/handlers/consent.page.handler.js.map +1 -0
- package/lib/handlers/protected.resource.metadata.handler.d.ts +4 -0
- package/lib/handlers/protected.resource.metadata.handler.js +9 -0
- package/lib/handlers/protected.resource.metadata.handler.js.map +1 -0
- package/lib/handlers/register.handler.d.ts +5 -0
- package/lib/handlers/register.handler.js +44 -0
- package/lib/handlers/register.handler.js.map +1 -0
- package/lib/handlers/resume.handler.d.ts +5 -0
- package/lib/handlers/resume.handler.js +25 -0
- package/lib/handlers/resume.handler.js.map +1 -0
- package/lib/handlers/revoke.handler.d.ts +5 -0
- package/lib/handlers/revoke.handler.js +27 -0
- package/lib/handlers/revoke.handler.js.map +1 -0
- package/lib/handlers/token.handler.d.ts +5 -0
- package/lib/handlers/token.handler.js +22 -0
- package/lib/handlers/token.handler.js.map +1 -0
- package/lib/mcp.auth.entra.d.ts +4 -0
- package/lib/mcp.auth.entra.js +11 -0
- package/lib/mcp.auth.entra.js.map +1 -0
- package/lib/mcp.auth.express.d.ts +4 -0
- package/lib/mcp.auth.express.js +11 -0
- package/lib/mcp.auth.express.js.map +1 -0
- package/lib/mcp.auth.fastify.d.ts +4 -0
- package/lib/mcp.auth.fastify.js +11 -0
- package/lib/mcp.auth.fastify.js.map +1 -0
- package/lib/mcp.auth.fetch.d.ts +6 -0
- package/lib/mcp.auth.fetch.js +15 -0
- package/lib/mcp.auth.fetch.js.map +1 -0
- package/lib/mcp.auth.koa.d.ts +4 -0
- package/lib/mcp.auth.koa.js +11 -0
- package/lib/mcp.auth.koa.js.map +1 -0
- package/lib/mcp.auth.memory.d.ts +4 -0
- package/lib/mcp.auth.memory.js +11 -0
- package/lib/mcp.auth.memory.js.map +1 -0
- package/lib/mcp.auth.mongodb.d.ts +6 -0
- package/lib/mcp.auth.mongodb.js +11 -0
- package/lib/mcp.auth.mongodb.js.map +1 -0
- package/lib/mcp.auth.node.d.ts +9 -0
- package/lib/mcp.auth.node.js +21 -0
- package/lib/mcp.auth.node.js.map +1 -0
- package/lib/mcp.auth.postgres.d.ts +11 -0
- package/lib/mcp.auth.postgres.js +20 -0
- package/lib/mcp.auth.postgres.js.map +1 -0
- package/lib/mcp.auth.server.d.ts +42 -0
- package/lib/mcp.auth.server.js +35 -0
- package/lib/mcp.auth.server.js.map +1 -0
- package/lib/mcp.auth.sqlite.d.ts +13 -0
- package/lib/mcp.auth.sqlite.js +24 -0
- package/lib/mcp.auth.sqlite.js.map +1 -0
- package/lib/storage/memory.storage.d.ts +30 -0
- package/lib/storage/memory.storage.js +91 -0
- package/lib/storage/memory.storage.js.map +1 -0
- package/lib/storage/mongodb.storage.d.ts +41 -0
- package/lib/storage/mongodb.storage.js +172 -0
- package/lib/storage/mongodb.storage.js.map +1 -0
- package/lib/storage/sql.storage.d.ts +35 -0
- package/lib/storage/sql.storage.js +128 -0
- package/lib/storage/sql.storage.js.map +1 -0
- package/lib/types/access.token.input.type.d.ts +9 -0
- package/lib/types/access.token.input.type.js +3 -0
- package/lib/types/access.token.input.type.js.map +1 -0
- package/lib/types/app.session.upstream.options.type.d.ts +7 -0
- package/lib/types/app.session.upstream.options.type.js +3 -0
- package/lib/types/app.session.upstream.options.type.js.map +1 -0
- package/lib/types/authenticate.result.type.d.ts +10 -0
- package/lib/types/authenticate.result.type.js +3 -0
- package/lib/types/authenticate.result.type.js.map +1 -0
- package/lib/types/authenticated.user.type.d.ts +5 -0
- package/lib/types/authenticated.user.type.js +3 -0
- package/lib/types/authenticated.user.type.js.map +1 -0
- package/lib/types/authorization.code.record.type.d.ts +11 -0
- package/lib/types/authorization.code.record.type.js +3 -0
- package/lib/types/authorization.code.record.type.js.map +1 -0
- package/lib/types/cimd.options.type.d.ts +16 -0
- package/lib/types/cimd.options.type.js +3 -0
- package/lib/types/cimd.options.type.js.map +1 -0
- package/lib/types/client.metadata.type.d.ts +7 -0
- package/lib/types/client.metadata.type.js +3 -0
- package/lib/types/client.metadata.type.js.map +1 -0
- package/lib/types/client.record.type.d.ts +11 -0
- package/lib/types/client.record.type.js +3 -0
- package/lib/types/client.record.type.js.map +1 -0
- package/lib/types/consent.model.type.d.ts +15 -0
- package/lib/types/consent.model.type.js +3 -0
- package/lib/types/consent.model.type.js.map +1 -0
- package/lib/types/consent.record.type.d.ts +5 -0
- package/lib/types/consent.record.type.js +3 -0
- package/lib/types/consent.record.type.js.map +1 -0
- package/lib/types/http.request.type.d.ts +9 -0
- package/lib/types/http.request.type.js +3 -0
- package/lib/types/http.request.type.js.map +1 -0
- package/lib/types/http.response.type.d.ts +6 -0
- package/lib/types/http.response.type.js +3 -0
- package/lib/types/http.response.type.js.map +1 -0
- package/lib/types/i.metadata.cache.d.ts +6 -0
- package/lib/types/i.metadata.cache.js +3 -0
- package/lib/types/i.metadata.cache.js.map +1 -0
- package/lib/types/i.storage.d.ts +25 -0
- package/lib/types/i.storage.js +3 -0
- package/lib/types/i.storage.js.map +1 -0
- package/lib/types/i.upstream.d.ts +11 -0
- package/lib/types/i.upstream.js +3 -0
- package/lib/types/i.upstream.js.map +1 -0
- package/lib/types/key.pair.type.d.ts +5 -0
- package/lib/types/key.pair.type.js +3 -0
- package/lib/types/key.pair.type.js.map +1 -0
- package/lib/types/logger.type.d.ts +6 -0
- package/lib/types/logger.type.js +3 -0
- package/lib/types/logger.type.js.map +1 -0
- package/lib/types/mcp.auth.context.type.d.ts +29 -0
- package/lib/types/mcp.auth.context.type.js +3 -0
- package/lib/types/mcp.auth.context.type.js.map +1 -0
- package/lib/types/mcp.auth.options.type.d.ts +39 -0
- package/lib/types/mcp.auth.options.type.js +3 -0
- package/lib/types/mcp.auth.options.type.js.map +1 -0
- package/lib/types/mcp.auth.type.d.ts +14 -0
- package/lib/types/mcp.auth.type.js +3 -0
- package/lib/types/mcp.auth.type.js.map +1 -0
- package/lib/types/metadata.resolution.type.d.ts +9 -0
- package/lib/types/metadata.resolution.type.js +3 -0
- package/lib/types/metadata.resolution.type.js.map +1 -0
- package/lib/types/mongo.storage.options.type.d.ts +13 -0
- package/lib/types/mongo.storage.options.type.js +3 -0
- package/lib/types/mongo.storage.options.type.js.map +1 -0
- package/lib/types/oidc.upstream.options.type.d.ts +9 -0
- package/lib/types/oidc.upstream.options.type.js +3 -0
- package/lib/types/oidc.upstream.options.type.js.map +1 -0
- package/lib/types/pending.authorization.type.d.ts +14 -0
- package/lib/types/pending.authorization.type.js +3 -0
- package/lib/types/pending.authorization.type.js.map +1 -0
- package/lib/types/pending.filter.type.d.ts +5 -0
- package/lib/types/pending.filter.type.js +3 -0
- package/lib/types/pending.filter.type.js.map +1 -0
- package/lib/types/redirect.policy.type.d.ts +5 -0
- package/lib/types/redirect.policy.type.js +3 -0
- package/lib/types/redirect.policy.type.js.map +1 -0
- package/lib/types/refresh.token.record.type.d.ts +11 -0
- package/lib/types/refresh.token.record.type.js +3 -0
- package/lib/types/refresh.token.record.type.js.map +1 -0
- package/lib/types/resolved.client.type.d.ts +7 -0
- package/lib/types/resolved.client.type.js +3 -0
- package/lib/types/resolved.client.type.js.map +1 -0
- package/lib/types/route.name.type.d.ts +2 -0
- package/lib/types/route.name.type.js +3 -0
- package/lib/types/route.name.type.js.map +1 -0
- package/lib/types/route.type.d.ts +10 -0
- package/lib/types/route.type.js +3 -0
- package/lib/types/route.type.js.map +1 -0
- package/lib/types/sql.dialect.type.d.ts +2 -0
- package/lib/types/sql.dialect.type.js +3 -0
- package/lib/types/sql.dialect.type.js.map +1 -0
- package/lib/types/sql.executor.type.d.ts +4 -0
- package/lib/types/sql.executor.type.js +3 -0
- package/lib/types/sql.executor.type.js.map +1 -0
- package/lib/types/sql.storage.options.type.d.ts +4 -0
- package/lib/types/sql.storage.options.type.js +3 -0
- package/lib/types/sql.storage.options.type.js.map +1 -0
- package/lib/types/upstream.begin.type.d.ts +9 -0
- package/lib/types/upstream.begin.type.js +3 -0
- package/lib/types/upstream.begin.type.js.map +1 -0
- package/lib/types/upstream.context.type.d.ts +10 -0
- package/lib/types/upstream.context.type.js +3 -0
- package/lib/types/upstream.context.type.js.map +1 -0
- package/lib/types/verify.result.type.d.ts +6 -0
- package/lib/types/verify.result.type.js +3 -0
- package/lib/types/verify.result.type.js.map +1 -0
- package/package.json +107 -5
- package/sql/postgres.sql +61 -0
- package/sql/sqlite.sql +61 -0
package/README.md
CHANGED
|
@@ -1,3 +1,208 @@
|
|
|
1
|
-
#
|
|
1
|
+
# mcp-auth-server
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
OAuth 2.1 authorization server for MCP servers. It sits next to your app's existing users and SSO: MCP clients (Cursor, Claude Code, Codex, VS Code, MCP Inspector) sign in through your own identity provider, and your `/mcp` endpoint accepts only tokens this package issued.
|
|
4
|
+
|
|
5
|
+
The core is runtime-agnostic. It uses only web-standard APIs (`fetch`, `URL`, `crypto.subtle`, `crypto.getRandomValues`, `TextEncoder`) and `jose`. It has no `node:*` imports, no `Buffer`, and reads nothing from `process.env`. Node-only helpers live in `mcp.auth.node`.
|
|
6
|
+
|
|
7
|
+
## Supported MCP authorization spec versions
|
|
8
|
+
|
|
9
|
+
| Spec | Status |
|
|
10
|
+
| --- | --- |
|
|
11
|
+
| 2026-07-28 | Supported: Client ID Metadata Documents (SHOULD), `iss` in authorization responses (RFC 9207), per-request authentication without sessions |
|
|
12
|
+
| 2025-06-18 | Supported for existing clients through Dynamic Client Registration (`/register`, on by default) |
|
|
13
|
+
|
|
14
|
+
Standards implemented: RFC 6750, RFC 7009, RFC 7591, RFC 8414, RFC 8707, RFC 9207, RFC 9728, OAuth Client ID Metadata Document draft-00, PKCE (S256 only).
|
|
15
|
+
|
|
16
|
+
## Install
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
pnpm add mcp-auth-server
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Frameworks and database drivers are optional peer dependencies. Install only the ones you use.
|
|
23
|
+
|
|
24
|
+
Entry points (deep imports from `lib`, like the other packages in this family):
|
|
25
|
+
|
|
26
|
+
| Import | Contents |
|
|
27
|
+
| --- | --- |
|
|
28
|
+
| `mcp-auth-server` | core: `createMcpAuth`, `oidcUpstream`, `appSessionUpstream`, types |
|
|
29
|
+
| `mcp-auth-server/lib/mcp.auth.fetch` | Fetch adapter (Bun, Deno, Workers, Hono, Next.js App Router, Remix, SvelteKit, Astro, Elysia, h3 v2) |
|
|
30
|
+
| `mcp-auth-server/lib/mcp.auth.node` | `node:http` adapter, Node SSRF guard |
|
|
31
|
+
| `mcp-auth-server/lib/mcp.auth.express` | Express middleware |
|
|
32
|
+
| `mcp-auth-server/lib/mcp.auth.fastify` | Fastify plugin |
|
|
33
|
+
| `mcp-auth-server/lib/mcp.auth.koa` | Koa middleware |
|
|
34
|
+
| `mcp-auth-server/lib/mcp.auth.memory` | in-memory storage |
|
|
35
|
+
| `mcp-auth-server/lib/mcp.auth.mongodb` | MongoDB storage |
|
|
36
|
+
| `mcp-auth-server/lib/mcp.auth.postgres` | Postgres storage (`pg`, `postgres.js`) |
|
|
37
|
+
| `mcp-auth-server/lib/mcp.auth.sqlite` | SQLite storage (`better-sqlite3`, `node:sqlite`, `bun:sqlite`, Cloudflare D1) |
|
|
38
|
+
| `mcp-auth-server/lib/mcp.auth.entra` | Entra ID preset |
|
|
39
|
+
|
|
40
|
+
## Quick start (Express)
|
|
41
|
+
|
|
42
|
+
```ts
|
|
43
|
+
import express from 'express';
|
|
44
|
+
import {createMcpAuth, oidcUpstream, signingKeyFromEnv} from 'mcp-auth-server';
|
|
45
|
+
import {expressMiddleware} from 'mcp-auth-server/lib/mcp.auth.express';
|
|
46
|
+
import {MemoryStorage} from 'mcp-auth-server/lib/mcp.auth.memory';
|
|
47
|
+
|
|
48
|
+
const auth = createMcpAuth({
|
|
49
|
+
issuer: 'https://mcp.example.com',
|
|
50
|
+
resource: 'https://mcp.example.com/mcp',
|
|
51
|
+
signingKey: signingKeyFromEnv(process.env, 'MCP_OAUTH_SIGNING_KEY'),
|
|
52
|
+
storage: new MemoryStorage(),
|
|
53
|
+
upstream: oidcUpstream({discoveryUrl: 'https://idp.example.com/.well-known/openid-configuration', clientId: '...', clientSecret: '...'}),
|
|
54
|
+
resolveUser: async (claims) => ({id: String(claims.sub), displayName: String(claims.name)}),
|
|
55
|
+
loadActiveUser: async (id) => findActiveUser(id)
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
const app = express();
|
|
59
|
+
app.use(expressMiddleware(auth));
|
|
60
|
+
app.post('/mcp', express.json(), async (req, res) => {
|
|
61
|
+
const result = await auth.authenticate(req.headers, req.body);
|
|
62
|
+
if (!('user' in result)) return res.status(result.status).set(result.headers).json(result.body);
|
|
63
|
+
res.json(await handleMcp(result.user, req.body));
|
|
64
|
+
});
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Generate a signing key:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
pnpm keygen
|
|
71
|
+
pnpm keygen --out mcp-signing-key.pem
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
`signingKey` accepts a `CryptoKey` or a PEM string (PKCS8 or PKCS1). `signingKeyFromEnv(env, name)` reads a PEM from an environment object and accepts literal `\n` newlines. Pass `verificationKey` when the signing `CryptoKey` is not extractable.
|
|
75
|
+
|
|
76
|
+
## Other frameworks
|
|
77
|
+
|
|
78
|
+
Fetch (Bun, Deno, Workers, Hono, Next.js App Router, Remix, SvelteKit, Astro, Elysia, h3 v2):
|
|
79
|
+
|
|
80
|
+
```ts
|
|
81
|
+
import {createFetchHandler} from 'mcp-auth-server/lib/mcp.auth.fetch';
|
|
82
|
+
|
|
83
|
+
const handle = createFetchHandler(auth);
|
|
84
|
+
export default {
|
|
85
|
+
fetch: async (request: Request) => (await handle(request)) ?? mcpResponse(request)
|
|
86
|
+
};
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
`createFetchHandler` returns `null` for paths it does not own, so your own routes keep working.
|
|
90
|
+
|
|
91
|
+
Fastify:
|
|
92
|
+
|
|
93
|
+
```ts
|
|
94
|
+
import {fastifyPlugin} from 'mcp-auth-server/lib/mcp.auth.fastify';
|
|
95
|
+
|
|
96
|
+
await app.register(fastifyPlugin(auth));
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
Koa:
|
|
100
|
+
|
|
101
|
+
```ts
|
|
102
|
+
import {koaMiddleware} from 'mcp-auth-server/lib/mcp.auth.koa';
|
|
103
|
+
|
|
104
|
+
app.use(koaMiddleware(auth));
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
`node:http`:
|
|
108
|
+
|
|
109
|
+
```ts
|
|
110
|
+
import {createNodeHandler} from 'mcp-auth-server/lib/mcp.auth.node';
|
|
111
|
+
|
|
112
|
+
const handle = createNodeHandler(auth);
|
|
113
|
+
createServer(async (req, res) => {
|
|
114
|
+
if (await handle(req, res)) return;
|
|
115
|
+
res.writeHead(404).end();
|
|
116
|
+
});
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
All adapters read both JSON and `application/x-www-form-urlencoded` bodies (`/token`, `/revoke` and the consent POST are form-encoded). Express and Koa reuse a body already parsed by `express.json()`, `express.urlencoded()` or `koa-bodyparser`.
|
|
120
|
+
|
|
121
|
+
Hosts that mount routes themselves can use `auth.routes`, `auth.handle(request)` and the individual handlers with the plain-object contract `{method, path, query, headers, body, ip}` to `{status, headers, body}`.
|
|
122
|
+
|
|
123
|
+
### Recipes
|
|
124
|
+
|
|
125
|
+
- **NestJS**: Nest runs on Express or Fastify. Call `app.getHttpAdapter().getInstance()` and use `app.use(expressMiddleware(auth))` or `await instance.register(fastifyPlugin(auth))` before `app.listen`. Put your `/mcp` controller behind a guard that calls `auth.authenticate(req.headers, req.body)`.
|
|
126
|
+
- **Hono**: `app.all('*', async (c, next) => (await handle(c.req.raw)) ?? next())` with `handle = createFetchHandler(auth)`.
|
|
127
|
+
- **Next.js**: App Router: export `GET` and `POST` from catch-all route handlers that call `createFetchHandler(auth)`; mount the well-known routes at the root (see below). Pages Router: use `createNodeHandler(auth)` from an API route with `export const config = {api: {bodyParser: false}}`.
|
|
128
|
+
|
|
129
|
+
## Mounting and well-known paths
|
|
130
|
+
|
|
131
|
+
`issuer` and `resource` come from options only, never from request headers. If the issuer has a path (`https://example.com/auth`), the RFC 8414 metadata lives at `/.well-known/oauth-authorization-server/auth`. Hosts must mount the `/.well-known/*` routes at the origin root. The dispatcher serves the root and path forms.
|
|
132
|
+
|
|
133
|
+
## Hooks
|
|
134
|
+
|
|
135
|
+
| Hook | Purpose |
|
|
136
|
+
| --- | --- |
|
|
137
|
+
| `resolveUser(claims)` | Called after upstream sign-in with the validated id token claims. Create or update your user and return `{id, displayName?}`. Defaults to `{id: sub, displayName: name}`. |
|
|
138
|
+
| `loadActiveUser(id)` | Called on every `/mcp` request. Return `null` and the request fails with 401 `user_inactive`. |
|
|
139
|
+
| `renderConsent(model)` | Return HTML for the consent page. A default page is provided. |
|
|
140
|
+
| `rateLimit(key, route)` | Optional. Return `false` to answer 429. Called for `register`, `token` and `revoke` with the client IP as key. |
|
|
141
|
+
| `logger` | Optional `{info, warn, error}`. |
|
|
142
|
+
|
|
143
|
+
## Upstream login
|
|
144
|
+
|
|
145
|
+
OIDC (any provider, PKCE S256, id token validated with JWKS):
|
|
146
|
+
|
|
147
|
+
```ts
|
|
148
|
+
oidcUpstream({discoveryUrl, clientId, clientSecret, scope: 'openid profile email'});
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
Entra ID preset:
|
|
152
|
+
|
|
153
|
+
```ts
|
|
154
|
+
import {entraUpstream} from 'mcp-auth-server/lib/mcp.auth.entra';
|
|
155
|
+
|
|
156
|
+
entraUpstream({tenantId, clientId, clientSecret});
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
Set `callbackPath` (default `/oauth/callback`) to match the redirect URI registered at the provider, for example `/oauth/azure-callback`.
|
|
160
|
+
|
|
161
|
+
App session, for apps that already have their own login:
|
|
162
|
+
|
|
163
|
+
```ts
|
|
164
|
+
appSessionUpstream({
|
|
165
|
+
getSignedInUser: async (request) => sessionUser(request.headers.cookie),
|
|
166
|
+
signInUrl: (returnTo) => `/login?returnTo=${encodeURIComponent(returnTo)}`
|
|
167
|
+
});
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
At `/authorize`, a signed-in user goes straight to consent or the code. Otherwise the browser is sent to `signInUrl(returnTo)` where `returnTo` is always `{issuer}/oauth/resume?state=<stateId>` built by the package. `/oauth/resume` rechecks `getSignedInUser`, stores the user id on the pending authorization and continues exactly like the OIDC callback. The consent page and POST then require the same signed-in session, so the app cookie should be `SameSite=Lax` or stricter. The random `state` bound to the pending authorization protects the consent step against CSRF.
|
|
171
|
+
|
|
172
|
+
## Client registration
|
|
173
|
+
|
|
174
|
+
- **Client ID Metadata Documents** (recommended, advertised as `client_id_metadata_document_supported`): an `https` client_id URL with a path is fetched and validated (JSON with `client_id` equal to the URL, `client_name`, `redirect_uris`). The authorization request's `redirect_uri` must be listed. Responses are cached respecting `Cache-Control` up to `cimd.maxCacheSeconds`. Fetches use no redirects, a 5 s timeout and a 5 KiB limit by default. Private, loopback and link-local hosts are rejected for IP literals and internal names. On Node add DNS resolution checking: `cimd: {guard: nodeSsrfGuard}`. Inject `cimd.fetch` or `cimd.guard` on other runtimes. Use `cimd.trust: {allowHosts, denyHosts}` for a host policy (`*.example.com` patterns allowed). The consent page shows the client_id host next to the self-declared name. `private_key_jwt` client authentication is not supported; `token_endpoint_auth_method` stays `none`.
|
|
175
|
+
- **Dynamic Client Registration** (deprecated by the spec, kept for 2025-06-18 clients): `POST /register`, public clients only, `application_type` is accepted and stored. Turn off with `registration: {enabled: false}`.
|
|
176
|
+
|
|
177
|
+
Redirect URIs: `http://localhost` and `http://127.0.0.1` on any port, hosts from `redirects.httpsHosts`, schemes from `redirects.customSchemes` (`cursor://`, `vscode://`). Fragments are never allowed. `/authorize` and `/token` require an exact match.
|
|
178
|
+
|
|
179
|
+
## Storage
|
|
180
|
+
|
|
181
|
+
All five record types (clients, pending authorizations, authorization codes, refresh tokens, consents) go through one interface with atomic operations: `claimAuthorizationCode`, `claimRefreshToken`, `revokeRefreshTokenFamily`, `takePendingAuthorization`, `attachUserToPendingAuthorization`, `upsertConsent`, `deleteExpired`.
|
|
182
|
+
|
|
183
|
+
- **Memory**: `new MemoryStorage()`.
|
|
184
|
+
- **MongoDB**: `const storage = new MongoStorage(db, options); await storage.ensureIndexes();`. Defaults use the collection names `mcp_oauth_clients`, `mcp_oauth_pending_authorizations`, `mcp_oauth_authorization_codes`, `mcp_oauth_refresh_tokens`, `mcp_oauth_consents`, all configurable. `userIdField`, `userIdToDb` and `userIdFromDb` map an existing user key (for example a numeric `employeeId`) without a data migration. TTL indexes remove expired documents.
|
|
185
|
+
- **Postgres and SQLite** share one SQL implementation that takes an executor `(sql, params) => rows` instead of a driver: `postgresStorage(fromPg(pool))`, `postgresStorage(fromPostgresJs(sql))`, `sqliteStorage(fromBetterSqlite3(db))`, `sqliteStorage(fromNodeSqlite(db))`, `sqliteStorage(fromBunSqlite(db))`, `sqliteStorage(fromD1(env.DB))`. Create tables with `await storage.migrate()` or run `sql/postgres.sql` / `sql/sqlite.sql`. SQLite needs 3.35 or newer (`RETURNING`). Call `auth.deleteExpired()` on a schedule (cron, Workers cron trigger).
|
|
186
|
+
|
|
187
|
+
## Rate limits to apply
|
|
188
|
+
|
|
189
|
+
Apply these in your host or through the `rateLimit` hook:
|
|
190
|
+
|
|
191
|
+
| Route | Limit |
|
|
192
|
+
| --- | --- |
|
|
193
|
+
| `POST /register` | 20 per minute per IP |
|
|
194
|
+
| `POST /token`, `POST /revoke` | 60 per minute per IP |
|
|
195
|
+
| everything else | 200 per minute per IP |
|
|
196
|
+
|
|
197
|
+
## Security notes
|
|
198
|
+
|
|
199
|
+
- Authorization codes: 32 random bytes, only the SHA-256 hash is stored, 60 s TTL, single use (atomic claim before validation); client, redirect URI, PKCE verifier and resource are checked.
|
|
200
|
+
- Access tokens: RS256 JWT with `iss`, `aud` = resource, `sub`, `client_id`, `jti`, 1 h. Refresh tokens are opaque, stored as hashes, single use, rotate within the same family and absolute expiry (30 d). Replaying a used or revoked refresh token revokes the whole family.
|
|
201
|
+
- Public clients only: `/token` and `/revoke` answer 401 `invalid_client` when a secret or an `Authorization` header is sent.
|
|
202
|
+
- Every redirect to the client carries `iss` (RFC 9207), including errors. Unknown clients and unregistered redirect URIs never redirect.
|
|
203
|
+
- No MCP sessions: `auth.authenticate(headers, body)` validates every request on its own and never caches users. Signing keys are cached. A disabled user fails on the next request.
|
|
204
|
+
- Consent page: `X-Frame-Options: DENY`, strict CSP, `Cache-Control: no-store`, all values escaped.
|
|
205
|
+
|
|
206
|
+
## Scripts
|
|
207
|
+
|
|
208
|
+
Same as the other packages in this family: `pnpm all`, `build`, `clean`, `format`, `test`, `quick`, `integration`, `docs`, and so on.
|
package/bin/keygen.mjs
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {generateKeyPairSync} from 'node:crypto';
|
|
3
|
+
import {writeFileSync} from 'node:fs';
|
|
4
|
+
|
|
5
|
+
const args = process.argv.slice(2);
|
|
6
|
+
const option = (name, fallback) => {
|
|
7
|
+
const index = args.indexOf(name);
|
|
8
|
+
return -1 === index ? fallback : args[index + 1];
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
if (args.includes('--help')) {
|
|
12
|
+
console.log('usage: mcp-auth-keygen [--bits 2048] [--env NAME] [--out file.pem]');
|
|
13
|
+
process.exit(0);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const {privateKey} = generateKeyPairSync('rsa', {modulusLength: Number(option('--bits', '2048'))});
|
|
17
|
+
const pem = privateKey.export({type: 'pkcs8', format: 'pem'}).trim();
|
|
18
|
+
const outFile = option('--out');
|
|
19
|
+
|
|
20
|
+
if (outFile) {
|
|
21
|
+
writeFileSync(outFile, `${pem}\n`, {mode: 0o600});
|
|
22
|
+
console.log(`private key written to ${outFile}`);
|
|
23
|
+
} else {
|
|
24
|
+
const envName = option('--env', 'MCP_OAUTH_SIGNING_KEY');
|
|
25
|
+
console.log(`${envName}=${pem.split('\n').join('\\n')}`);
|
|
26
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const to_node_http_request_1 = __importDefault(require("../node/to.node.http.request"));
|
|
7
|
+
const write_node_response_1 = __importDefault(require("../node/write.node.response"));
|
|
8
|
+
const expressMiddleware = (auth) => async (req, res, next) => {
|
|
9
|
+
const originalUrl = req.originalUrl ?? req.url;
|
|
10
|
+
const path = new URL(originalUrl, 'http://localhost').pathname;
|
|
11
|
+
if (!auth.hasRoute({ method: req.method, path, query: {}, headers: {} }))
|
|
12
|
+
return next();
|
|
13
|
+
try {
|
|
14
|
+
const preParsed = req.body && 'object' === typeof req.body && Object.keys(req.body).length > 0 ? req.body : undefined;
|
|
15
|
+
const parsed = await (0, to_node_http_request_1.default)(Object.assign(req, { url: originalUrl }), preParsed);
|
|
16
|
+
(0, write_node_response_1.default)(res, await auth.handle(parsed));
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
next(error);
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
exports.default = expressMiddleware;
|
|
23
|
+
//# sourceMappingURL=express.middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"express.middleware.js","sourceRoot":"","sources":["../../../src/adapters/express/express.middleware.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;;;;AAKb,wFAA6D;AAC7D,sFAA4D;AAE5D,MAAM,iBAAiB,GACtB,CAAC,IAAsB,EAAkB,EAAE,CAC3C,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAiB,EAAE;IACxE,MAAM,WAAW,GAAW,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,GAAG,CAAC;IACvD,MAAM,IAAI,GAAW,IAAI,GAAG,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC,QAAQ,CAAC;IACvE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAC,CAAC;QAAE,OAAO,IAAI,EAAE,CAAC;IACtF,IAAI,CAAC;QACJ,MAAM,SAAS,GAAY,GAAG,CAAC,IAAI,IAAI,QAAQ,KAAK,OAAO,GAAG,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/H,MAAM,MAAM,GAAG,MAAM,IAAA,8BAAiB,EAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,EAAC,GAAG,EAAE,WAAW,EAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QAC1F,IAAA,6BAAiB,EAAC,GAAG,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IAAI,CAAC,KAAK,CAAC,CAAC;IACb,CAAC;AACF,CAAC,CAAC;AACH,kBAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const parse_body_1 = __importDefault(require("../../functions/body/parse.body"));
|
|
7
|
+
const parse_query_1 = __importDefault(require("../../functions/body/parse.query"));
|
|
8
|
+
const fastifyPlugin = (auth) => async (fastify) => {
|
|
9
|
+
if (!fastify.hasContentTypeParser('application/x-www-form-urlencoded')) {
|
|
10
|
+
fastify.addContentTypeParser('application/x-www-form-urlencoded', { parseAs: 'string' }, (_request, body, done) => done(null, (0, parse_body_1.default)('application/x-www-form-urlencoded', body)));
|
|
11
|
+
}
|
|
12
|
+
auth.routes.forEach((route) => {
|
|
13
|
+
fastify.route({
|
|
14
|
+
method: route.method,
|
|
15
|
+
url: route.path,
|
|
16
|
+
handler: async (request, reply) => {
|
|
17
|
+
const response = await auth.handle({
|
|
18
|
+
method: request.method,
|
|
19
|
+
path: route.path,
|
|
20
|
+
query: (0, parse_query_1.default)(new URL(request.url, 'http://localhost').searchParams),
|
|
21
|
+
headers: request.headers,
|
|
22
|
+
body: request.body,
|
|
23
|
+
ip: request.ip
|
|
24
|
+
});
|
|
25
|
+
reply.headers(response.headers);
|
|
26
|
+
return reply.status(response.status).send(response.body);
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
};
|
|
31
|
+
exports.default = fastifyPlugin;
|
|
32
|
+
//# sourceMappingURL=fastify.plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fastify.plugin.js","sourceRoot":"","sources":["../../../src/adapters/fastify/fastify.plugin.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;;;;AAIb,iFAAwD;AACxD,mFAA0D;AAI1D,MAAM,aAAa,GAClB,CAAC,IAAsB,EAAE,EAAE,CAC3B,KAAK,EAAE,OAAwB,EAAiB,EAAE;IACjD,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,mCAAmC,CAAC,EAAE,CAAC;QACxE,OAAO,CAAC,oBAAoB,CAAC,mCAAmC,EAAE,EAAC,OAAO,EAAE,QAAQ,EAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAQ,EAAE,CACrH,IAAI,CAAC,IAAI,EAAE,IAAA,oBAAS,EAAC,mCAAmC,EAAE,IAAc,CAAC,CAAC,CAC1E,CAAC;IACH,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAgB,EAAQ,EAAE;QAC9C,OAAO,CAAC,KAAK,CAAC;YACb,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,GAAG,EAAE,KAAK,CAAC,IAAI;YACf,OAAO,EAAE,KAAK,EAAE,OAAuB,EAAE,KAAmB,EAAyB,EAAE;gBACtF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC;oBAClC,MAAM,EAAE,OAAO,CAAC,MAAM;oBACtB,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,KAAK,EAAE,IAAA,qBAAU,EAAC,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC,YAAY,CAAC;oBACxE,OAAO,EAAE,OAAO,CAAC,OAAO;oBACxB,IAAI,EAAE,OAAO,CAAC,IAAI;oBAClB,EAAE,EAAE,OAAO,CAAC,EAAE;iBACd,CAAC,CAAC;gBACH,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAChC,OAAO,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC1D,CAAC;SACD,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC;AACH,kBAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const to_http_request_1 = __importDefault(require("./to.http.request"));
|
|
7
|
+
const to_response_1 = __importDefault(require("./to.response"));
|
|
8
|
+
const createFetchHandler = (auth) => async (request) => {
|
|
9
|
+
const parsed = await (0, to_http_request_1.default)(request);
|
|
10
|
+
return auth.hasRoute(parsed) ? (0, to_response_1.default)(await auth.handle(parsed)) : null;
|
|
11
|
+
};
|
|
12
|
+
exports.default = createFetchHandler;
|
|
13
|
+
//# sourceMappingURL=create.fetch.handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.fetch.handler.js","sourceRoot":"","sources":["../../../src/adapters/fetch/create.fetch.handler.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;;;;AAGb,wEAA8C;AAC9C,gEAAuC;AAEvC,MAAM,kBAAkB,GACvB,CAAC,IAAsB,EAAE,EAAE,CAC3B,KAAK,EAAE,OAAgB,EAA4B,EAAE;IACpD,MAAM,MAAM,GAAG,MAAM,IAAA,yBAAa,EAAC,OAAO,CAAC,CAAC;IAC5C,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAA,qBAAU,EAAC,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7E,CAAC,CAAC;AACH,kBAAe,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const parse_body_1 = __importDefault(require("../../functions/body/parse.body"));
|
|
7
|
+
const parse_query_1 = __importDefault(require("../../functions/body/parse.query"));
|
|
8
|
+
const toHttpRequest = async (request) => {
|
|
9
|
+
const url = new URL(request.url);
|
|
10
|
+
const headers = Object.fromEntries(request.headers.entries());
|
|
11
|
+
const raw = 'GET' === request.method || 'HEAD' === request.method ? '' : await request.text();
|
|
12
|
+
return {
|
|
13
|
+
method: request.method,
|
|
14
|
+
path: url.pathname,
|
|
15
|
+
query: (0, parse_query_1.default)(url.searchParams),
|
|
16
|
+
headers,
|
|
17
|
+
body: (0, parse_body_1.default)(headers['content-type'], raw),
|
|
18
|
+
ip: headers['cf-connecting-ip'] ?? headers['x-real-ip'] ?? headers['x-forwarded-for']?.split(',')[0]?.trim()
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
exports.default = toHttpRequest;
|
|
22
|
+
//# sourceMappingURL=to.http.request.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"to.http.request.js","sourceRoot":"","sources":["../../../src/adapters/fetch/to.http.request.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;;;;AAEb,iFAAwD;AACxD,mFAA0D;AAG1D,MAAM,aAAa,GAAG,KAAK,EAAE,OAAgB,EAA4B,EAAE;IAC1E,MAAM,GAAG,GAAQ,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,OAAO,GAA2B,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACtF,MAAM,GAAG,GAAW,KAAK,KAAK,OAAO,CAAC,MAAM,IAAI,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;IACtG,OAAO;QACN,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,IAAI,EAAE,GAAG,CAAC,QAAQ;QAClB,KAAK,EAAE,IAAA,qBAAU,EAAC,GAAG,CAAC,YAAY,CAAC;QACnC,OAAO;QACP,IAAI,EAAE,IAAA,oBAAS,EAAC,OAAO,CAAC,cAAc,CAAC,EAAE,GAAG,CAAC;QAC7C,EAAE,EAAE,OAAO,CAAC,kBAAkB,CAAC,IAAI,OAAO,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,iBAAiB,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE;KAC5G,CAAC;AACH,CAAC,CAAC;AACF,kBAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const toResponse = (response) => {
|
|
4
|
+
const body = response.body;
|
|
5
|
+
if (undefined === body)
|
|
6
|
+
return new Response(null, { status: response.status, headers: response.headers });
|
|
7
|
+
return new Response('string' === typeof body ? body : JSON.stringify(body), { status: response.status, headers: response.headers });
|
|
8
|
+
};
|
|
9
|
+
exports.default = toResponse;
|
|
10
|
+
//# sourceMappingURL=to.response.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"to.response.js","sourceRoot":"","sources":["../../../src/adapters/fetch/to.response.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAIb,MAAM,UAAU,GAAG,CAAC,QAA0B,EAAY,EAAE;IAC3D,MAAM,IAAI,GAAY,QAAQ,CAAC,IAAI,CAAC;IACpC,IAAI,SAAS,KAAK,IAAI;QAAE,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAC,CAAC,CAAC;IACxG,OAAO,IAAI,QAAQ,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAC,CAAC,CAAC;AACnI,CAAC,CAAC;AACF,kBAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const to_node_http_request_1 = __importDefault(require("../node/to.node.http.request"));
|
|
7
|
+
const koaMiddleware = (auth) => async (ctx, next) => {
|
|
8
|
+
if (!auth.hasRoute({ method: ctx.method, path: ctx.path, query: {}, headers: {} }))
|
|
9
|
+
return next();
|
|
10
|
+
const body = ctx.request.body;
|
|
11
|
+
const preParsed = body && 'object' === typeof body && Object.keys(body).length > 0 ? body : undefined;
|
|
12
|
+
const parsed = await (0, to_node_http_request_1.default)(ctx.req, preParsed);
|
|
13
|
+
const response = await auth.handle({ ...parsed, path: ctx.path });
|
|
14
|
+
ctx.status = response.status;
|
|
15
|
+
ctx.set(response.headers);
|
|
16
|
+
ctx.body = response.body ?? '';
|
|
17
|
+
};
|
|
18
|
+
exports.default = koaMiddleware;
|
|
19
|
+
//# sourceMappingURL=koa.middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"koa.middleware.js","sourceRoot":"","sources":["../../../src/adapters/koa/koa.middleware.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;;;;AAKb,wFAA6D;AAE7D,MAAM,aAAa,GAClB,CAAC,IAAsB,EAAE,EAAE,CAC3B,KAAK,EAAE,GAAY,EAAE,IAAU,EAAiB,EAAE;IACjD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAC,CAAC;QAAE,OAAO,IAAI,EAAE,CAAC;IAChG,MAAM,IAAI,GAAa,GAAG,CAAC,OAA4B,CAAC,IAAI,CAAC;IAC7D,MAAM,SAAS,GAAY,IAAI,IAAI,QAAQ,KAAK,OAAO,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/G,MAAM,MAAM,GAAG,MAAM,IAAA,8BAAiB,EAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAC3D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,EAAC,GAAG,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAC,CAAC,CAAC;IAChE,GAAG,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;IAC7B,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC1B,GAAG,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC;AAChC,CAAC,CAAC;AACH,kBAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
2
|
+
import type McpAuthType from '../../types/mcp.auth.type';
|
|
3
|
+
declare const createNodeHandler: (auth: McpAuthType<any>) => (req: IncomingMessage, res: ServerResponse) => Promise<boolean>;
|
|
4
|
+
export default createNodeHandler;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const to_node_http_request_1 = __importDefault(require("./to.node.http.request"));
|
|
7
|
+
const write_node_response_1 = __importDefault(require("./write.node.response"));
|
|
8
|
+
const createNodeHandler = (auth) => async (req, res) => {
|
|
9
|
+
const url = new URL(req.url ?? '/', 'http://localhost');
|
|
10
|
+
if (!auth.hasRoute({ method: req.method ?? 'GET', path: url.pathname, query: {}, headers: {} }))
|
|
11
|
+
return false;
|
|
12
|
+
(0, write_node_response_1.default)(res, await auth.handle(await (0, to_node_http_request_1.default)(req)));
|
|
13
|
+
return true;
|
|
14
|
+
};
|
|
15
|
+
exports.default = createNodeHandler;
|
|
16
|
+
//# sourceMappingURL=create.node.handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.node.handler.js","sourceRoot":"","sources":["../../../src/adapters/node/create.node.handler.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;;;;AAKb,kFAAuD;AACvD,gFAAsD;AAEtD,MAAM,iBAAiB,GACtB,CAAC,IAAsB,EAAE,EAAE,CAC3B,KAAK,EAAE,GAAoB,EAAE,GAAmB,EAAoB,EAAE;IACrE,MAAM,GAAG,GAAQ,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,kBAAkB,CAAC,CAAC;IAC7D,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAC,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5G,IAAA,6BAAiB,EAAC,GAAG,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,IAAA,8BAAiB,EAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACxE,OAAO,IAAI,CAAC;AACb,CAAC,CAAC;AACH,kBAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const promises_1 = require("node:dns/promises");
|
|
7
|
+
const assert_public_host_1 = __importDefault(require("../../functions/cimd/assert.public.host"));
|
|
8
|
+
const nodeSsrfGuard = async (url) => {
|
|
9
|
+
const addresses = await (0, promises_1.lookup)(url.hostname.replace(/^\[|\]$/g, ''), { all: true });
|
|
10
|
+
for (const { address } of addresses) {
|
|
11
|
+
const host = address.includes(':') ? `[${address}]` : address;
|
|
12
|
+
(0, assert_public_host_1.default)(new URL(`https://${host}`));
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
exports.default = nodeSsrfGuard;
|
|
16
|
+
//# sourceMappingURL=node.ssrf.guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.ssrf.guard.js","sourceRoot":"","sources":["../../../src/adapters/node/node.ssrf.guard.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;;;;AAEb,gDAAyC;AAEzC,iGAAuE;AAEvE,MAAM,aAAa,GAAG,KAAK,EAAE,GAAQ,EAAiB,EAAE;IACvD,MAAM,SAAS,GAAG,MAAM,IAAA,iBAAM,EAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,EAAE,EAAC,GAAG,EAAE,IAAI,EAAC,CAAC,CAAC;IAClF,KAAK,MAAM,EAAC,OAAO,EAAC,IAAI,SAAS,EAAE,CAAC;QACnC,MAAM,IAAI,GAAW,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;QACtE,IAAA,4BAAgB,EAAC,IAAI,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,CAAC;IAC9C,CAAC;AACF,CAAC,CAAC;AACF,kBAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const parse_body_1 = __importDefault(require("../../functions/body/parse.body"));
|
|
7
|
+
const read_node_body_1 = __importDefault(require("./read.node.body"));
|
|
8
|
+
const parseNodeBody = async (req, preParsedBody) => {
|
|
9
|
+
if (undefined !== preParsedBody)
|
|
10
|
+
return preParsedBody;
|
|
11
|
+
if ('GET' === req.method || 'HEAD' === req.method)
|
|
12
|
+
return undefined;
|
|
13
|
+
return (0, parse_body_1.default)(req.headers['content-type'], await (0, read_node_body_1.default)(req));
|
|
14
|
+
};
|
|
15
|
+
exports.default = parseNodeBody;
|
|
16
|
+
//# sourceMappingURL=parse.node.body.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.node.body.js","sourceRoot":"","sources":["../../../src/adapters/node/parse.node.body.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;;;;AAIb,iFAAwD;AACxD,sEAA4C;AAE5C,MAAM,aAAa,GAAG,KAAK,EAAE,GAAoB,EAAE,aAAuB,EAAoB,EAAE;IAC/F,IAAI,SAAS,KAAK,aAAa;QAAE,OAAO,aAAa,CAAC;IACtD,IAAI,KAAK,KAAK,GAAG,CAAC,MAAM,IAAI,MAAM,KAAK,GAAG,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IACpE,OAAO,IAAA,oBAAS,EAAC,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,MAAM,IAAA,wBAAY,EAAC,GAAG,CAAC,CAAC,CAAC;AACxE,CAAC,CAAC;AACF,kBAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const readNodeBody = async (req) => {
|
|
4
|
+
const chunks = [];
|
|
5
|
+
for await (const chunk of req)
|
|
6
|
+
chunks.push(Buffer.from(chunk));
|
|
7
|
+
return Buffer.concat(chunks).toString('utf8');
|
|
8
|
+
};
|
|
9
|
+
exports.default = readNodeBody;
|
|
10
|
+
//# sourceMappingURL=read.node.body.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read.node.body.js","sourceRoot":"","sources":["../../../src/adapters/node/read.node.body.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAIb,MAAM,YAAY,GAAG,KAAK,EAAE,GAAoB,EAAmB,EAAE;IACpE,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG;QAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/D,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAC/C,CAAC,CAAC;AACF,kBAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const parse_query_1 = __importDefault(require("../../functions/body/parse.query"));
|
|
7
|
+
const parse_node_body_1 = __importDefault(require("./parse.node.body"));
|
|
8
|
+
const toNodeHttpRequest = async (req, preParsedBody) => {
|
|
9
|
+
const url = new URL(req.url ?? '/', 'http://localhost');
|
|
10
|
+
return {
|
|
11
|
+
method: req.method ?? 'GET',
|
|
12
|
+
path: url.pathname,
|
|
13
|
+
query: (0, parse_query_1.default)(url.searchParams),
|
|
14
|
+
headers: { ...req.headers },
|
|
15
|
+
body: await (0, parse_node_body_1.default)(req, preParsedBody),
|
|
16
|
+
ip: req.socket?.remoteAddress
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
exports.default = toNodeHttpRequest;
|
|
20
|
+
//# sourceMappingURL=to.node.http.request.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"to.node.http.request.js","sourceRoot":"","sources":["../../../src/adapters/node/to.node.http.request.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;;;;AAIb,mFAA0D;AAE1D,wEAA8C;AAE9C,MAAM,iBAAiB,GAAG,KAAK,EAAE,GAAoB,EAAE,aAAuB,EAA4B,EAAE;IAC3G,MAAM,GAAG,GAAQ,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,kBAAkB,CAAC,CAAC;IAC7D,OAAO;QACN,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,KAAK;QAC3B,IAAI,EAAE,GAAG,CAAC,QAAQ;QAClB,KAAK,EAAE,IAAA,qBAAU,EAAC,GAAG,CAAC,YAAY,CAAC;QACnC,OAAO,EAAE,EAAC,GAAG,GAAG,CAAC,OAAO,EAAC;QACzB,IAAI,EAAE,MAAM,IAAA,yBAAa,EAAC,GAAG,EAAE,aAAa,CAAC;QAC7C,EAAE,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa;KAC7B,CAAC;AACH,CAAC,CAAC;AACF,kBAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const writeNodeResponse = (res, response) => {
|
|
4
|
+
const body = response.body;
|
|
5
|
+
const payload = undefined === body || 'string' === typeof body ? body : JSON.stringify(body);
|
|
6
|
+
res.writeHead(response.status, response.headers);
|
|
7
|
+
res.end(payload);
|
|
8
|
+
};
|
|
9
|
+
exports.default = writeNodeResponse;
|
|
10
|
+
//# sourceMappingURL=write.node.response.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write.node.response.js","sourceRoot":"","sources":["../../../src/adapters/node/write.node.response.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAMb,MAAM,iBAAiB,GAAG,CAAC,GAAmB,EAAE,QAA0B,EAAQ,EAAE;IACnF,MAAM,IAAI,GAAY,QAAQ,CAAC,IAAI,CAAC;IACpC,MAAM,OAAO,GAAuB,SAAS,KAAK,IAAI,IAAI,QAAQ,KAAK,OAAO,IAAI,CAAC,CAAC,CAAE,IAA2B,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACzI,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IACjD,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAClB,CAAC,CAAC;AACF,kBAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type ClientMetadataType from '../types/client.metadata.type';
|
|
2
|
+
import type IMetadataCache from '../types/i.metadata.cache';
|
|
3
|
+
export default class LruMetadataCache implements IMetadataCache {
|
|
4
|
+
private readonly maxEntries;
|
|
5
|
+
private readonly now;
|
|
6
|
+
private entries;
|
|
7
|
+
constructor(maxEntries?: number, now?: () => number);
|
|
8
|
+
get(url: string): Promise<ClientMetadataType | undefined>;
|
|
9
|
+
set(url: string, value: ClientMetadataType, ttlSeconds: number): Promise<void>;
|
|
10
|
+
}
|