{"_id":"@mcp-abap-adt/auth-broker","_rev":"52-866ca7a46d3c39c1d69197aa4d36e6f4","name":"@mcp-abap-adt/auth-broker","dist-tags":{"latest":"4.0.0"},"versions":{"0.1.0":{"name":"@mcp-abap-adt/auth-broker","version":"0.1.0","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt"],"author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"license":"MIT","_id":"@mcp-abap-adt/auth-broker@0.1.0","maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker#readme","bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"dist":{"shasum":"1b2566073f58156cb9de7072e36adf6f005c4bdf","tarball":"https://registry.npmjs.org/@mcp-abap-adt/auth-broker/-/auth-broker-0.1.0.tgz","fileCount":50,"integrity":"sha512-tKbVTmKLP8FYqCIMGzP2K9+W7Z0lWrw82TiYdaaY2vCqJRAyv1iX8/afROl9s8pYMsekP2l2geIwmACXHU0gDQ==","signatures":[{"sig":"MEUCIDNxEKh9YBCxqgUiXuOvjYeJFrl+smtjttZRuQuPzqN3AiEAuz3+Q0Hnj/Kpj/qilEkAN2pyd4Fm9SnqiX6YqD3BFz0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":89937},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"cdc048de052e5280428926b6f02818ff663e9869","scripts":{"test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"npm run clean --silent && npx tsc -p tsconfig.json","clean":"rm -rf dist tsconfig.tsbuildinfo","build:fast":"npx tsc -p tsconfig.json","test:check":"npx tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"},"repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git"},"_npmVersion":"11.6.2","description":"JWT authentication broker for MCP ABAP ADT - manages tokens based on destination headers","directories":{},"_nodeVersion":"24.11.1","dependencies":{"open":"^11.0.0","axios":"^1.11.0","dotenv":"^17.2.1","express":"^5.1.0","@mcp-abap-adt/connection":"^0.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","ts-jest":"^29.2.5","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^24.2.1","@types/express":"^5.0.5"},"_npmOperationalInternal":{"tmp":"tmp/auth-broker_0.1.0_1764507800329_0.7569735871122103","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@mcp-abap-adt/auth-broker","version":"0.1.1","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt"],"author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"license":"MIT","_id":"@mcp-abap-adt/auth-broker@0.1.1","maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker#readme","bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"dist":{"shasum":"1d209e21e906aaa13941bbce5cae803800d2e86f","tarball":"https://registry.npmjs.org/@mcp-abap-adt/auth-broker/-/auth-broker-0.1.1.tgz","fileCount":50,"integrity":"sha512-B3oy9zkynDNFYBRzswgXavpY3GgTFbVsm7xlb8yT3K+YvlnSM729QHIeBfgYatGVOqzf49Kp9udZxJ37yGFILw==","signatures":[{"sig":"MEYCIQChDi2ALhqrTJWQO8aJg4OKxGDrDVOfIqLEYuEFdnjG0gIhALZMb+Otp2hLx96k8HHoEzLbnnlkPuecS5i/RYVThepF","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":91633},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"6f91e13479dd93bf50261bd622d2dfdc2cabfb61","scripts":{"test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"npm run clean --silent && npx tsc -p tsconfig.json","clean":"rm -rf dist tsconfig.tsbuildinfo","build:fast":"npx tsc -p tsconfig.json","test:check":"npx tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"},"repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git"},"_npmVersion":"11.6.2","description":"JWT authentication broker for MCP ABAP ADT - manages tokens based on destination headers","directories":{},"_nodeVersion":"24.11.1","dependencies":{"open":"^11.0.0","axios":"^1.11.0","dotenv":"^17.2.1","express":"^5.1.0","@mcp-abap-adt/connection":"^0.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","ts-jest":"^29.2.5","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^24.2.1","@types/express":"^5.0.5"},"_npmOperationalInternal":{"tmp":"tmp/auth-broker_0.1.1_1764512644097_0.6926679303455558","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@mcp-abap-adt/auth-broker","version":"0.1.2","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt"],"author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"license":"MIT","_id":"@mcp-abap-adt/auth-broker@0.1.2","maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker#readme","bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"dist":{"shasum":"8255b874666c03b2b6b5781936f4b1c0a5e5345a","tarball":"https://registry.npmjs.org/@mcp-abap-adt/auth-broker/-/auth-broker-0.1.2.tgz","fileCount":62,"integrity":"sha512-EwiOUc4CkmP4Li95degC0oACYKkD4HPfXOXy+LmsgYQbCLUptC+seUQyqgyTwQVqsRP4uJO6xWwjTYgJvsjoew==","signatures":[{"sig":"MEUCIFF6fN0V/uGUrg761NhDZOptNYj6gr+lfsVtKzIRN1TQAiEA18K9S9M+dUJhJxSRYub+HF7HBYlZFA5OK1YbYyQ6Rfs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":108499},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"4576a89d6b2396c114133b1144d190e0595ea7bc","scripts":{"test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"npm run clean --silent && npx tsc -p tsconfig.json","clean":"rm -rf dist tsconfig.tsbuildinfo","build:fast":"npx tsc -p tsconfig.json","test:check":"npx tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"},"repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git"},"_npmVersion":"11.6.2","description":"JWT authentication broker for MCP ABAP ADT - manages tokens based on destination headers","directories":{},"_nodeVersion":"24.11.1","dependencies":{"open":"^11.0.0","axios":"^1.11.0","dotenv":"^17.2.1","express":"^5.1.0","@mcp-abap-adt/connection":"^0.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","ts-jest":"^29.2.5","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^24.2.1","@types/express":"^5.0.5"},"_npmOperationalInternal":{"tmp":"tmp/auth-broker_0.1.2_1764514711943_0.9259792562722831","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@mcp-abap-adt/auth-broker","version":"0.1.3","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt"],"author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"license":"MIT","_id":"@mcp-abap-adt/auth-broker@0.1.3","maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker#readme","bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"dist":{"shasum":"31fc340a04932ea98c5149a03a54e756dc96cd40","tarball":"https://registry.npmjs.org/@mcp-abap-adt/auth-broker/-/auth-broker-0.1.3.tgz","fileCount":62,"integrity":"sha512-4b3GIqHAONlS4MP+neC4aLGBKzoJijGMBGU4hzwLrKqv5g7/ELIAf4pte6EfIrFgAbHDBSv44jpthvM5vnBFhw==","signatures":[{"sig":"MEUCIQDgVrI+Wxpu7/awEGfbDozU869zqX2O0nj5sVk1KMtoWQIgR0aN+bzYbZImlmdQs8B/dyfPo+1bLPkzEPNt4KK22AE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":112063},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"029c10415f7277e3aed4515f24fddf4910bf4608","scripts":{"test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"npm run clean --silent && npx tsc -p tsconfig.json","clean":"rm -rf dist tsconfig.tsbuildinfo","build:fast":"npx tsc -p tsconfig.json","test:check":"npx tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"},"repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git"},"_npmVersion":"11.6.2","description":"JWT authentication broker for MCP ABAP ADT - manages tokens based on destination headers","directories":{},"_nodeVersion":"24.11.1","dependencies":{"open":"^11.0.0","axios":"^1.11.0","dotenv":"^17.2.1","express":"^5.1.0","@mcp-abap-adt/connection":"^0.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","ts-jest":"^29.2.5","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^24.2.1","@types/express":"^5.0.5"},"_npmOperationalInternal":{"tmp":"tmp/auth-broker_0.1.3_1764582498634_0.769903439178381","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@mcp-abap-adt/auth-broker","version":"0.1.4","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt"],"author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"license":"MIT","_id":"@mcp-abap-adt/auth-broker@0.1.4","maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker#readme","bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"dist":{"shasum":"2ae7cb49cb806b9975687fcacf7027f82d8fb76a","tarball":"https://registry.npmjs.org/@mcp-abap-adt/auth-broker/-/auth-broker-0.1.4.tgz","fileCount":62,"integrity":"sha512-/hhN0m2t0vKRcFwc/r2seH0Zfc7wADjuTR63e1LIdd6DHioRc/DhpTmOWlrLDU0Chj/BUrIXkP701Wqc+FcoaA==","signatures":[{"sig":"MEQCID0Vyj5+9WRmn5cTH88x9G6caE+/miS84Lyzm35Yb+F8AiBZrTqlWfsdqyjjHrMOIX9jAFjpli0Ibaew0tyK5k7Djg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":113179},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"1c42c28686ae48ea24c879269a798c8548d83f29","scripts":{"test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"npm run clean --silent && npx tsc -p tsconfig.json","clean":"rm -rf dist tsconfig.tsbuildinfo","build:fast":"npx tsc -p tsconfig.json","test:check":"npx tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"},"repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git"},"_npmVersion":"11.6.2","description":"JWT authentication broker for MCP ABAP ADT - manages tokens based on destination headers","directories":{},"_nodeVersion":"24.11.1","dependencies":{"open":"^11.0.0","axios":"^1.11.0","dotenv":"^17.2.1","express":"^5.1.0","@mcp-abap-adt/connection":"^0.1.13"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","ts-jest":"^29.2.5","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^24.2.1","@types/express":"^5.0.5"},"_npmOperationalInternal":{"tmp":"tmp/auth-broker_0.1.4_1764612614076_0.635230381150975","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@mcp-abap-adt/auth-broker","version":"0.1.5","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt"],"author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"license":"MIT","_id":"@mcp-abap-adt/auth-broker@0.1.5","maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker#readme","bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"dist":{"shasum":"ad46d2d04ea8261cd7a7d87b4d54278042920e49","tarball":"https://registry.npmjs.org/@mcp-abap-adt/auth-broker/-/auth-broker-0.1.5.tgz","fileCount":65,"integrity":"sha512-KiB4VHyRKtWxx8VkMypbJ/RFtCfMsAzfUGQ4GvF7woW2VUGxNPSAXRbaz+EvvnTRY+CvM7Bn0YtLcmj7K4XGaw==","signatures":[{"sig":"MEYCIQDJgDgORcufFzeQcwAp1tEiCLmnhb2gX9xp1w+wRUGOfQIhAL90/EsHDfhk0JToN5QL/fJHXny4crmjipHsh5uveiBC","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":120132},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"9f0e860524c2077f9c257843f1d50a25f04436e5","scripts":{"test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"npm run clean --silent && npx tsc -p tsconfig.json","clean":"rm -rf dist tsconfig.tsbuildinfo","build:fast":"npx tsc -p tsconfig.json","test:check":"npx tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"},"repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git"},"_npmVersion":"11.6.2","description":"JWT authentication broker for MCP ABAP ADT - manages tokens based on destination headers","directories":{},"_nodeVersion":"24.11.1","dependencies":{"open":"^11.0.0","axios":"^1.11.0","dotenv":"^17.2.1","express":"^5.1.0","@mcp-abap-adt/connection":"^0.1.13"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","ts-jest":"^29.2.5","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^24.2.1","@types/express":"^5.0.5"},"_npmOperationalInternal":{"tmp":"tmp/auth-broker_0.1.5_1764659318767_0.7613056659720201","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@mcp-abap-adt/auth-broker","version":"0.1.6","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt"],"author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"license":"MIT","_id":"@mcp-abap-adt/auth-broker@0.1.6","maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker#readme","bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"bin":{"generate-env-from-service-key":"bin/generate-env-from-service-key.ts"},"dist":{"shasum":"0d2103475ca0bd9f0e4e8285397eb11558b20388","tarball":"https://registry.npmjs.org/@mcp-abap-adt/auth-broker/-/auth-broker-0.1.6.tgz","fileCount":30,"integrity":"sha512-mkxlO9cXPHIA7YlVZdb7wA/S8JYzvFHhyBLdpShc/EU0aX631EUrV+IMZ0Kfk+LA0vQz4XdCGAJcyMhEdDI5nw==","signatures":[{"sig":"MEUCIQCBv17OdTq6cMTEI0WOBkBNPTEHEMgRi+pfqGTp1PqzNQIgaNL+lDVJ3MoX5N+Ec/jixlC60d7kEuF4HtNCRLMkzZU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":79393},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"53f03dc65f562635ca808fa913c7e22a2662251a","scripts":{"test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"npm run clean --silent && npx tsc -p tsconfig.json","clean":"rm -rf dist tsconfig.tsbuildinfo","build:fast":"npx tsc -p tsconfig.json","test:check":"npx tsc --noEmit","generate-env":"tsx bin/generate-env-from-service-key.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"},"repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git"},"_npmVersion":"11.6.2","description":"JWT authentication broker for MCP ABAP ADT - manages tokens based on destination headers","directories":{},"_nodeVersion":"24.11.1","dependencies":{"@mcp-abap-adt/logger":"^0.1.0","@mcp-abap-adt/connection":"^0.1.13"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^30.2.0","js-yaml":"^4.1.1","ts-jest":"^29.2.5","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^24.2.1","@types/express":"^5.0.5","@types/js-yaml":"^4.0.9","@mcp-abap-adt/auth-providers":"^0.1.0","@mcp-abap-adt/auth-stores-btp":"^0.1.0","@mcp-abap-adt/auth-stores-xsuaa":"^0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/auth-broker_0.1.6_1764797971367_0.775889583296486","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@mcp-abap-adt/auth-broker","version":"0.1.7","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt"],"author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"license":"MIT","_id":"@mcp-abap-adt/auth-broker@0.1.7","maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker#readme","bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"bin":{"generate-env-from-service-key":"bin/generate-env-from-service-key.ts"},"dist":{"shasum":"b7a863dc9a440108a7df44b52d2d5442adc44953","tarball":"https://registry.npmjs.org/@mcp-abap-adt/auth-broker/-/auth-broker-0.1.7.tgz","fileCount":30,"integrity":"sha512-tXxJovMRtaZwxxuUs2HnEw8MGuJZRkJbDAw6xnjwDTUkMAmChwNHmqy/dGSZ4Mq7OJvjvS48OTsAj/bbajCH4w==","signatures":[{"sig":"MEUCIQDSKkjGKN7jyQSvuoKmfmxBqiDiGwKWzCjYGurKibqebwIgD7waZir6BhT5ReCWEioLraws8U025Sycdw+R30lCIPM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":88058},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"0693d287a50b5cbc0fb251efc04b287840323c0d","scripts":{"test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"npm run clean --silent && npx tsc -p tsconfig.json","clean":"rm -rf dist tsconfig.tsbuildinfo","build:fast":"npx tsc -p tsconfig.json","test:check":"npx tsc --noEmit","generate-env":"tsx bin/generate-env-from-service-key.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"},"repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git"},"_npmVersion":"11.6.2","description":"JWT authentication broker for MCP ABAP ADT - manages tokens based on destination headers","directories":{},"_nodeVersion":"24.11.1","dependencies":{"@mcp-abap-adt/logger":"^0.1.0","@mcp-abap-adt/connection":"^0.1.13"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^30.2.0","js-yaml":"^4.1.1","ts-jest":"^29.2.5","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^24.2.1","@types/express":"^5.0.5","@types/js-yaml":"^4.0.9","@mcp-abap-adt/auth-providers":"^0.1.0","@mcp-abap-adt/auth-stores-btp":"^0.1.0","@mcp-abap-adt/auth-stores-xsuaa":"^0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/auth-broker_0.1.7_1764832446395_0.030316621892864104","host":"s3://npm-registry-packages-npm-production"}},"0.1.8":{"name":"@mcp-abap-adt/auth-broker","version":"0.1.8","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt"],"author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"license":"MIT","_id":"@mcp-abap-adt/auth-broker@0.1.8","maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker#readme","bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"bin":{"generate-env-from-service-key":"bin/generate-env-from-service-key.ts"},"dist":{"shasum":"25850c4897c2d0e4c6191f02735a203c398957f8","tarball":"https://registry.npmjs.org/@mcp-abap-adt/auth-broker/-/auth-broker-0.1.8.tgz","fileCount":30,"integrity":"sha512-NPMe2pOzI0a9nwh5B+Nxude2YXOWGMHHiQb7IphtctGZ8L9c1Ai/jL4qw3JQ/AyeBy9MJAmcEFspBugV/8rXnQ==","signatures":[{"sig":"MEUCIDOo6TkwE2KN6RwMLldRp+Y7NcTyfYNl58IE7GuzVG/7AiEAgQfoP3XjJ57gsX2h3gzlOajZBy9+r8p3Z9+lR+t4bPw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":88824},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"b51cb7b491baa75b1cef2dfb249a4416a70ce813","scripts":{"test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"npm run clean --silent && npx tsc -p tsconfig.json","clean":"rm -rf dist tsconfig.tsbuildinfo","build:fast":"npx tsc -p tsconfig.json","test:check":"npx tsc --noEmit","generate-env":"tsx bin/generate-env-from-service-key.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"},"repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git"},"_npmVersion":"10.9.2","description":"JWT authentication broker for MCP ABAP ADT - manages tokens based on destination headers","directories":{},"_nodeVersion":"22.16.0","dependencies":{"@mcp-abap-adt/logger":"^0.1.0","@mcp-abap-adt/connection":"^0.1.14","@mcp-abap-adt/interfaces":"^0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^30.2.0","js-yaml":"^4.1.1","ts-jest":"^29.2.5","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^24.2.1","@types/express":"^5.0.5","@types/js-yaml":"^4.0.9","@mcp-abap-adt/auth-providers":"^0.1.0","@mcp-abap-adt/auth-stores-btp":"^0.1.0","@mcp-abap-adt/auth-stores-xsuaa":"^0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/auth-broker_0.1.8_1764845635896_0.41003663540387825","host":"s3://npm-registry-packages-npm-production"}},"0.1.9":{"name":"@mcp-abap-adt/auth-broker","version":"0.1.9","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt"],"author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"license":"MIT","_id":"@mcp-abap-adt/auth-broker@0.1.9","maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker#readme","bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"bin":{"generate-env-from-service-key":"bin/generate-env-from-service-key.ts"},"dist":{"shasum":"49cb59be45f9def7f8f5a78bf23f85f976c78a95","tarball":"https://registry.npmjs.org/@mcp-abap-adt/auth-broker/-/auth-broker-0.1.9.tgz","fileCount":30,"integrity":"sha512-GmziRA371DQb/Cp2cAijTUAB5e+WIPZfnhFmVM6TZfMCWv7hqExJ9yLgFRVrUBYLGmsq/+zEyYI7fgWdlZD7EQ==","signatures":[{"sig":"MEQCIEjwJ6lOEBPmT4vyW3nthhGutl/ay7OufYPe7t/kzc4NAiAEDMDrnuhJKD8SLmhn7OSevkIGNZMcTeaKL45DGiC9Bw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":86682},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"8599703d5ae023a84031adbd8bc44cf9baae9319","scripts":{"test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"npm run clean --silent && npx tsc -p tsconfig.json","clean":"rm -rf dist tsconfig.tsbuildinfo","build:fast":"npx tsc -p tsconfig.json","test:check":"npx tsc --noEmit","generate-env":"tsx bin/generate-env-from-service-key.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"},"repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git"},"_npmVersion":"11.6.2","description":"JWT authentication broker for MCP ABAP ADT - manages tokens based on destination headers","directories":{},"_nodeVersion":"24.11.1","dependencies":{"@mcp-abap-adt/interfaces":"^0.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^30.2.0","js-yaml":"^4.1.1","ts-jest":"^29.2.5","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^24.2.1","@types/express":"^5.0.5","@types/js-yaml":"^4.0.9","@mcp-abap-adt/auth-stores":"^0.1.4","@mcp-abap-adt/auth-providers":"^0.1.2"},"_npmOperationalInternal":{"tmp":"tmp/auth-broker_0.1.9_1764938372690_0.3423078638800854","host":"s3://npm-registry-packages-npm-production"}},"0.1.10":{"name":"@mcp-abap-adt/auth-broker","version":"0.1.10","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt"],"author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"license":"MIT","_id":"@mcp-abap-adt/auth-broker@0.1.10","maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker#readme","bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"bin":{"generate-env-from-service-key":"bin/generate-env-from-service-key.ts"},"dist":{"shasum":"fc8c8b05b1438c1d5dd9827bb85e88a95a7edcbf","tarball":"https://registry.npmjs.org/@mcp-abap-adt/auth-broker/-/auth-broker-0.1.10.tgz","fileCount":30,"integrity":"sha512-GRGbE3Ui1pKHHUQp6+f66zAOQYPkeYiOr8PDE+k2EAz1FjTmLPV92DFLuGZbMMoH1M3ZLZIMhtWroJ++Z2/Shw==","signatures":[{"sig":"MEYCIQD+hw2RqbGcEvm0E9ykymqwgwEwDiQbvM4f1e1+ErgumwIhAPaIdfGHTQhs9BdZBsxE2gf9+Z3qHpzJM29yjla64fE3","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":87732},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"959d6cdd2c577bdbf9a6f1e3d107efaad242e0aa","scripts":{"test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"npm run clean --silent && npx tsc -p tsconfig.json","clean":"rm -rf dist tsconfig.tsbuildinfo","build:fast":"npx tsc -p tsconfig.json","test:check":"npx tsc --noEmit","generate-env":"tsx bin/generate-env-from-service-key.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"},"repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git"},"_npmVersion":"10.9.2","description":"JWT authentication broker for MCP ABAP ADT - manages tokens based on destination headers","directories":{},"_nodeVersion":"22.16.0","dependencies":{"@mcp-abap-adt/interfaces":"^0.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^30.2.0","js-yaml":"^4.1.1","ts-jest":"^29.2.5","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^24.2.1","@types/express":"^5.0.5","@types/js-yaml":"^4.0.9","@mcp-abap-adt/auth-stores":"^0.1.4","@mcp-abap-adt/auth-providers":"^0.1.2"},"_npmOperationalInternal":{"tmp":"tmp/auth-broker_0.1.10_1765137149262_0.39332594248994024","host":"s3://npm-registry-packages-npm-production"}},"0.1.11":{"name":"@mcp-abap-adt/auth-broker","version":"0.1.11","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt"],"author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"license":"MIT","_id":"@mcp-abap-adt/auth-broker@0.1.11","maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker#readme","bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"bin":{"generate-env-from-service-key":"bin/generate-env-from-service-key.ts"},"dist":{"shasum":"fe8ef931da210fd65b47c2eeef961241235ccb10","tarball":"https://registry.npmjs.org/@mcp-abap-adt/auth-broker/-/auth-broker-0.1.11.tgz","fileCount":30,"integrity":"sha512-NAAR4+Ht90DScfa27+zKtu8Ajfdw9vRyQpTVQ8x+lF96hn4aSqwKUOMjZNWe1KVhLjkebxaT1fpZGZVUxLyzIA==","signatures":[{"sig":"MEUCICJqVfdduXBD3qKGcCn95hGYH3/hHjd+33IgsyGU8PfYAiEA/jwibQx/hy3BP0HylmMfrSePOksEUj0YCG6BNYx30yM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":88991},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"316627bd7ae2f9db7da4202acf5723a9029b8a2b","scripts":{"test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"npm run clean --silent && npx tsc -p tsconfig.json","clean":"rm -rf dist tsconfig.tsbuildinfo","build:fast":"npx tsc -p tsconfig.json","test:check":"npx tsc --noEmit","generate-env":"tsx bin/generate-env-from-service-key.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"},"repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git"},"_npmVersion":"10.9.2","description":"JWT authentication broker for MCP ABAP ADT - manages tokens based on destination headers","directories":{},"_nodeVersion":"22.16.0","dependencies":{"@mcp-abap-adt/interfaces":"^0.1.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^30.2.0","js-yaml":"^4.1.1","ts-jest":"^29.2.5","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^24.2.1","@types/express":"^5.0.5","@types/js-yaml":"^4.0.9","@mcp-abap-adt/auth-stores":"^0.1.5","@mcp-abap-adt/auth-providers":"^0.1.3"},"_npmOperationalInternal":{"tmp":"tmp/auth-broker_0.1.11_1765175170787_0.7442724395927602","host":"s3://npm-registry-packages-npm-production"}},"0.1.12":{"name":"@mcp-abap-adt/auth-broker","version":"0.1.12","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt"],"author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"license":"MIT","_id":"@mcp-abap-adt/auth-broker@0.1.12","maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker#readme","bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"bin":{"generate-env-from-service-key":"bin/generate-env-from-service-key.ts"},"dist":{"shasum":"19d3f341f44474f919c054c7367cb3bf64febd2a","tarball":"https://registry.npmjs.org/@mcp-abap-adt/auth-broker/-/auth-broker-0.1.12.tgz","fileCount":33,"integrity":"sha512-fE7oh+ObEIgIjGrHZG7U4D+z3sKkv1k/II+BaeIDA/lL12l+8pOQYJ4kDIXeMAXjLHtQ5gIa9TSpAU8Jl0YTtg==","signatures":[{"sig":"MEQCIBoSZA7ehwc9Ak9do3hdz/0fLOcnBBI9AOKcnHfZN4naAiA2YrwYqylEOFZTOFMae6ekirgNB5aShpG0GIRVnMVO3A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":103707},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"0df4af9902d806db828fd631a50b1654d333ea3f","scripts":{"test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"npm run clean --silent && npx tsc -p tsconfig.json","clean":"rm -rf dist tsconfig.tsbuildinfo","build:fast":"npx tsc -p tsconfig.json","test:check":"npx tsc --noEmit && npx tsc --noEmit -p tsconfig.test.json","generate-env":"tsx bin/generate-env-from-service-key.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"},"repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git"},"_npmVersion":"11.6.2","description":"JWT authentication broker for MCP ABAP ADT - manages tokens based on destination headers","directories":{},"_nodeVersion":"24.11.1","dependencies":{"@mcp-abap-adt/interfaces":"^0.1.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^30.2.0","js-yaml":"^4.1.1","ts-jest":"^29.2.5","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^24.2.1","@types/express":"^5.0.5","@types/js-yaml":"^4.0.9","@mcp-abap-adt/auth-stores":"^0.1.7","@mcp-abap-adt/auth-providers":"^0.1.3"},"_npmOperationalInternal":{"tmp":"tmp/auth-broker_0.1.12_1765230283242_0.6116224427560388","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@mcp-abap-adt/auth-broker","version":"0.2.1","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt"],"author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"license":"MIT","_id":"@mcp-abap-adt/auth-broker@0.2.1","maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker#readme","bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"bin":{"generate-env-from-service-key":"bin/generate-env-from-service-key.ts"},"dist":{"shasum":"e66bae430a8b945570fb04c2c69bb2952a2d0d27","tarball":"https://registry.npmjs.org/@mcp-abap-adt/auth-broker/-/auth-broker-0.2.1.tgz","fileCount":33,"integrity":"sha512-jAeeQLqHrMUXHCG5S9vX4NhGQ6tzMwKtuZminU9J3c5tBrf4/45DC0qhk1zE+PtepQeaByOKvC8A5HunM0R5Jw==","signatures":[{"sig":"MEYCIQCC4cHGGLTSXbSgoQ2zLRUc6T/93rP8YYQVSsGFxvw3aAIhAO/5FKcsoh2axlYc0IXHRElSq15d8efFoLrFv14hA5wc","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":130109},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"161817eee1b9163b2308c3637f5a51867f38f620","scripts":{"test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"npm run clean --silent && npx tsc -p tsconfig.json","clean":"rm -rf dist tsconfig.tsbuildinfo","build:fast":"npx tsc -p tsconfig.json","test:check":"npx tsc --noEmit && npx tsc --noEmit -p tsconfig.test.json","generate-env":"tsx bin/generate-env-from-service-key.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"},"repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git"},"_npmVersion":"11.6.2","description":"JWT authentication broker for MCP ABAP ADT - manages tokens based on destination headers","directories":{},"_nodeVersion":"24.11.1","dependencies":{"axios":"^1.13.2","@mcp-abap-adt/interfaces":"^0.1.15"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^30.2.0","js-yaml":"^4.1.1","ts-jest":"^29.2.5","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^24.2.1","@types/express":"^5.0.5","@types/js-yaml":"^4.0.9","@mcp-abap-adt/auth-stores":"^0.2.1","@mcp-abap-adt/auth-providers":"^0.1.4"},"_npmOperationalInternal":{"tmp":"tmp/auth-broker_0.2.1_1765567504621_0.7747632111036793","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@mcp-abap-adt/auth-broker","version":"0.2.2","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt"],"author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"license":"MIT","_id":"@mcp-abap-adt/auth-broker@0.2.2","maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker#readme","bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"bin":{"generate-env-from-service-key":"bin/generate-env-from-service-key.ts"},"dist":{"shasum":"2235255e35454abc5a8d9c99c09bfb04f42707c2","tarball":"https://registry.npmjs.org/@mcp-abap-adt/auth-broker/-/auth-broker-0.2.2.tgz","fileCount":33,"integrity":"sha512-3AcsG4vwuQ+DTytdjOHvbQ002+kXnL1PHffKVBg4nFYECPiloCjzglnFch6cx5nAI7m3gG4A0uVdwmdUZ//HYg==","signatures":[{"sig":"MEQCIDE/k1iMlWLHMcozv54qiKzsZE7vCJqSpcckSs3qBUH3AiB0RNzEPBdYerUwoF6mir5CyzXObt6KyhyvZRkHiwMvVQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":130245},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"scripts":{"test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"npm run clean --silent && npx tsc -p tsconfig.json","clean":"rm -rf dist tsconfig.tsbuildinfo","build:fast":"npx tsc -p tsconfig.json","test:check":"npx tsc --noEmit && npx tsc --noEmit -p tsconfig.test.json","generate-env":"tsx bin/generate-env-from-service-key.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"},"repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git"},"_npmVersion":"10.9.2","description":"JWT authentication broker for MCP ABAP ADT - manages tokens based on destination headers","directories":{},"_nodeVersion":"22.16.0","dependencies":{"axios":"^1.13.2","@mcp-abap-adt/interfaces":"^0.1.16"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^30.2.0","js-yaml":"^4.1.1","ts-jest":"^29.2.5","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^24.2.1","@types/express":"^5.0.5","@types/js-yaml":"^4.0.9","@mcp-abap-adt/auth-stores":"^0.2.1","@mcp-abap-adt/auth-providers":"^0.1.4"},"_npmOperationalInternal":{"tmp":"tmp/auth-broker_0.2.2_1765570577056_0.3555283492101369","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"@mcp-abap-adt/auth-broker","version":"0.2.3","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt"],"author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"license":"MIT","_id":"@mcp-abap-adt/auth-broker@0.2.3","maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker#readme","bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"bin":{"generate-env-from-service-key":"bin/generate-env-from-service-key.ts"},"dist":{"shasum":"d3d921317cafc36a295e7c1adebedf50469aa31b","tarball":"https://registry.npmjs.org/@mcp-abap-adt/auth-broker/-/auth-broker-0.2.3.tgz","fileCount":33,"integrity":"sha512-VR0kp97nc8tQgDBaAfYuBukPztFbwOGHYm+P6zsms8X2KB1iMq1pn9EcossUZby+Esufyy4ScOUiThignepUCg==","signatures":[{"sig":"MEUCIQD7XeF5FsWl9WwBTdYBIh2ru/4bCtjjNS6sEF4pks+i4QIgMVCX/n04iSdmqO5G98znGv30uqHfLxBBqx/O1TrHln8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":131534},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"177aa1dc36d7996ed26c36707f27d6c637da0cf2","scripts":{"test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"npm run clean --silent && npx tsc -p tsconfig.json","clean":"rm -rf dist tsconfig.tsbuildinfo","build:fast":"npx tsc -p tsconfig.json","test:check":"npx tsc --noEmit && npx tsc --noEmit -p tsconfig.test.json","generate-env":"tsx bin/generate-env-from-service-key.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"},"repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git"},"_npmVersion":"11.6.2","description":"JWT authentication broker for MCP ABAP ADT - manages tokens based on destination headers","directories":{},"_nodeVersion":"24.12.0","dependencies":{"axios":"^1.13.2","@mcp-abap-adt/interfaces":"^0.1.16"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^30.2.0","js-yaml":"^4.1.1","ts-jest":"^29.2.5","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^24.2.1","@types/express":"^5.0.5","@types/js-yaml":"^4.0.9","@mcp-abap-adt/auth-stores":"^0.2.1","@mcp-abap-adt/auth-providers":"^0.1.4"},"_npmOperationalInternal":{"tmp":"tmp/auth-broker_0.2.3_1766077796506_0.3057345628554493","host":"s3://npm-registry-packages-npm-production"}},"0.2.4":{"name":"@mcp-abap-adt/auth-broker","version":"0.2.4","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt"],"author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"license":"MIT","_id":"@mcp-abap-adt/auth-broker@0.2.4","maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker#readme","bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"bin":{"generate-env-from-service-key":"bin/generate-env-from-service-key.ts"},"dist":{"shasum":"749035aca8909d699048002ab4f4cf9327f3ad20","tarball":"https://registry.npmjs.org/@mcp-abap-adt/auth-broker/-/auth-broker-0.2.4.tgz","fileCount":33,"integrity":"sha512-9wc7oLXvvzNXo08jnrn4sW7RoV+5ItCd3ndvDsRNUF0e5O2GCBjiP3pQPaKGQGVelrLwDO35E03rGKW3miSY7A==","signatures":[{"sig":"MEYCIQCI5EtOA9ADVR2NZ3Cgpmwo/CDw9WBpHUiaVuACYEs+5AIhAKrDy/BvqlTT+dvxeQX3q25ZzV35koXaj0RcHZL4AjvP","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":134920},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"71b1801002221c490172fe9d407e8dd6b8aa549e","scripts":{"test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"npm run clean --silent && npx tsc -p tsconfig.json","clean":"rm -rf dist tsconfig.tsbuildinfo","build:fast":"npx tsc -p tsconfig.json","test:check":"npx tsc --noEmit && npx tsc --noEmit -p tsconfig.test.json","generate-env":"tsx bin/generate-env-from-service-key.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"},"repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git"},"_npmVersion":"11.6.2","description":"JWT authentication broker for MCP ABAP ADT - manages tokens based on destination headers","directories":{},"_nodeVersion":"24.12.0","dependencies":{"axios":"^1.13.2","@mcp-abap-adt/interfaces":"^0.2.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^30.2.0","js-yaml":"^4.1.1","ts-jest":"^29.2.5","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^24.2.1","@types/express":"^5.0.5","@types/js-yaml":"^4.0.9","@mcp-abap-adt/auth-stores":"^0.2.5","@mcp-abap-adt/auth-providers":"^0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/auth-broker_0.2.4_1766167740776_0.9445988934323497","host":"s3://npm-registry-packages-npm-production"}},"0.2.5":{"name":"@mcp-abap-adt/auth-broker","version":"0.2.5","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt"],"author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"license":"MIT","_id":"@mcp-abap-adt/auth-broker@0.2.5","maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker#readme","bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"bin":{"generate-env-from-service-key":"bin/generate-env-from-service-key.ts"},"dist":{"shasum":"444bf10ca1f8c7f7d92fd45b0caaf876bed2d4cd","tarball":"https://registry.npmjs.org/@mcp-abap-adt/auth-broker/-/auth-broker-0.2.5.tgz","fileCount":33,"integrity":"sha512-0LgrW0j4ArA4ew9VAIv/rFz09JWPhgvlLYwgG+R1Vh9Sj0LkzD/8DTIDzimbtdarJ4d5dZ3Sr4QS/206k3E3ug==","signatures":[{"sig":"MEUCIQCTSwXzAreMynrJXgCEFwkCOSGZgyGDf9GPL/LGrsqZcQIgUJFoYzbn4cn3mM2eIYKm4VKtoYFz9Holc7BhHzASzZA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":135955},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"ce56b0edfafd54b5dcea3e5d33bafdd61071c7e2","scripts":{"test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"npm run clean --silent && npx tsc -p tsconfig.json","clean":"rm -rf dist tsconfig.tsbuildinfo","build:fast":"npx tsc -p tsconfig.json","test:check":"npx tsc --noEmit && npx tsc --noEmit -p tsconfig.test.json","generate-env":"tsx bin/generate-env-from-service-key.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"},"repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git"},"_npmVersion":"11.6.2","description":"JWT authentication broker for MCP ABAP ADT - manages tokens based on destination headers","directories":{},"_nodeVersion":"24.12.0","dependencies":{"axios":"^1.13.2","@mcp-abap-adt/interfaces":"^0.2.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^30.2.0","js-yaml":"^4.1.1","ts-jest":"^29.2.5","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^24.2.1","@types/express":"^5.0.5","@types/js-yaml":"^4.0.9","@mcp-abap-adt/auth-stores":"^0.2.5","@mcp-abap-adt/auth-providers":"^0.2.1"},"_npmOperationalInternal":{"tmp":"tmp/auth-broker_0.2.5_1766245736418_0.15181317841751896","host":"s3://npm-registry-packages-npm-production"}},"0.2.6":{"name":"@mcp-abap-adt/auth-broker","version":"0.2.6","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt"],"author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"license":"MIT","_id":"@mcp-abap-adt/auth-broker@0.2.6","maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker#readme","bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"bin":{"generate-env-from-service-key":"bin/generate-env-from-service-key.ts"},"dist":{"shasum":"d27424c655bfb97b2a9ad2c05b9363d90cc1e050","tarball":"https://registry.npmjs.org/@mcp-abap-adt/auth-broker/-/auth-broker-0.2.6.tgz","fileCount":33,"integrity":"sha512-SElv2hE6ElcJXiERViliPCcAiV6Nv+GoZbzJ2VW2rFtJot3UEh4wPafEAe4WFMZg8nNlUowLnj3+oY+/35txuw==","signatures":[{"sig":"MEYCIQCpqIJsme/0kda5zLnNkmjBJPZmi0FY6yufs6/9EL8NLwIhAIDeMbRB0VsJ8j39wwPs4qN21RM4vuugtQv85cHiGp3W","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":138478},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"b63eb01aa59ea36da448f69444483bf0849f6719","scripts":{"test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"npm run clean --silent && npx tsc -p tsconfig.json","clean":"rm -rf dist tsconfig.tsbuildinfo","build:fast":"npx tsc -p tsconfig.json","test:check":"npx tsc --noEmit && npx tsc --noEmit -p tsconfig.test.json","generate-env":"tsx bin/generate-env-from-service-key.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"},"repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git"},"_npmVersion":"11.6.2","description":"JWT authentication broker for MCP ABAP ADT - manages tokens based on destination headers","directories":{},"_nodeVersion":"24.12.0","dependencies":{"axios":"^1.13.2","@mcp-abap-adt/interfaces":"^0.2.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^30.2.0","js-yaml":"^4.1.1","ts-jest":"^29.2.5","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^24.2.1","@types/express":"^5.0.5","@types/js-yaml":"^4.0.9","@mcp-abap-adt/auth-stores":"^0.2.5","@mcp-abap-adt/auth-providers":"^0.2.2"},"_npmOperationalInternal":{"tmp":"tmp/auth-broker_0.2.6_1766253224717_0.2603227872645171","host":"s3://npm-registry-packages-npm-production"}},"0.2.7":{"name":"@mcp-abap-adt/auth-broker","version":"0.2.7","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt"],"author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"license":"MIT","_id":"@mcp-abap-adt/auth-broker@0.2.7","maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker#readme","bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"bin":{"generate-env-from-service-key":"bin/generate-env-from-service-key.ts"},"dist":{"shasum":"fafac8372cd5527f987f17a5d9ff9b8cda6e9965","tarball":"https://registry.npmjs.org/@mcp-abap-adt/auth-broker/-/auth-broker-0.2.7.tgz","fileCount":33,"integrity":"sha512-q11rhrY4ovQjWgKQuJex6SmyCMk4S6qAgLCIVZ/OWFxZ8YSEKsdvnpOJJtgbYM6IldRIQyCeBfatuUw7QLPJ6A==","signatures":[{"sig":"MEQCIGco7A+lsC7JeeSbINQJDGZcHQWQoxEqtX2w+vAZl/K4AiBk4KUcatfMyOon36IciCj2pkM3jchCUQIghsWnjvJQ5Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":140051},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"c038f15208e8f9cb3e2ff40e96021bd8f6e4002a","scripts":{"test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"npm run clean --silent && npx tsc -p tsconfig.json","clean":"rm -rf dist tsconfig.tsbuildinfo","build:fast":"npx tsc -p tsconfig.json","test:check":"npx tsc --noEmit && npx tsc --noEmit -p tsconfig.test.json","generate-env":"tsx bin/generate-env-from-service-key.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"},"repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git"},"_npmVersion":"11.6.2","description":"JWT authentication broker for MCP ABAP ADT - manages tokens based on destination headers","directories":{},"_nodeVersion":"24.11.1","dependencies":{"axios":"^1.13.2","@mcp-abap-adt/interfaces":"^0.2.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^30.2.0","js-yaml":"^4.1.1","ts-jest":"^29.2.5","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^24.2.1","@types/express":"^5.0.5","@types/js-yaml":"^4.0.9","@mcp-abap-adt/auth-stores":"^0.2.5","@mcp-abap-adt/auth-providers":"^0.2.3"},"_npmOperationalInternal":{"tmp":"tmp/auth-broker_0.2.7_1766307182596_0.7282455943967412","host":"s3://npm-registry-packages-npm-production"}},"0.2.8":{"name":"@mcp-abap-adt/auth-broker","version":"0.2.8","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt"],"author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"license":"MIT","_id":"@mcp-abap-adt/auth-broker@0.2.8","maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker#readme","bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"bin":{"generate-env-from-service-key":"bin/generate-env-from-service-key.ts"},"dist":{"shasum":"32f0b8653b4c47e8418912d70a759b01422027d3","tarball":"https://registry.npmjs.org/@mcp-abap-adt/auth-broker/-/auth-broker-0.2.8.tgz","fileCount":33,"integrity":"sha512-WdNRx4PGbMLSZnSud2YLaq4KFHtr74yFkywJonolZwbsJG4GEVIN11sbvH9e0aI7gP7HLzXBNeaeR3ORRoUkFA==","signatures":[{"sig":"MEUCIBbQsSGbvkjT/WSybjYvCSLCTSaewY09oLmllf5VvNfkAiEAiQQF4F5XegwzToRZQLaqtri5Jhzbx03Tra4oFcSMh4I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":140311},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"54161a850566f298f42c70e1d539bc0e01d482e3","scripts":{"test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"npm run clean --silent && npx tsc -p tsconfig.json","clean":"rm -rf dist tsconfig.tsbuildinfo","build:fast":"npx tsc -p tsconfig.json","test:check":"npx tsc --noEmit && npx tsc --noEmit -p tsconfig.test.json","generate-env":"tsx bin/generate-env-from-service-key.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"},"repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git"},"_npmVersion":"11.6.2","description":"JWT authentication broker for MCP ABAP ADT - manages tokens based on destination headers","directories":{},"_nodeVersion":"24.11.1","dependencies":{"axios":"^1.13.2","@mcp-abap-adt/interfaces":"^0.2.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^30.2.0","js-yaml":"^4.1.1","ts-jest":"^29.2.5","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^24.2.1","@types/express":"^5.0.5","@types/js-yaml":"^4.0.9","@mcp-abap-adt/auth-stores":"^0.2.8","@mcp-abap-adt/auth-providers":"^0.2.3"},"_npmOperationalInternal":{"tmp":"tmp/auth-broker_0.2.8_1766320521203_0.20635319880403435","host":"s3://npm-registry-packages-npm-production"}},"0.2.9":{"name":"@mcp-abap-adt/auth-broker","version":"0.2.9","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt"],"author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"license":"MIT","_id":"@mcp-abap-adt/auth-broker@0.2.9","maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker#readme","bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"bin":{"generate-env-from-service-key":"bin/generate-env-from-service-key.ts"},"dist":{"shasum":"dcebfee8173811572148bfb783073ebbbdf7db43","tarball":"https://registry.npmjs.org/@mcp-abap-adt/auth-broker/-/auth-broker-0.2.9.tgz","fileCount":33,"integrity":"sha512-eI+llaTl5WlxCC7PKKC1xbIuQlHZqHOyQW80R1K4esRILQQMnsGiaJgi9oN8BJ6+EFt6I0IIrhnl9fTVpGRl1w==","signatures":[{"sig":"MEYCIQCpMZglqJP2Arm3FmRqKGsvC1QJOfboRgb+2slhQpCMRAIhAIQx+pEcbf24JV5oWJBk6tnimAM6RPe8kDshJap9t0nh","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":144724},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"a91be3cbd83c086e3e7a42ad2bceedb31ce0271a","scripts":{"test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"npm run clean --silent && npx tsc -p tsconfig.json","clean":"rm -rf dist tsconfig.tsbuildinfo","build:fast":"npx tsc -p tsconfig.json","test:check":"npx tsc --noEmit && npx tsc --noEmit -p tsconfig.test.json","generate-env":"tsx bin/generate-env-from-service-key.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"},"repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git"},"_npmVersion":"11.6.2","description":"JWT authentication broker for MCP ABAP ADT - manages tokens based on destination headers","directories":{},"_nodeVersion":"24.11.1","dependencies":{"axios":"^1.13.2","@mcp-abap-adt/interfaces":"^0.2.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^30.2.0","js-yaml":"^4.1.1","ts-jest":"^29.2.5","jest-util":"^30.2.0","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^24.2.1","@types/express":"^5.0.5","@types/js-yaml":"^4.0.9","@mcp-abap-adt/auth-stores":"^0.2.8","@mcp-abap-adt/auth-providers":"^0.2.4"},"_npmOperationalInternal":{"tmp":"tmp/auth-broker_0.2.9_1766331450646_0.5514083455318113","host":"s3://npm-registry-packages-npm-production"}},"0.2.10":{"name":"@mcp-abap-adt/auth-broker","version":"0.2.10","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt"],"author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"license":"MIT","_id":"@mcp-abap-adt/auth-broker@0.2.10","maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker#readme","bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"bin":{"generate-env-from-service-key":"bin/generate-env-from-service-key.ts"},"dist":{"shasum":"945a9c91c9982e288b54d6593fe49b4c6e12edce","tarball":"https://registry.npmjs.org/@mcp-abap-adt/auth-broker/-/auth-broker-0.2.10.tgz","fileCount":33,"integrity":"sha512-rIS2LbejsoJ/DZ6kc1W5aRTGfiJG8xJrz7mYBKfeazQ+PlS5WEcucp0XtR29D3wp3FcEiGhrE0huJGq/pTpO1A==","signatures":[{"sig":"MEYCIQDOE/FS1Iy9vdlwHty4UT7/MrSCVF9h9TOc+lrANwEC1wIhAO+bYgGhgRT0qHY9gteQYZfiQGlVU4I6PODRWUTapZnC","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":147345},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"a875476b5f23ade3235d1870c217087e4788b623","scripts":{"lint":"npx biome check --write src","test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"npm run --silent clean && npx biome check src --diagnostic-level=error && npx tsc -p tsconfig.json","clean":"rm -rf dist tsconfig.tsbuildinfo","chrono":"./tools/version-stats.sh","format":"npx biome format --write src","build:fast":"npx tsc -p tsconfig.json","lint:check":"npx biome check src","test:check":"npx tsc --noEmit && npx tsc --noEmit -p tsconfig.test.json","generate-env":"tsx bin/generate-env-from-service-key.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"},"repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git"},"_npmVersion":"11.6.2","description":"JWT authentication broker for MCP ABAP ADT - manages tokens based on destination headers","directories":{},"_nodeVersion":"24.11.1","dependencies":{"axios":"^1.13.2","@mcp-abap-adt/interfaces":"^0.2.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^30.2.0","js-yaml":"^4.1.1","ts-jest":"^29.2.5","jest-util":"^30.2.0","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^24.2.1","@biomejs/biome":"^2.3.10","@types/express":"^5.0.5","@types/js-yaml":"^4.0.9","@mcp-abap-adt/auth-stores":"^0.2.8","@mcp-abap-adt/auth-providers":"^0.2.4"},"_npmOperationalInternal":{"tmp":"tmp/auth-broker_0.2.10_1766411355538_0.7560194767563608","host":"s3://npm-registry-packages-npm-production"}},"0.2.11":{"name":"@mcp-abap-adt/auth-broker","version":"0.2.11","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt"],"author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"license":"MIT","_id":"@mcp-abap-adt/auth-broker@0.2.11","maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker#readme","bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"bin":{"mcp-auth":"bin/mcp-auth.js"},"dist":{"shasum":"79fca521cb2939a5003543ee48d42ed324793ff0","tarball":"https://registry.npmjs.org/@mcp-abap-adt/auth-broker/-/auth-broker-0.2.11.tgz","fileCount":35,"integrity":"sha512-I0FLcNMSrbR3QxZTfEZQxX+++YQe55KLgSlZw/aBvhCPqYsk3BrOYMcQgbEO8WMBvD3RlubZAjbxiNT77AQGfA==","signatures":[{"sig":"MEYCIQC7bOYfEcVKhGKiJBiwsKw3Ev/A3id6w8s6EzgFwGrKWQIhAMOPJa8dz3nA22tYvShwYSmLihTGXAHn/udldtR5rJuw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":172505},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"c7c94dfd74fd9c31be0c501a0ba380f301d310da","scripts":{"lint":"npx biome check --write src","test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"npm run --silent clean && npx biome check src --diagnostic-level=error && npx tsc -p tsconfig.json","clean":"rm -rf dist tsconfig.tsbuildinfo","chrono":"./tools/version-stats.sh","format":"npx biome format --write src","build:fast":"npx tsc -p tsconfig.json","lint:check":"npx biome check src","test:check":"npx tsc --noEmit && npx tsc --noEmit -p tsconfig.test.json","generate-env":"tsx bin/generate-env-from-service-key.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"},"repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git"},"_npmVersion":"11.6.2","description":"JWT authentication broker for MCP ABAP ADT - manages tokens based on destination headers","directories":{},"_nodeVersion":"24.11.1","dependencies":{"tsx":"^4.21.0","axios":"^1.13.2","@mcp-abap-adt/interfaces":"^0.2.9","@mcp-abap-adt/auth-stores":"^0.2.8","@mcp-abap-adt/auth-providers":"^0.2.6"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","js-yaml":"^4.1.1","ts-jest":"^29.2.5","jest-util":"^30.2.0","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^24.2.1","@biomejs/biome":"^2.3.10","@types/express":"^5.0.5","@types/js-yaml":"^4.0.9"},"_npmOperationalInternal":{"tmp":"tmp/auth-broker_0.2.11_1766516307749_0.26706412646433364","host":"s3://npm-registry-packages-npm-production"}},"0.2.12":{"name":"@mcp-abap-adt/auth-broker","version":"0.2.12","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt"],"author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"license":"MIT","_id":"@mcp-abap-adt/auth-broker@0.2.12","maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker#readme","bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"bin":{"mcp-auth":"bin/mcp-auth.js"},"dist":{"shasum":"4a6443a2f2c7b150518d885610f2eb3fd5b7fa04","tarball":"https://registry.npmjs.org/@mcp-abap-adt/auth-broker/-/auth-broker-0.2.12.tgz","fileCount":35,"integrity":"sha512-oxun0pfmOx0ilqWXmJTOhKp59UNfiYH3WtWKu2wdoJhPQgLuCYsgNhnGRU2SsxFG5BTycqhY6zxyWoheo2Z+oA==","signatures":[{"sig":"MEUCIQCw/9bXB/lxlxL/+UE4kERC5G86gKGbMfZwDqZQY74F5gIgFhIwNFf0+THxru5D+uWc+thW8NFokXEXgYgycJQU8jA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":160630},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"d42660799f2abf79c6539c0a2bf3ac210a07f7b8","scripts":{"lint":"npx biome check --write src","test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"npm run --silent clean && npx biome check src --diagnostic-level=error && npx tsc -p tsconfig.json","clean":"rm -rf dist tsconfig.tsbuildinfo","chrono":"./tools/version-stats.sh","format":"npx biome format --write src","build:fast":"npx tsc -p tsconfig.json","lint:check":"npx biome check src","test:check":"npx tsc --noEmit && npx tsc --noEmit -p tsconfig.test.json","generate-env":"tsx bin/generate-env-from-service-key.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"},"repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git"},"_npmVersion":"11.6.2","description":"JWT authentication broker for MCP ABAP ADT - manages tokens based on destination headers","directories":{},"_nodeVersion":"24.11.1","dependencies":{"tsx":"^4.21.0","axios":"^1.13.2","@mcp-abap-adt/interfaces":"^0.2.9","@mcp-abap-adt/auth-stores":"^0.2.8","@mcp-abap-adt/auth-providers":"^0.2.6"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","js-yaml":"^4.1.1","ts-jest":"^29.2.5","jest-util":"^30.2.0","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^24.2.1","@biomejs/biome":"^2.3.10","@types/express":"^5.0.5","@types/js-yaml":"^4.0.9"},"_npmOperationalInternal":{"tmp":"tmp/auth-broker_0.2.12_1766609860264_0.17122415568921445","host":"s3://npm-registry-packages-npm-production"}},"0.2.13":{"name":"@mcp-abap-adt/auth-broker","version":"0.2.13","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt"],"author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"license":"MIT","_id":"@mcp-abap-adt/auth-broker@0.2.13","maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker#readme","bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"bin":{"mcp-auth":"bin/mcp-auth.js"},"dist":{"shasum":"d526cf0c120cdf125abca413d1c36b207e700f6c","tarball":"https://registry.npmjs.org/@mcp-abap-adt/auth-broker/-/auth-broker-0.2.13.tgz","fileCount":35,"integrity":"sha512-pmOLpf0Yb6oBqZ99Dhsg+HGcnDsh7Cso6sPv0FY+gLc4W5mVXk/ILKIKcXeAOt8sVgkOtQ0wQmYNp0f1TnXwig==","signatures":[{"sig":"MEQCIAOfmYSdInFDeBh+Q6Y1q6Tgh5mnY3BHyL7qk7wKKKJkAiA7Jufi9U7mBDuPWNgLnTEwevqiIl5TSYWCTHHOpKKJxA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":161367},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"8137276d77d9b09d5dcb29d9fa7b47b81b236126","scripts":{"lint":"npx biome check --write src","test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"npm run --silent clean && npx biome check src --diagnostic-level=error && npx tsc -p tsconfig.json","clean":"rm -rf dist tsconfig.tsbuildinfo","chrono":"./tools/version-stats.sh","format":"npx biome format --write src","build:fast":"npx tsc -p tsconfig.json","lint:check":"npx biome check src","test:check":"npx tsc --noEmit && npx tsc --noEmit -p tsconfig.test.json","generate-env":"tsx bin/generate-env-from-service-key.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"},"repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git"},"_npmVersion":"11.6.2","description":"JWT authentication broker for MCP ABAP ADT - manages tokens based on destination headers","directories":{},"_nodeVersion":"24.11.1","dependencies":{"tsx":"^4.21.0","axios":"^1.13.2","@mcp-abap-adt/interfaces":"^0.2.14","@mcp-abap-adt/auth-stores":"^0.2.9","@mcp-abap-adt/auth-providers":"^0.2.8"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","js-yaml":"^4.1.1","ts-jest":"^29.2.5","jest-util":"^30.2.0","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^24.2.1","@biomejs/biome":"^2.3.10","@types/express":"^5.0.5","@types/js-yaml":"^4.0.9"},"_npmOperationalInternal":{"tmp":"tmp/auth-broker_0.2.13_1766642356439_0.531089150322253","host":"s3://npm-registry-packages-npm-production"}},"0.2.14":{"name":"@mcp-abap-adt/auth-broker","version":"0.2.14","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt"],"author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"license":"MIT","_id":"@mcp-abap-adt/auth-broker@0.2.14","maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker#readme","bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"bin":{"mcp-auth":"bin/mcp-auth.js"},"dist":{"shasum":"d63ddf490eb1d5ba45d5d8a5486d830eac21ef69","tarball":"https://registry.npmjs.org/@mcp-abap-adt/auth-broker/-/auth-broker-0.2.14.tgz","fileCount":38,"integrity":"sha512-Xv8YxXxTnvFc8GcSprH+qTatkDr01xTrBdzLfOaOcVXflNmn9d8cfe80CZM7+6F0MjfC8a/ZXwbx4s0jBHch6A==","signatures":[{"sig":"MEUCIQDQnER3f+g/jAh0m9U2QM5D+3RDsx/g61jeidTy7csYLAIgST18jOvZf02gYfOJp3vkRosX7enJxi1FgRvDzF6f7JI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":169443},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"b03ace4216e348191fab5ac96ef9ccd1cbb5b7e6","scripts":{"lint":"npx biome check --write src","test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"npm run --silent clean && npx biome check src --diagnostic-level=error && npx tsc -p tsconfig.json","clean":"rm -rf dist tsconfig.tsbuildinfo","chrono":"./tools/version-stats.sh","format":"npx biome format --write src","build:fast":"npx tsc -p tsconfig.json","lint:check":"npx biome check src","test:check":"npx tsc --noEmit && npx tsc --noEmit -p tsconfig.test.json","generate-env":"tsx bin/generate-env-from-service-key.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"},"repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git"},"_npmVersion":"11.6.2","description":"JWT authentication broker for MCP ABAP ADT - manages tokens based on destination headers","directories":{},"_nodeVersion":"24.11.1","dependencies":{"tsx":"^4.21.0","axios":"^1.13.2","@mcp-abap-adt/interfaces":"^0.2.14","@mcp-abap-adt/auth-stores":"^0.2.10","@mcp-abap-adt/auth-providers":"^0.2.10"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","pino":"^10.1.0","js-yaml":"^4.1.1","ts-jest":"^29.2.5","jest-util":"^30.2.0","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^24.2.1","pino-pretty":"^13.1.3","@biomejs/biome":"^2.3.10","@types/express":"^5.0.5","@types/js-yaml":"^4.0.9","@mcp-abap-adt/logger":"^0.1.4"},"_npmOperationalInternal":{"tmp":"tmp/auth-broker_0.2.14_1766652324900_0.8517995922057948","host":"s3://npm-registry-packages-npm-production"}},"0.2.15":{"name":"@mcp-abap-adt/auth-broker","version":"0.2.15","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt"],"author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"license":"MIT","_id":"@mcp-abap-adt/auth-broker@0.2.15","maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker#readme","bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"bin":{"mcp-auth":"bin/mcp-auth.js"},"dist":{"shasum":"fb5c5ea9d305607486190ec09cd557386086f618","tarball":"https://registry.npmjs.org/@mcp-abap-adt/auth-broker/-/auth-broker-0.2.15.tgz","fileCount":38,"integrity":"sha512-XQ5AsNo5pRwLEv9DnZ5SC/kmNsBuDVTxSzjcPHd1iTirEbGSOXJ33uZ2CNLcd+dg1WlMMwbQWfsDsnbDSw6mIA==","signatures":[{"sig":"MEYCIQDSTH+NG6hF4BYWZWyuqFj4YZDJnjt9EorhB0isTVCCGAIhAIgrCV/0oc004STrPHZiRpWjFOo0sD79dORbXonusDH8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":169540},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"b0f2af6ec85bc14b08a606e0e2816b17f5ef0495","scripts":{"lint":"npx biome check --write src","test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"npm run --silent clean && npx biome check src --diagnostic-level=error && npx tsc -p tsconfig.json","clean":"rm -rf dist tsconfig.tsbuildinfo","chrono":"./tools/version-stats.sh","format":"npx biome format --write src","build:fast":"npx tsc -p tsconfig.json","lint:check":"npx biome check src","test:check":"npx tsc --noEmit && npx tsc --noEmit -p tsconfig.test.json","generate-env":"tsx bin/generate-env-from-service-key.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"},"repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git"},"_npmVersion":"11.6.2","description":"JWT authentication broker for MCP ABAP ADT - manages tokens based on destination headers","directories":{},"_nodeVersion":"24.11.1","dependencies":{"tsx":"^4.21.0","axios":"^1.13.2","@mcp-abap-adt/interfaces":"^0.2.14","@mcp-abap-adt/auth-stores":"^0.2.10","@mcp-abap-adt/auth-providers":"^0.2.10"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","pino":"^10.1.0","js-yaml":"^4.1.1","ts-jest":"^29.2.5","jest-util":"^30.2.0","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^24.2.1","pino-pretty":"^13.1.3","@biomejs/biome":"^2.3.10","@types/express":"^5.0.5","@types/js-yaml":"^4.0.9","@mcp-abap-adt/logger":"^0.1.4"},"_npmOperationalInternal":{"tmp":"tmp/auth-broker_0.2.15_1767107594992_0.44007343143135924","host":"s3://npm-registry-packages-npm-production"}},"0.2.16":{"name":"@mcp-abap-adt/auth-broker","version":"0.2.16","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt"],"author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"license":"MIT","_id":"@mcp-abap-adt/auth-broker@0.2.16","maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker#readme","bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"bin":{"mcp-auth":"bin/mcp-auth.js"},"dist":{"shasum":"76969c84510134817fde98d08416bf057dadd5e2","tarball":"https://registry.npmjs.org/@mcp-abap-adt/auth-broker/-/auth-broker-0.2.16.tgz","fileCount":38,"integrity":"sha512-N558faYUMAfsGLfkvSkx3V+dudtDLPLZNIXkVnHHXn501ouYKJKcuo/qZRnXWeSHunSRjji4/gi5m2mQ4P/hew==","signatures":[{"sig":"MEUCIQCWe3/ouD9jhbxa1qt3p/gsuJi+4HJzy9PniIpE06bCPwIgVknYS8Jofw+/jga04lYgTHQV4plKea/udyykTbzR5CE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":171204},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"9984bae1b338e28be103afb73b7e91117a8eb806","scripts":{"lint":"npx biome check --write src","test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"npm run --silent clean && npx biome check src --diagnostic-level=error && npx tsc -p tsconfig.json","clean":"rm -rf dist tsconfig.tsbuildinfo","chrono":"./tools/version-stats.sh","format":"npx biome format --write src","build:fast":"npx tsc -p tsconfig.json","lint:check":"npx biome check src","test:check":"npx tsc --noEmit && npx tsc --noEmit -p tsconfig.test.json","generate-env":"tsx bin/generate-env-from-service-key.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"},"repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git"},"_npmVersion":"11.6.2","description":"JWT authentication broker for MCP ABAP ADT - manages tokens based on destination headers","directories":{},"_nodeVersion":"24.11.1","dependencies":{"tsx":"^4.21.0","axios":"^1.13.2","@mcp-abap-adt/interfaces":"^0.2.14","@mcp-abap-adt/auth-broker":"file:mcp-abap-adt-auth-broker-0.2.15.tgz","@mcp-abap-adt/auth-stores":"^0.2.10","@mcp-abap-adt/auth-providers":"^0.2.10"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","pino":"^10.1.0","js-yaml":"^4.1.1","ts-jest":"^29.2.5","jest-util":"^30.2.0","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^24.2.1","pino-pretty":"^13.1.3","@biomejs/biome":"^2.3.10","@types/express":"^5.0.5","@types/js-yaml":"^4.0.9","@mcp-abap-adt/logger":"^0.1.4"},"_npmOperationalInternal":{"tmp":"tmp/auth-broker_0.2.16_1767129219407_0.31482531186705764","host":"s3://npm-registry-packages-npm-production"}},"0.2.17":{"name":"@mcp-abap-adt/auth-broker","version":"0.2.17","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt"],"author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"license":"MIT","_id":"@mcp-abap-adt/auth-broker@0.2.17","maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker#readme","bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"bin":{"mcp-auth":"bin/mcp-auth.js"},"dist":{"shasum":"c4080bd22784b15fab300cf9ca82a4a12df7d8ee","tarball":"https://registry.npmjs.org/@mcp-abap-adt/auth-broker/-/auth-broker-0.2.17.tgz","fileCount":38,"integrity":"sha512-ljkDVWLjuMCyc1Shz9Qysp0vROnuA4FwMcg8bEHMkDVoUT5Utzq25XQzsKiF6cnMqEE9Jrq06VOS69mGmWgXgw==","signatures":[{"sig":"MEUCIQDe9/rJsOsLXUCyurubbBsDrudovFkI3/mehdSNAXkCOAIgXOWIrzcNd1cW7rp/vW/yBbdDJM8sCRPZad4sI84KwoE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":171431},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"b063ce08c3bbeb96585ad7be0e9ec2277f7ed872","scripts":{"lint":"npx biome check --write src","test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"npm run --silent clean && npx biome check src --diagnostic-level=error && npx tsc -p tsconfig.json","clean":"rm -rf dist tsconfig.tsbuildinfo","chrono":"./tools/version-stats.sh","format":"npx biome format --write src","build:fast":"npx tsc -p tsconfig.json","lint:check":"npx biome check src","test:check":"npx tsc --noEmit && npx tsc --noEmit -p tsconfig.test.json","generate-env":"tsx bin/generate-env-from-service-key.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"},"repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git"},"_npmVersion":"11.6.2","description":"JWT authentication broker for MCP ABAP ADT - manages tokens based on destination headers","directories":{},"_nodeVersion":"24.11.1","dependencies":{"tsx":"^4.21.0","axios":"^1.13.2","@mcp-abap-adt/interfaces":"^0.2.15","@mcp-abap-adt/auth-stores":"^0.2.10","@mcp-abap-adt/auth-providers":"^0.2.10"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","pino":"^10.1.0","js-yaml":"^4.1.1","ts-jest":"^29.2.5","jest-util":"^30.2.0","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^24.2.1","pino-pretty":"^13.1.3","@biomejs/biome":"^2.3.10","@types/express":"^5.0.5","@types/js-yaml":"^4.0.9","@mcp-abap-adt/logger":"^0.1.4"},"_npmOperationalInternal":{"tmp":"tmp/auth-broker_0.2.17_1767130574690_0.3671607469735114","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@mcp-abap-adt/auth-broker","version":"0.3.0","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt"],"author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"license":"MIT","_id":"@mcp-abap-adt/auth-broker@0.3.0","maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker#readme","bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"bin":{"mcp-auth":"bin/mcp-auth.js"},"dist":{"shasum":"1e6761ca58d1202e245845ce4c95ee6fa745b15a","tarball":"https://registry.npmjs.org/@mcp-abap-adt/auth-broker/-/auth-broker-0.3.0.tgz","fileCount":38,"integrity":"sha512-yC7c2QRhCxNchJutptm+ZepqLzTGJse5HLZrgf4BO6+arSRkbaMxN0yvyTv38QNxe9S3jDsijY5m4wk2Y5mPlw==","signatures":[{"sig":"MEUCIEtQUY34kJpCCw1LWy/3fU6/XW3kgfl03KGZYGqOR5cAAiEApiTE9v+kOZ4UbicSwvPtLRYW8ygH4aF5kLGU9JBaaWo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":176160},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"edbcc7a738e5d9749358ea1e565a3b4ca6a92b8e","scripts":{"lint":"npx biome check --write src","test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"npm run --silent clean && npx biome check src --diagnostic-level=error && npx tsc -p tsconfig.json","clean":"rm -rf dist tsconfig.tsbuildinfo","chrono":"./tools/version-stats.sh","format":"npx biome format --write src","build:fast":"npx tsc -p tsconfig.json","lint:check":"npx biome check src","test:check":"npx tsc --noEmit && npx tsc --noEmit -p tsconfig.test.json","generate-env":"tsx bin/generate-env-from-service-key.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"},"repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git"},"_npmVersion":"11.6.2","description":"JWT authentication broker for MCP ABAP ADT - manages tokens based on destination headers","directories":{},"_nodeVersion":"24.11.1","dependencies":{"tsx":"^4.21.0","axios":"^1.13.2","@mcp-abap-adt/interfaces":"^0.2.15","@mcp-abap-adt/auth-stores":"^0.3.0","@mcp-abap-adt/auth-providers":"^0.2.10"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","pino":"^10.1.0","js-yaml":"^4.1.1","ts-jest":"^29.2.5","jest-util":"^30.2.0","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^24.2.1","pino-pretty":"^13.1.3","@biomejs/biome":"^2.3.10","@types/express":"^5.0.5","@types/js-yaml":"^4.0.9","@mcp-abap-adt/logger":"^0.1.4"},"_npmOperationalInternal":{"tmp":"tmp/auth-broker_0.3.0_1767194304520_0.9423938669783001","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@mcp-abap-adt/auth-broker","version":"0.3.2","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt"],"author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"license":"MIT","_id":"@mcp-abap-adt/auth-broker@0.3.2","maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker#readme","bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"bin":{"mcp-auth":"bin/mcp-auth.js"},"dist":{"shasum":"10d1d45da69b84488ff90dac88d3e35de5d49968","tarball":"https://registry.npmjs.org/@mcp-abap-adt/auth-broker/-/auth-broker-0.3.2.tgz","fileCount":38,"integrity":"sha512-ON/JHokUrZ/PbMFKuvaoBW9vz3hCjyWcw8TBlX8LoLPtdptppjMn4SbFjQkw9uAKYEu71eSp44+s2PiAsk5yQQ==","signatures":[{"sig":"MEYCIQCRCbMtnySGJm8owo09GCqNNhEJj84/93JpU5SxBVqfEwIhAJ1oO1hi3Iqdehg/+B4R+auz56m7HdK2spYBfy2oNHHU","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":176560},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"e72cb9eeef1206b530141c4564edf0ee3df1c1c8","scripts":{"lint":"biome check --write src","test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"npm run --silent clean && biome check src --diagnostic-level=error && tsc -p tsconfig.json","clean":"rm -rf dist tsconfig.tsbuildinfo","chrono":"./tools/version-stats.sh","format":"biome format --write src","build:fast":"tsc -p tsconfig.json","lint:check":"biome check src","test:check":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","generate-env":"tsx bin/generate-env-from-service-key.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"},"repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git"},"_npmVersion":"11.6.2","description":"JWT authentication broker for MCP ABAP ADT - manages tokens based on destination headers","directories":{},"_nodeVersion":"24.11.1","dependencies":{"tsx":"^4.21.0","axios":"^1.13.2","@mcp-abap-adt/interfaces":"^0.2.15","@mcp-abap-adt/auth-stores":"^0.3.0","@mcp-abap-adt/auth-providers":"^0.2.10"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","pino":"^10.1.0","js-yaml":"^4.1.1","ts-jest":"^29.2.5","jest-util":"^30.2.0","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^24.2.1","pino-pretty":"^13.1.3","@biomejs/biome":"^2.3.10","@types/express":"^5.0.5","@types/js-yaml":"^4.0.9","@mcp-abap-adt/logger":"^0.1.4"},"_npmOperationalInternal":{"tmp":"tmp/auth-broker_0.3.2_1769581012519_0.5586867611144013","host":"s3://npm-registry-packages-npm-production"}},"0.3.4":{"name":"@mcp-abap-adt/auth-broker","version":"0.3.4","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt"],"author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"license":"MIT","_id":"@mcp-abap-adt/auth-broker@0.3.4","maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker#readme","bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"bin":{"mcp-auth":"bin/mcp-auth.js"},"dist":{"shasum":"3ad0b4b485032ca0d2d025dceb8863f0b01c37db","tarball":"https://registry.npmjs.org/@mcp-abap-adt/auth-broker/-/auth-broker-0.3.4.tgz","fileCount":38,"integrity":"sha512-2pUerLmqPH3iuc/SVdSCnlIJlD9VdvMzKdkJ1OouWhLsbE+aB3ZJn/JkfqwlnIkgJet2OgrFqEFUWUjIicu4lw==","signatures":[{"sig":"MEQCIG7EhxOyfoU2rWwvDAQ+K3kesYk7P71b4eN5MsKePEmuAiBSl5qqyiyfT5/Vp9HrC+AJXaKasxydAHh9pRDmyglJQw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":177352},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"54e7ca545278262d6b54ab9a2b92446d74a5bace","scripts":{"lint":"biome check --write src","test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"npm run --silent clean && biome check src --diagnostic-level=error && tsc -p tsconfig.json","clean":"rm -rf dist tsconfig.tsbuildinfo","chrono":"./tools/version-stats.sh","format":"biome format --write src","build:fast":"tsc -p tsconfig.json","lint:check":"biome check src","test:check":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","generate-env":"tsx bin/generate-env-from-service-key.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"},"repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git"},"_npmVersion":"11.6.2","description":"JWT authentication broker for MCP ABAP ADT - manages tokens based on destination headers","directories":{},"_nodeVersion":"24.11.1","dependencies":{"tsx":"^4.21.0","axios":"^1.13.2","@mcp-abap-adt/interfaces":"^0.2.15","@mcp-abap-adt/auth-stores":"^0.3.0","@mcp-abap-adt/auth-providers":"^0.2.10"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","pino":"^10.1.0","js-yaml":"^4.1.1","ts-jest":"^29.2.5","jest-util":"^30.2.0","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^24.2.1","pino-pretty":"^13.1.3","@biomejs/biome":"^2.3.10","@types/express":"^5.0.5","@types/js-yaml":"^4.0.9","@mcp-abap-adt/logger":"^0.1.4"},"_npmOperationalInternal":{"tmp":"tmp/auth-broker_0.3.4_1769582007379_0.5368396954043728","host":"s3://npm-registry-packages-npm-production"}},"0.3.6":{"name":"@mcp-abap-adt/auth-broker","version":"0.3.6","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt"],"author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"license":"MIT","_id":"@mcp-abap-adt/auth-broker@0.3.6","maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker#readme","bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"bin":{"mcp-auth":"dist/bin/mcp-auth.js"},"dist":{"shasum":"d1d8420cc64647e51d2b9f2288f5d53508a6d890","tarball":"https://registry.npmjs.org/@mcp-abap-adt/auth-broker/-/auth-broker-0.3.6.tgz","fileCount":36,"integrity":"sha512-bPoAcDVjmYq2QzRZ1l/oicS7P+4DClz4GKiWc7gw7/LvRv7Itv+jAGZAK30b6q4diHHE5L0cANew6ZlNkncUIw==","signatures":[{"sig":"MEQCID53MUJhM76/tAsmDri6ST/8nIfujqchpV//XMr7AJQRAiAn7ZPoUWJY6QOvwbs9psW3dQ6zubaROuFWWM4vxwuJSQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":174242},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"6edf413f2af34e2ef0ece6d5f73e64cb826184d1","scripts":{"lint":"biome check --write src","test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"npm run --silent clean && biome check src --diagnostic-level=error && tsc -p tsconfig.json && tsc -p tsconfig.cli.json","clean":"rm -rf dist tsconfig.tsbuildinfo","chrono":"./tools/version-stats.sh","format":"biome format --write src","prepack":"npm run build","build:fast":"tsc -p tsconfig.json && tsc -p tsconfig.cli.json","lint:check":"biome check src","test:check":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","generate-env":"tsx bin/generate-env-from-service-key.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"},"repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git"},"_npmVersion":"11.6.2","description":"JWT authentication broker for MCP ABAP ADT - manages tokens based on destination headers","directories":{},"_nodeVersion":"24.11.1","dependencies":{"tsx":"^4.21.0","axios":"^1.13.4","@mcp-abap-adt/interfaces":"^0.2.15","@mcp-abap-adt/auth-stores":"^0.3.0","@mcp-abap-adt/auth-providers":"^0.2.10"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","pino":"^10.1.0","js-yaml":"^4.1.1","ts-jest":"^29.2.5","jest-util":"^30.2.0","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^24.2.1","pino-pretty":"^13.1.3","@biomejs/biome":"^2.3.13","@types/express":"^5.0.5","@types/js-yaml":"^4.0.9","@mcp-abap-adt/logger":"^0.1.4"},"_npmOperationalInternal":{"tmp":"tmp/auth-broker_0.3.6_1769585269415_0.24964410647696544","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@mcp-abap-adt/auth-broker","version":"1.0.0","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt"],"author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"license":"MIT","_id":"@mcp-abap-adt/auth-broker@1.0.0","maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker#readme","bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"bin":{"mcp-auth":"dist/bin/mcp-auth.js"},"dist":{"shasum":"d289ccfdaa8075c1e698b286899cef65f5ca7b84","tarball":"https://registry.npmjs.org/@mcp-abap-adt/auth-broker/-/auth-broker-1.0.0.tgz","fileCount":39,"integrity":"sha512-RDrNGZumFtfZPUrTr3ylXkqbHSU0nbdQFfUneqsqrUCTWOKhr3j9/rUgE5JESaOpjb/fEYf6rMoLRYJYrXMIpQ==","signatures":[{"sig":"MEUCIQDfQyLcKd3ODKI3/0idXrHr6nOY52NxnDZdcp+XpkjVWwIgdzxxjoS7iX2br0y7UoYtiXIE6zUvRLVvXEvYjICJtfA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":177555},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"87649a525ece471f4663cb63982cb154d3a77085","scripts":{"lint":"biome check --write src","test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"npm run --silent clean && biome check src --diagnostic-level=error && tsc -p tsconfig.json && tsc -p tsconfig.cli.json","clean":"rm -rf dist tsconfig.tsbuildinfo","chrono":"./tools/version-stats.sh","format":"biome format --write src","prepack":"npm run build","build:fast":"tsc -p tsconfig.json && tsc -p tsconfig.cli.json","lint:check":"biome check src","test:check":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","generate-env":"tsx bin/generate-env-from-service-key.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"},"repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git"},"_npmVersion":"11.6.2","description":"JWT authentication broker for MCP ABAP ADT - manages tokens based on destination headers","directories":{},"_nodeVersion":"24.11.1","dependencies":{"tsx":"^4.21.0","axios":"^1.13.4","@mcp-abap-adt/interfaces":"^2.3.0","@mcp-abap-adt/auth-stores":"^1.0.0","@mcp-abap-adt/auth-providers":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","pino":"^10.1.0","js-yaml":"^4.1.1","ts-jest":"^29.2.5","jest-util":"^30.2.0","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^24.2.1","pino-pretty":"^13.1.3","@biomejs/biome":"^2.3.13","@types/express":"^5.0.5","@types/js-yaml":"^4.0.9","@mcp-abap-adt/logger":"^0.1.4"},"_npmOperationalInternal":{"tmp":"tmp/auth-broker_1.0.0_1770755525581_0.05733498101121293","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@mcp-abap-adt/auth-broker","version":"1.0.1","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt"],"author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"license":"MIT","_id":"@mcp-abap-adt/auth-broker@1.0.1","maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker#readme","bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"bin":{"mcp-auth":"dist/bin/mcp-auth.js"},"dist":{"shasum":"97ff9997ad1add5eea0c7959cb6097ee907e7fc5","tarball":"https://registry.npmjs.org/@mcp-abap-adt/auth-broker/-/auth-broker-1.0.1.tgz","fileCount":39,"integrity":"sha512-b2BviOGbnzCTWiuYU9vbAo9hU/LvShq8xFWBs1Tuo2hJz1bMEvmPcW2Cgh5rUq4tnQwQkCjfupZ84aBC8wQy8w==","signatures":[{"sig":"MEQCIHpUlsQvI4yBHXeWr6ebDqYYszqSnIaBu/SPrEAJ6/TUAiB8SokDhedHEUBSakHApb/JshcV47U2nJeBXcUm3BE2Wg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":177660},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"5622549280bafb32fdba9acca55a3f1ceaf898d2","scripts":{"lint":"biome check --write src","test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"npm run --silent clean && biome check src --diagnostic-level=error && tsc -p tsconfig.json && tsc -p tsconfig.cli.json","clean":"rm -rf dist tsconfig.tsbuildinfo","chrono":"./tools/version-stats.sh","format":"biome format --write src","prepack":"npm run build","build:fast":"tsc -p tsconfig.json && tsc -p tsconfig.cli.json","lint:check":"biome check src","test:check":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","generate-env":"tsx bin/generate-env-from-service-key.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"},"repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git"},"_npmVersion":"11.6.2","description":"JWT authentication broker for MCP ABAP ADT - manages tokens based on destination headers","directories":{},"_nodeVersion":"24.11.1","dependencies":{"tsx":"^4.21.0","axios":"^1.13.4","@mcp-abap-adt/interfaces":"^2.3.0","@mcp-abap-adt/auth-stores":"^1.0.0","@mcp-abap-adt/auth-providers":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","pino":"^10.1.0","js-yaml":"^4.1.1","ts-jest":"^29.2.5","jest-util":"^30.2.0","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^24.2.1","pino-pretty":"^13.1.3","@biomejs/biome":"^2.3.13","@types/express":"^5.0.5","@types/js-yaml":"^4.0.9","@mcp-abap-adt/logger":"^0.1.4"},"_npmOperationalInternal":{"tmp":"tmp/auth-broker_1.0.1_1770755870762_0.3414973807213584","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@mcp-abap-adt/auth-broker","version":"1.0.3","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt"],"author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"license":"MIT","_id":"@mcp-abap-adt/auth-broker@1.0.3","maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker#readme","bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"bin":{"mcp-sso":"dist/bin/mcp-sso.js","mcp-auth":"dist/bin/mcp-auth.js"},"dist":{"shasum":"7ea67437a869a0fbc4515e8fce491e465a517fde","tarball":"https://registry.npmjs.org/@mcp-abap-adt/auth-broker/-/auth-broker-1.0.3.tgz","fileCount":40,"integrity":"sha512-qVtmDrD7g/JHbJ1niEc9cTfaJX1WjF23MxU/4GgMnpoBFMPLzmenSAki5oL4daath/0tR76BePQwbtcrOaQg6Q==","signatures":[{"sig":"MEUCIQCIT8w0xqiAjWWZ/We0rbv5QRPnjAGMs3uxU2oVZkVf1QIgBtB5M3ndol2FgvvfFCZG/Da2CqSbNgtTeXYDg6vDi9s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":209831},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"2b2e939e8f4903bda7bbcd205a31c8784b3fa545","scripts":{"lint":"biome check --write src","test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"npm run --silent clean && biome check src --diagnostic-level=error && tsc -p tsconfig.json && tsc -p tsconfig.cli.json","clean":"rm -rf dist tsconfig.tsbuildinfo","chrono":"./tools/version-stats.sh","format":"biome format --write src","prepack":"npm run build","build:fast":"tsc -p tsconfig.json && tsc -p tsconfig.cli.json","lint:check":"biome check src","test:check":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","generate-env":"tsx bin/generate-env-from-service-key.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"},"repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git"},"_npmVersion":"11.6.2","description":"JWT authentication broker for MCP ABAP ADT - manages tokens based on destination headers","directories":{},"_nodeVersion":"24.11.1","dependencies":{"tsx":"^4.21.0","axios":"^1.13.5","@mcp-abap-adt/interfaces":"^2.3.0","@mcp-abap-adt/auth-stores":"^1.0.1","@mcp-abap-adt/auth-providers":"^1.0.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","pino":"^10.1.0","js-yaml":"^4.1.1","ts-jest":"^29.2.5","jest-util":"^30.2.0","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^25.2.3","pino-pretty":"^13.1.3","@biomejs/biome":"^2.3.14","@types/express":"^5.0.5","@types/js-yaml":"^4.0.9","@mcp-abap-adt/logger":"^0.1.4"},"_npmOperationalInternal":{"tmp":"tmp/auth-broker_1.0.3_1770818483488_0.004193517338548558","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@mcp-abap-adt/auth-broker","version":"1.0.5","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt"],"author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"license":"MIT","_id":"@mcp-abap-adt/auth-broker@1.0.5","maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker#readme","bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"bin":{"mcp-sso":"dist/bin/mcp-sso.js","mcp-auth":"dist/bin/mcp-auth.js"},"dist":{"shasum":"3fff769bb1eafcf8449090ca9798eabe5620af44","tarball":"https://registry.npmjs.org/@mcp-abap-adt/auth-broker/-/auth-broker-1.0.5.tgz","fileCount":40,"integrity":"sha512-2OQgPGvlmG+g9NwU1/mPkmMeJCD6hp3bP9fuOKRIF/Ini6YSB7dN/uCgkZ0CwLkLu7jU6dEKU+P5A4FoNjHrpQ==","signatures":[{"sig":"MEQCIFJzFdR5YPMKuGJtkyqG/S8aTKi4+rNcvt92kvQRbL+0AiBgnJKuORZnLhpgl8a5dETIH1yXcJLEkfD2t7kU1kl7uA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":224384},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"a2f4f58d9a8684e7460d240c31f999a33a190ef8","scripts":{"lint":"biome check --write src","test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"npm run --silent clean && biome check src --diagnostic-level=error && tsc -p tsconfig.json && tsc -p tsconfig.cli.json","clean":"rm -rf dist tsconfig.tsbuildinfo","chrono":"./tools/version-stats.sh","format":"biome format --write src","prepack":"npm run build","test:sso":"sh tests/keycloak/run-interactive.sh","build:fast":"tsc -p tsconfig.json && tsc -p tsconfig.cli.json","lint:check":"biome check src","test:check":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","generate-env":"tsx bin/generate-env-from-service-key.ts","test:mcp-sso":"sh tests/sso-demo/run-mcp-sso.sh","test:mcp-auth":"sh tests/sso-demo/run-mcp-auth.sh","prepublishOnly":"npm run build","test:saml-pure":"sh tests/keycloak/run-saml.sh","test:device-code":"sh tests/keycloak/run-oidc.sh"},"_npmUser":{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"},"repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git"},"_npmVersion":"11.9.0","description":"JWT authentication broker for MCP ABAP ADT - manages tokens based on destination headers","directories":{},"_nodeVersion":"25.6.1","dependencies":{"tsx":"^4.21.0","axios":"^1.13.5","@mcp-abap-adt/interfaces":"^2.3.0","@mcp-abap-adt/auth-stores":"^1.0.2","@mcp-abap-adt/auth-providers":"^1.0.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","pino":"^10.1.0","js-yaml":"^4.1.1","ts-jest":"^29.2.5","jest-util":"^30.2.0","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^25.2.3","pino-pretty":"^13.1.3","@biomejs/biome":"^2.3.14","@types/express":"^5.0.5","@types/js-yaml":"^4.0.9","@mcp-abap-adt/logger":"^0.1.4"},"_npmOperationalInternal":{"tmp":"tmp/auth-broker_1.0.5_1770894074422_0.14055213867120675","host":"s3://npm-registry-packages-npm-production"}},"1.0.6":{"name":"@mcp-abap-adt/auth-broker","version":"1.0.6","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt"],"author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"license":"MIT","_id":"@mcp-abap-adt/auth-broker@1.0.6","maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker#readme","bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"bin":{"mcp-sso":"dist/bin/mcp-sso.js","mcp-auth":"dist/bin/mcp-auth.js"},"dist":{"shasum":"cb8defbf042608ab1eac65490d5ba448920c2c67","tarball":"https://registry.npmjs.org/@mcp-abap-adt/auth-broker/-/auth-broker-1.0.6.tgz","fileCount":40,"integrity":"sha512-mr2aEcIz0jNHr9zoK/DyrjBd9famqXLPwbHL9vIiOWHalb/XIz82gK11C55w+ONo0XeF4CwlMwzzKQy9hG4Vpg==","signatures":[{"sig":"MEUCIGRGB67NNLStuwzIVDMJX2KA5nv1skb2aLYdiLAlgyAvAiEAtUw9W1/XOUgAF/LM1Q5egLAFg2vwOae0F/hY8HhVMRo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":226580},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"77e6cda9381dc272e5a4c233e04576724eb3dc57","scripts":{"lint":"biome check --write src","test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"npm run --silent clean && biome check src --diagnostic-level=error && tsc -p tsconfig.json && tsc -p tsconfig.cli.json","clean":"rm -rf dist tsconfig.tsbuildinfo","chrono":"./tools/version-stats.sh","format":"biome format --write src","prepack":"npm run build","test:sso":"sh tests/keycloak/run-interactive.sh","build:fast":"tsc -p tsconfig.json && tsc -p tsconfig.cli.json","lint:check":"biome check src","test:check":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","generate-env":"tsx bin/generate-env-from-service-key.ts","test:mcp-sso":"sh tests/sso-demo/run-mcp-sso.sh","test:mcp-auth":"sh tests/sso-demo/run-mcp-auth.sh","prepublishOnly":"npm run build","test:saml-pure":"sh tests/keycloak/run-saml.sh","test:device-code":"sh tests/keycloak/run-oidc.sh"},"_npmUser":{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"},"repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git"},"_npmVersion":"11.12.1","description":"JWT authentication broker for MCP ABAP ADT - manages tokens based on destination headers","directories":{},"_nodeVersion":"25.9.0","dependencies":{"tsx":"^4.21.0","axios":"^1.13.5","@mcp-abap-adt/interfaces":"^2.3.0","@mcp-abap-adt/auth-stores":"^1.0.2","@mcp-abap-adt/auth-providers":"^1.0.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","pino":"^10.1.0","js-yaml":"^4.1.1","ts-jest":"^29.2.5","jest-util":"^30.2.0","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^25.2.3","pino-pretty":"^13.1.3","@biomejs/biome":"^2.3.14","@types/express":"^5.0.5","@types/js-yaml":"^4.0.9","@mcp-abap-adt/logger":"^0.1.4"},"_npmOperationalInternal":{"tmp":"tmp/auth-broker_1.0.6_1780413844889_0.8962237137089635","host":"s3://npm-registry-packages-npm-production"}},"1.0.7":{"name":"@mcp-abap-adt/auth-broker","version":"1.0.7","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt"],"author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"license":"MIT","_id":"@mcp-abap-adt/auth-broker@1.0.7","maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker#readme","bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"bin":{"mcp-sso":"dist/bin/mcp-sso.js","mcp-auth":"dist/bin/mcp-auth.js"},"dist":{"shasum":"d362701b8c0f7f81fbbe357461cb70c93d40ae3c","tarball":"https://registry.npmjs.org/@mcp-abap-adt/auth-broker/-/auth-broker-1.0.7.tgz","fileCount":40,"integrity":"sha512-0SHGujnD5Gfoc7MEWyxdAAKNVf6ZBMLQbQ6OD8MniutQnJFLYkQ92TsHlkb3P9HpX78roTkKBV8o4Vqm0DEk0g==","signatures":[{"sig":"MEQCIGkEcG1bNWTgErZsOB+5oqPP0cCLCtVEIYOx3b8xd4FFAiAVVrBPRnDzqQiNvbUTuj8BYSMIolrdGJTFQb2S7qN+eA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":227118},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"04d1606240b338634eb6e36589daefd1e45b617d","scripts":{"lint":"biome check --write src","test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"npm run --silent clean && biome check src --diagnostic-level=error && tsc -p tsconfig.json && tsc -p tsconfig.cli.json","clean":"rm -rf dist tsconfig.tsbuildinfo","chrono":"./tools/version-stats.sh","format":"biome format --write src","prepack":"npm run build","test:sso":"sh tests/keycloak/run-interactive.sh","build:fast":"tsc -p tsconfig.json && tsc -p tsconfig.cli.json","lint:check":"biome check src","test:check":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","generate-env":"tsx bin/generate-env-from-service-key.ts","test:mcp-sso":"sh tests/sso-demo/run-mcp-sso.sh","test:mcp-auth":"sh tests/sso-demo/run-mcp-auth.sh","prepublishOnly":"npm run build","test:saml-pure":"sh tests/keycloak/run-saml.sh","test:device-code":"sh tests/keycloak/run-oidc.sh"},"_npmUser":{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"},"repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git"},"_npmVersion":"11.12.1","description":"JWT authentication broker for MCP ABAP ADT - manages tokens based on destination headers","directories":{},"_nodeVersion":"25.9.0","dependencies":{"axios":"^1.13.5","@mcp-abap-adt/interfaces":"^2.3.0","@mcp-abap-adt/auth-stores":"^1.0.2","@mcp-abap-adt/auth-providers":"^1.0.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^30.2.0","pino":"^10.1.0","js-yaml":"^4.1.1","ts-jest":"^29.2.5","jest-util":"^30.2.0","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^25.2.3","pino-pretty":"^13.1.3","@biomejs/biome":"^2.3.14","@types/express":"^5.0.5","@types/js-yaml":"^4.0.9","@mcp-abap-adt/logger":"^0.1.4"},"_npmOperationalInternal":{"tmp":"tmp/auth-broker_1.0.7_1780920573943_0.31367329500569996","host":"s3://npm-registry-packages-npm-production"}},"1.0.8":{"name":"@mcp-abap-adt/auth-broker","version":"1.0.8","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt"],"author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"license":"MIT","_id":"@mcp-abap-adt/auth-broker@1.0.8","maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker#readme","bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"bin":{"mcp-sso":"dist/bin/mcp-sso.js","mcp-auth":"dist/bin/mcp-auth.js"},"dist":{"shasum":"b1720289c115f833d1823fe0956d7115afcd4ca9","tarball":"https://registry.npmjs.org/@mcp-abap-adt/auth-broker/-/auth-broker-1.0.8.tgz","fileCount":40,"integrity":"sha512-wiDL207OkvuJr383SQK2xFgA3R3WV/Vk8MW4nbc42Kjaxux/6IqgvwA+SHRZU0BlJh16uovzQ0KN/MnNfw6TYw==","signatures":[{"sig":"MEQCICKI5QOsqTYCZfidBIj/u6p4cYeWJv/hcP9qO6pzHNmfAiAj+9viVMfxD5X2VsQGDaXE2RY2bPs77RMhNan4kOjylw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":228189},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.2.0"},"gitHead":"b2cef5c727b05879837df7b3f2fbaa1a35fa5ed1","scripts":{"lint":"biome check --write src","test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"npm run --silent clean && biome check src --diagnostic-level=error && tsc -p tsconfig.json && tsc -p tsconfig.cli.json","clean":"rm -rf dist tsconfig.tsbuildinfo","chrono":"./tools/version-stats.sh","format":"biome format --write src","prepack":"npm run build","test:sso":"sh tests/keycloak/run-interactive.sh","build:fast":"tsc -p tsconfig.json && tsc -p tsconfig.cli.json","lint:check":"biome check src","test:check":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","generate-env":"tsx bin/generate-env-from-service-key.ts","test:mcp-sso":"sh tests/sso-demo/run-mcp-sso.sh","test:mcp-auth":"sh tests/sso-demo/run-mcp-auth.sh","prepublishOnly":"npm run build","test:saml-pure":"sh tests/keycloak/run-saml.sh","test:device-code":"sh tests/keycloak/run-oidc.sh"},"_npmUser":{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"},"repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git"},"_npmVersion":"11.18.0","description":"JWT authentication broker for MCP ABAP ADT - manages tokens based on destination headers","directories":{},"_nodeVersion":"25.9.0","dependencies":{"axios":"^1.13.5","@mcp-abap-adt/interfaces":"^2.3.0","@mcp-abap-adt/auth-stores":"^1.0.2","@mcp-abap-adt/auth-providers":"^1.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^30.2.0","pino":"^10.1.0","js-yaml":"^4.1.1","ts-jest":"^29.2.5","jest-util":"^30.2.0","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^25.2.3","pino-pretty":"^13.1.3","@biomejs/biome":"^2.3.14","@types/express":"^5.0.5","@types/js-yaml":"^4.0.9","@mcp-abap-adt/logger":"^0.1.4"},"_npmOperationalInternal":{"tmp":"tmp/auth-broker_1.0.8_1785271659289_0.3508537708289752","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@mcp-abap-adt/auth-broker","version":"2.0.0","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt"],"author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"license":"MIT","_id":"@mcp-abap-adt/auth-broker@2.0.0","maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker#readme","bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"bin":{"mcp-sso":"dist/bin/mcp-sso.js","mcp-auth":"dist/bin/mcp-auth.js"},"dist":{"shasum":"cf6413d982ba78d82b9547cac49f33ef6c5e3686","tarball":"https://registry.npmjs.org/@mcp-abap-adt/auth-broker/-/auth-broker-2.0.0.tgz","fileCount":41,"integrity":"sha512-VtkN1H9mT5nRJ3ypWPaI4rPJfl//GCHmwfy8aOPYjxxtGieDBP83mjNVrgAz0CqyLUYxamxP0tnO+xtfSWWCOg==","signatures":[{"sig":"MEUCIHsxJcXjPpPNdADuAiXecOVlV6E8EAXs7BXBjLn4Uh81AiEAuW9ijz9VlNwF2CDqqHk3W/pgfyEHjE7OkgerxQuRvkQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":247697},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.2.0"},"gitHead":"f0ea1d5fbd0e570016bd3bf7db6cba7aca72ab49","scripts":{"lint":"biome check --write src","test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"npm run --silent clean && biome check src --diagnostic-level=error && tsc -p tsconfig.json && tsc -p tsconfig.cli.json","clean":"rm -rf dist tsconfig.tsbuildinfo","chrono":"./tools/version-stats.sh","format":"biome format --write src","prepack":"npm run build","test:sso":"sh tests/keycloak/run-interactive.sh","build:fast":"tsc -p tsconfig.json && tsc -p tsconfig.cli.json","lint:check":"biome check src","test:check":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","generate-env":"tsx bin/generate-env-from-service-key.ts","test:mcp-sso":"sh tests/sso-demo/run-mcp-sso.sh","test:mcp-auth":"sh tests/sso-demo/run-mcp-auth.sh","prepublishOnly":"npm run build","test:saml-pure":"sh tests/keycloak/run-saml.sh","test:device-code":"sh tests/keycloak/run-oidc.sh"},"_npmUser":{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"},"repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git"},"_npmVersion":"11.18.0","description":"JWT authentication broker for MCP ABAP ADT - manages tokens based on destination headers","directories":{},"_nodeVersion":"25.9.0","dependencies":{"axios":"^1.13.5","@mcp-abap-adt/interfaces":"^2.3.0","@mcp-abap-adt/auth-stores":"^1.0.2","@mcp-abap-adt/auth-providers":"^2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^30.2.0","pino":"^10.1.0","js-yaml":"^4.1.1","ts-jest":"^29.2.5","jest-util":"^30.2.0","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^25.2.3","pino-pretty":"^13.1.3","@biomejs/biome":"^2.3.14","@types/express":"^5.0.5","@types/js-yaml":"^4.0.9","@mcp-abap-adt/logger":"^0.1.4"},"_npmOperationalInternal":{"tmp":"tmp/auth-broker_2.0.0_1785679884969_0.3775953480913805","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"@mcp-abap-adt/auth-broker","version":"2.1.0","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt"],"author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"license":"LGPL-3.0-only","_id":"@mcp-abap-adt/auth-broker@2.1.0","maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker#readme","bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"bin":{"mcp-sso":"dist/bin/mcp-sso.js","mcp-auth":"dist/bin/mcp-auth.js"},"dist":{"shasum":"f4d5cc9811b204e7639727df6ef95a4cfb4a52ac","tarball":"https://registry.npmjs.org/@mcp-abap-adt/auth-broker/-/auth-broker-2.1.0.tgz","fileCount":42,"integrity":"sha512-q/KLTH4Kund0iOg/iqvTDAEDIiqD3/C4m5qhRdV9I3X/RPHeuqs5gVL2CmNEEkaqUg9BQcpCNX4OqLgGvyRWqg==","signatures":[{"sig":"MEUCICG28bCFOvKUyphtr3OeEa/9/UJKB0wVC+aU8flgnDC3AiEA2EvPAQdDxMgG0zrXzvovqfRfXYndbvAYsMopKZegJC0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIGo5jl5hSkuUD1jt0iDXwtY2uMO19nx30e12IWoX1Kg/AiAs1FUt8G35B0QR/PbDDFDzi3TFFplCvqANfA3p34Ygiw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":291460},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.2.0"},"gitHead":"3a8ce80356f2abc715711f6f128c08c05fae6cc4","scripts":{"lint":"biome check --write src","test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"npm run --silent clean && biome check src --diagnostic-level=error && tsc -p tsconfig.json && tsc -p tsconfig.cli.json","clean":"rm -rf dist tsconfig.tsbuildinfo","chrono":"./tools/version-stats.sh","format":"biome format --write src","prepack":"npm run build","test:sso":"sh tests/keycloak/run-interactive.sh","build:fast":"tsc -p tsconfig.json && tsc -p tsconfig.cli.json","lint:check":"biome check src","test:check":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","generate-env":"tsx bin/generate-env-from-service-key.ts","test:mcp-sso":"sh tests/sso-demo/run-mcp-sso.sh","test:mcp-auth":"sh tests/sso-demo/run-mcp-auth.sh","prepublishOnly":"npm run build","test:saml-pure":"sh tests/keycloak/run-saml.sh","test:device-code":"sh tests/keycloak/run-oidc.sh"},"_npmUser":{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"},"repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git"},"_npmVersion":"11.19.0","description":"JWT authentication broker for MCP ABAP ADT - manages tokens based on destination headers","directories":{},"_nodeVersion":"26.7.0","dependencies":{"axios":"^1.13.5","@mcp-abap-adt/interfaces":"^2.3.0","@mcp-abap-adt/auth-stores":"^1.0.2","@mcp-abap-adt/auth-providers":"^2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^30.2.0","pino":"^10.1.0","js-yaml":"^4.1.1","ts-jest":"^29.2.5","jest-util":"^30.2.0","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^25.2.3","pino-pretty":"^13.1.3","@biomejs/biome":"^2.3.14","@types/express":"^5.0.5","@types/js-yaml":"^4.0.9","@mcp-abap-adt/logger":"^0.1.4"},"_npmOperationalInternal":{"tmp":"tmp/auth-broker_2.1.0_1790198978321_0.7893962065114624","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"name":"@mcp-abap-adt/auth-broker","version":"2.2.0","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt"],"author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"license":"LGPL-3.0-only","_id":"@mcp-abap-adt/auth-broker@2.2.0","maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker#readme","bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"bin":{"mcp-sso":"dist/bin/mcp-sso.js","mcp-auth":"dist/bin/mcp-auth.js"},"dist":{"shasum":"04fee8f65672d2b51caf5589b8797a776ad204ce","tarball":"https://registry.npmjs.org/@mcp-abap-adt/auth-broker/-/auth-broker-2.2.0.tgz","fileCount":42,"integrity":"sha512-0/qz3zaMs8ylK53rq9I8U9ymCb3P41X6pmhzPhEYaOa/xF+UinyGJqRbc3Kt2F3ngr5swt/9RMLeVsoZnc0JYQ==","signatures":[{"sig":"MEQCIHKaSG2guoysWnAk/kYpG/FkIYFylcpAXkcUXlp93kfFAiBjtiULmegGy9CMErivTGSNKjNbAvai0MZ5P20/G2YwSw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIGObVxPuDF8UbcMzhYvOawgGw2uVhofOqmI/4kPqwk/DAiBMnsD5SHisBm2WDmc3wK26afiY/8pig02M+Q6INPuBJA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":294211},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.2.0"},"gitHead":"2f4b38e9ec17570946677796f3c4a2ca2623b2d5","scripts":{"lint":"biome check --write src","test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"npm run --silent clean && biome check src --diagnostic-level=error && tsc -p tsconfig.json && tsc -p tsconfig.cli.json","clean":"rm -rf dist tsconfig.tsbuildinfo","chrono":"./tools/version-stats.sh","format":"biome format --write src","prepack":"npm run build","test:sso":"sh tests/keycloak/run-interactive.sh","build:fast":"tsc -p tsconfig.json && tsc -p tsconfig.cli.json","lint:check":"biome check src","test:check":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","generate-env":"tsx bin/generate-env-from-service-key.ts","test:mcp-sso":"sh tests/sso-demo/run-mcp-sso.sh","test:mcp-auth":"sh tests/sso-demo/run-mcp-auth.sh","prepublishOnly":"npm run build","test:saml-pure":"sh tests/keycloak/run-saml.sh","test:device-code":"sh tests/keycloak/run-oidc.sh"},"_npmUser":{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"},"repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git"},"_npmVersion":"11.19.0","description":"JWT authentication broker for MCP ABAP ADT - manages tokens based on destination headers","directories":{},"_nodeVersion":"26.7.0","dependencies":{"axios":"^1.13.5","@mcp-abap-adt/auth-stores":"^1.2.0","@mcp-abap-adt/auth-providers":"^2.2.0","@mcp-abap-adt/interfaces-auth":"^1.2.0","@mcp-abap-adt/interfaces-utils":"^1.1.0","@mcp-abap-adt/interfaces-auth-sap":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^30.2.0","pino":"^10.1.0","js-yaml":"^4.1.1","ts-jest":"^29.2.5","jest-util":"^30.2.0","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^25.2.3","pino-pretty":"^13.1.3","@biomejs/biome":"^2.3.14","@types/express":"^5.0.5","@types/js-yaml":"^4.0.9","@mcp-abap-adt/logger":"^0.4.0"},"_npmOperationalInternal":{"tmp":"tmp/auth-broker_2.2.0_1790229377405_0.5825331386636521","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"@mcp-abap-adt/auth-broker","version":"3.0.0","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt","xsuaa","oauth2","saml","sso"],"author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"license":"LGPL-3.0-only","_id":"@mcp-abap-adt/auth-broker@3.0.0","maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker#readme","bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"bin":{"mcp-sso":"dist/bin/mcp-sso.js","mcp-auth":"dist/bin/mcp-auth.js"},"dist":{"shasum":"90e63f4135bc62e8665e5a1ffd32bf719c16afe6","tarball":"https://registry.npmjs.org/@mcp-abap-adt/auth-broker/-/auth-broker-3.0.0.tgz","fileCount":41,"integrity":"sha512-opsViDL5YCOLeIAwm9ADe/8dZCY3z+CaBPAsdJCCIJdv4y/03i30Lx/LeEL2dyFkXjWVpQBSdkbzk+ezUyLzBw==","signatures":[{"sig":"MEUCIFfkrG6c3wWIRqvYtuvbpi+JTutkndR2wSp1qTVM3xeaAiEAlGPo53sLu12KUoaDcU5AYAL9hFGSzaplBOhZMrraaMY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIHYtawZXcryK4lP74wLkMgtODlAg3kiGkFL2NvwCq25UAiAny7h3+q6g/jdyEocf7ZZHIDz4aC4GUW8w4bQ/CCKUPg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":310725},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":"^22 || ^24"},"gitHead":"cda1520be6e92c83b2c4f5eec1a1953f905a4dd6","scripts":{"lint":"biome check --write src","test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"npm run --silent clean && biome check src --diagnostic-level=error && tsc -p tsconfig.json && tsc -p tsconfig.cli.json","clean":"rm -rf dist tsconfig.tsbuildinfo","chrono":"./tools/version-stats.sh","format":"biome format --write src","prepack":"npm run build","test:sso":"sh tests/keycloak/run-interactive.sh","build:fast":"tsc -p tsconfig.json && tsc -p tsconfig.cli.json","lint:check":"biome check src","test:check":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","generate-env":"tsx bin/generate-env-from-service-key.ts","test:mcp-sso":"sh tests/sso-demo/run-mcp-sso.sh","test:mcp-auth":"sh tests/sso-demo/run-mcp-auth.sh","prepublishOnly":"npm run build","test:saml-pure":"sh tests/keycloak/run-saml.sh","test:device-code":"sh tests/keycloak/run-oidc.sh"},"_npmUser":{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"},"repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git"},"_npmVersion":"11.19.0","description":"Per-destination token broker for SAP BTP and ABAP: sessions and service keys from stores, tokens from an injected provider, results persisted - plus the mcp-auth and mcp-sso CLIs","directories":{},"_nodeVersion":"26.7.0","dependencies":{"axios":"^1.13.5","@mcp-abap-adt/auth-stores":"^1.2.3","@mcp-abap-adt/auth-providers":"^4.2.0","@mcp-abap-adt/interfaces-auth":"^2.1.0","@mcp-abap-adt/interfaces-utils":"^1.1.0","@mcp-abap-adt/interfaces-auth-sap":"^1.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^30.2.0","pino":"^10.1.0","js-yaml":"^4.1.1","ts-jest":"^29.2.5","jest-util":"^30.2.0","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^25.2.3","pino-pretty":"^13.1.3","@biomejs/biome":"^2.3.14","@types/express":"^5.0.5","@types/js-yaml":"^4.0.9","@mcp-abap-adt/logger":"^0.4.0"},"_npmOperationalInternal":{"tmp":"tmp/auth-broker_3.0.0_1790432733433_0.8209482215071306","host":"s3://npm-registry-packages-npm-production"}},"3.0.1":{"name":"@mcp-abap-adt/auth-broker","version":"3.0.1","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt","xsuaa","oauth2","saml","sso"],"author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"license":"LGPL-3.0-only","_id":"@mcp-abap-adt/auth-broker@3.0.1","maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker#readme","bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"bin":{"mcp-sso":"dist/bin/mcp-sso.js","mcp-auth":"dist/bin/mcp-auth.js"},"dist":{"shasum":"7c8734735b1068bcbdc44e98dcf173af486ad894","tarball":"https://registry.npmjs.org/@mcp-abap-adt/auth-broker/-/auth-broker-3.0.1.tgz","fileCount":41,"integrity":"sha512-PsnJ7B+QDYjy5PRY11aIdY37nKF+zqEGHheB2wXQF4DBp0uNbDwkUgx690LerzVXQ1ej3bSXamvOQw3AfNsESA==","signatures":[{"sig":"MEUCIHRIHChpH9TDikvS0dO/Qftbhv0CQ0FvEQdP2O7usm7GAiEA5kgIXJ6hWRW+GmX4ijUrcjX8Q2Oc3s7GcX7OdQxDK7I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIEMOvQ7JOthAoXiS6kBNWflQw5RbHDzOqJ+3FHPaZy9GAiEAusL+qIFblrBrve2pX42riObs/1U2Va392MLXoeIGAM4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":312951},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":"^22 || ^24"},"gitHead":"e6cdf891c97c8caf91e65a0d9bc846fd5526d86d","scripts":{"lint":"biome check --write src","test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"npm run --silent clean && biome check src --diagnostic-level=error && tsc -p tsconfig.json && tsc -p tsconfig.cli.json","clean":"rm -rf dist tsconfig.tsbuildinfo","chrono":"./tools/version-stats.sh","format":"biome format --write src","prepack":"npm run build","test:sso":"sh tests/keycloak/run-interactive.sh","build:fast":"tsc -p tsconfig.json && tsc -p tsconfig.cli.json","lint:check":"biome check src","test:check":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","generate-env":"tsx bin/generate-env-from-service-key.ts","test:mcp-sso":"sh tests/sso-demo/run-mcp-sso.sh","test:mcp-auth":"sh tests/sso-demo/run-mcp-auth.sh","prepublishOnly":"npm run build","test:saml-pure":"sh tests/keycloak/run-saml.sh","test:device-code":"sh tests/keycloak/run-oidc.sh"},"_npmUser":{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"},"repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git"},"_npmVersion":"11.19.0","description":"Per-destination token broker for SAP BTP and ABAP: sessions and service keys from stores, tokens from an injected provider, results persisted - plus the mcp-auth and mcp-sso CLIs","directories":{},"_nodeVersion":"26.7.0","dependencies":{"axios":"^1.13.5","@mcp-abap-adt/auth-stores":"^1.2.3","@mcp-abap-adt/auth-providers":"^4.2.0","@mcp-abap-adt/interfaces-auth":"^2.1.0","@mcp-abap-adt/interfaces-utils":"^1.1.0","@mcp-abap-adt/interfaces-auth-sap":"^1.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^30.2.0","pino":"^10.1.0","js-yaml":"^4.1.1","ts-jest":"^29.2.5","jest-util":"^30.2.0","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^25.2.3","pino-pretty":"^13.1.3","@biomejs/biome":"^2.3.14","@types/express":"^5.0.5","@types/js-yaml":"^4.0.9","@mcp-abap-adt/logger":"^0.4.0"},"_npmOperationalInternal":{"tmp":"tmp/auth-broker_3.0.1_1790451640687_0.013413231122843872","host":"s3://npm-registry-packages-npm-production"}},"3.0.2":{"name":"@mcp-abap-adt/auth-broker","version":"3.0.2","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt","xsuaa","oauth2","saml","sso"],"author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"license":"LGPL-3.0-only","_id":"@mcp-abap-adt/auth-broker@3.0.2","maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker#readme","bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"bin":{"mcp-sso":"dist/bin/mcp-sso.js","mcp-auth":"dist/bin/mcp-auth.js"},"dist":{"shasum":"6e7f8500962a7282a5916760f3470f3a00a45c82","tarball":"https://registry.npmjs.org/@mcp-abap-adt/auth-broker/-/auth-broker-3.0.2.tgz","fileCount":41,"integrity":"sha512-2fNgkKBqF+NjbP5LMI5fvJ7i8LCL7Fn6p1q8GiJChSGFYXHcRqN77ERspe8EsZD3wb4dmlPoc6WO4BgbxxozSQ==","signatures":[{"sig":"MEYCIQD5nNWFKuyrlpNKgEvSV0pgfKJkVBcH0njTx7pTp69KPAIhAJ5AIKiinVMdTuKVEonkKZ70h4/yU6eNM0xB3tEGQFdW","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDWDmZ2fbHXb68DxvgFS2+RRpoQuWEAe7sW0EW05kCuDwIhAPEMOklyVj3Z76wCOT+I2dVcXUqj9Bkor8HBL2VzA980","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":313474},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":"^22 || ^24 || ^26"},"gitHead":"a6683d9d8ddf8d9a990fc916a36154d0db8c5f62","scripts":{"lint":"biome check --write src","test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"npm run --silent clean && biome check src --diagnostic-level=error && tsc -p tsconfig.json && tsc -p tsconfig.cli.json","clean":"rm -rf dist tsconfig.tsbuildinfo","chrono":"./tools/version-stats.sh","format":"biome format --write src","prepack":"npm run build","test:sso":"sh tests/keycloak/run-interactive.sh","build:fast":"tsc -p tsconfig.json && tsc -p tsconfig.cli.json","lint:check":"biome check src","test:check":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","generate-env":"tsx bin/generate-env-from-service-key.ts","test:mcp-sso":"sh tests/sso-demo/run-mcp-sso.sh","test:mcp-auth":"sh tests/sso-demo/run-mcp-auth.sh","prepublishOnly":"npm run build","test:saml-pure":"sh tests/keycloak/run-saml.sh","test:device-code":"sh tests/keycloak/run-oidc.sh"},"_npmUser":{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"},"repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git"},"_npmVersion":"11.19.0","description":"Per-destination token broker for SAP BTP and ABAP: sessions and service keys from stores, tokens from an injected provider, results persisted - plus the mcp-auth and mcp-sso CLIs","directories":{},"_nodeVersion":"26.7.0","dependencies":{"axios":"^1.13.5","@mcp-abap-adt/auth-stores":"^1.2.3","@mcp-abap-adt/auth-providers":"^4.2.0","@mcp-abap-adt/interfaces-auth":"^2.1.0","@mcp-abap-adt/interfaces-utils":"^1.1.0","@mcp-abap-adt/interfaces-auth-sap":"^1.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^30.2.0","pino":"^10.1.0","js-yaml":"^4.1.1","ts-jest":"^29.2.5","jest-util":"^30.2.0","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^25.2.3","pino-pretty":"^13.1.3","@biomejs/biome":"^2.3.14","@types/express":"^5.0.5","@types/js-yaml":"^4.0.9","@mcp-abap-adt/logger":"^0.4.0"},"_npmOperationalInternal":{"tmp":"tmp/auth-broker_3.0.2_1790526173748_0.5218178640472533","host":"s3://npm-registry-packages-npm-production"}},"3.0.3":{"name":"@mcp-abap-adt/auth-broker","version":"3.0.3","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt","xsuaa","oauth2","saml","sso"],"author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"license":"LGPL-3.0-only","_id":"@mcp-abap-adt/auth-broker@3.0.3","maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker#readme","bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"bin":{"mcp-sso":"dist/bin/mcp-sso.js","mcp-auth":"dist/bin/mcp-auth.js"},"dist":{"shasum":"6f58160d56760b4cc3a50e61d729934474b3c23a","tarball":"https://registry.npmjs.org/@mcp-abap-adt/auth-broker/-/auth-broker-3.0.3.tgz","fileCount":41,"integrity":"sha512-nR9YQSzu7mAqniT+Gke7C+GHMlUO9VIgW1j7jF+M2220npeffll4/70FrjYicZOWi0GV+4047dvtCzWJ2qXegQ==","signatures":[{"sig":"MEQCIAxn+TyasLi2vk8Y7OxCnn/50mQjefI1m+TzuZipOjQHAiA/mYOA2KyC3wQq522WZZ467yF2/qUPGodVipHCmGpAvg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDZRciMa3Lz91ZCQpb0CAdtjjiGdTGiIga7t5KWuzx7YAIhAKlgTXiYXfsjr6wrfUG6BVmjQSn1Gm8nuFwyJLAhUXnK","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":314256},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":"^22 || ^24 || ^26"},"gitHead":"5e6b9e85207f7edafe9fa8a08c15e3700c060de2","scripts":{"lint":"biome check --write src","test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"npm run --silent clean && biome check src --diagnostic-level=error && tsc -p tsconfig.json && tsc -p tsconfig.cli.json","clean":"rm -rf dist tsconfig.tsbuildinfo","chrono":"./tools/version-stats.sh","format":"biome format --write src","prepack":"npm run build","test:sso":"sh tests/keycloak/run-interactive.sh","build:fast":"tsc -p tsconfig.json && tsc -p tsconfig.cli.json","lint:check":"biome check src","test:check":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","generate-env":"tsx bin/generate-env-from-service-key.ts","test:mcp-sso":"sh tests/sso-demo/run-mcp-sso.sh","test:mcp-auth":"sh tests/sso-demo/run-mcp-auth.sh","prepublishOnly":"npm run build","test:saml-pure":"sh tests/keycloak/run-saml.sh","test:device-code":"sh tests/keycloak/run-oidc.sh"},"_npmUser":{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"},"deprecated":"mcp-sso fails to start (Cannot find module @mcp-abap-adt/logger). Use 3.0.4.","repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git"},"_npmVersion":"11.19.0","description":"Per-destination token broker for SAP BTP and ABAP: sessions and service keys from stores, tokens from an injected provider, results persisted - plus the mcp-auth and mcp-sso CLIs","directories":{},"_nodeVersion":"26.7.0","dependencies":{"axios":"^1.13.5","@mcp-abap-adt/auth-stores":"^1.2.3","@mcp-abap-adt/auth-providers":"^4.2.0","@mcp-abap-adt/interfaces-auth":"^2.1.0","@mcp-abap-adt/interfaces-utils":"^1.1.0","@mcp-abap-adt/interfaces-auth-sap":"^1.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^30.2.0","pino":"^10.1.0","js-yaml":"^4.1.1","ts-jest":"^29.2.5","jest-util":"^30.2.0","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^25.2.3","pino-pretty":"^13.1.3","@biomejs/biome":"^2.3.14","@types/express":"^5.0.5","@types/js-yaml":"^4.0.9","@mcp-abap-adt/logger":"^0.4.0"},"_npmOperationalInternal":{"tmp":"tmp/auth-broker_3.0.3_1790531500212_0.8442321452904924","host":"s3://npm-registry-packages-npm-production"}},"3.0.4":{"name":"@mcp-abap-adt/auth-broker","version":"3.0.4","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt","xsuaa","oauth2","saml","sso"],"author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"license":"LGPL-3.0-only","_id":"@mcp-abap-adt/auth-broker@3.0.4","maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker#readme","bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"bin":{"mcp-sso":"dist/bin/mcp-sso.js","mcp-auth":"dist/bin/mcp-auth.js"},"dist":{"shasum":"c7879892a23f5536f9031419746dc06a5f5362a4","tarball":"https://registry.npmjs.org/@mcp-abap-adt/auth-broker/-/auth-broker-3.0.4.tgz","fileCount":41,"integrity":"sha512-P9RRRdum0iWBLuYBdBmQAaBqLP32dahWlCNkAyZai5IzFK55Z5MdmFKBFeRlSglNdYG6mU5Avsf8GCYUQaB+sA==","signatures":[{"sig":"MEYCIQCJY4ig4WPUV8slVnt0Ytyf0e5Yv+Z3r2OXe4Q6c66kEQIhAP7RUs6ZNTJxiboTOJPpyAjNLzx3bMN+7Ll911hmr7zi","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQD/ZKWMG6zzRyVzna5TlLhrnJQlDt3mnf06KNp+eYBZZgIhAPvNvNDH6fOYfQyR7DTYim6yoZPpbOI5qt3r0LwT7nJN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":315138},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":"^22 || ^24 || ^26"},"gitHead":"bd8ed01fd95caee0311e039af93232cd6051728e","scripts":{"lint":"biome check --write src","test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"npm run --silent clean && biome check src --diagnostic-level=error && tsc -p tsconfig.json && tsc -p tsconfig.cli.json","clean":"rm -rf dist tsconfig.tsbuildinfo","chrono":"./tools/version-stats.sh","format":"biome format --write src","prepack":"npm run build","test:sso":"sh tests/keycloak/run-interactive.sh","build:fast":"tsc -p tsconfig.json && tsc -p tsconfig.cli.json","lint:check":"biome check src","test:check":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","generate-env":"tsx bin/generate-env-from-service-key.ts","test:mcp-sso":"sh tests/sso-demo/run-mcp-sso.sh","test:mcp-auth":"sh tests/sso-demo/run-mcp-auth.sh","prepublishOnly":"npm run build","test:saml-pure":"sh tests/keycloak/run-saml.sh","test:device-code":"sh tests/keycloak/run-oidc.sh"},"_npmUser":{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"},"repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git"},"_npmVersion":"11.19.0","description":"Per-destination token broker for SAP BTP and ABAP: sessions and service keys from stores, tokens from an injected provider, results persisted - plus the mcp-auth and mcp-sso CLIs","directories":{},"_nodeVersion":"26.7.0","dependencies":{"axios":"^1.13.5","@mcp-abap-adt/logger":"^0.4.0","@mcp-abap-adt/auth-stores":"^1.2.3","@mcp-abap-adt/auth-providers":"^4.2.0","@mcp-abap-adt/interfaces-auth":"^2.1.0","@mcp-abap-adt/interfaces-utils":"^1.1.0","@mcp-abap-adt/interfaces-auth-sap":"^1.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^30.2.0","pino":"^10.1.0","js-yaml":"^4.1.1","ts-jest":"^29.2.5","jest-util":"^30.2.0","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^25.2.3","pino-pretty":"^13.1.3","@biomejs/biome":"^2.3.14","@types/express":"^5.0.5","@types/js-yaml":"^4.0.9"},"_npmOperationalInternal":{"tmp":"tmp/auth-broker_3.0.4_1790542257420_0.7845529037609975","host":"s3://npm-registry-packages-npm-production"}},"3.1.0":{"name":"@mcp-abap-adt/auth-broker","version":"3.1.0","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt","xsuaa","oauth2","saml"],"author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"license":"LGPL-3.0-only","_id":"@mcp-abap-adt/auth-broker@3.1.0","maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/tree/main/packages/auth-broker#readme","bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"dist":{"shasum":"9c0def84d62c058b026f47a160d1908f7fae9ee0","tarball":"https://registry.npmjs.org/@mcp-abap-adt/auth-broker/-/auth-broker-3.1.0.tgz","fileCount":26,"integrity":"sha512-zCTKQPAtrvMUihAKY7VicEZKJVmExdBY27zIzpGzbDhUj8/r/OTUEGTS3RfD5hqwQiv72lyGXfY5kjt11m1NiQ==","signatures":[{"sig":"MEQCIExQmTdD+J10GvodSexZJ1RpB2DjSjkaCEZiKDoi3dcyAiABRWLq4r3Vv7BfP+ShRF1ip7RQ3KlQA/jMZj8UMWfqCg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIAhh6j3/b8AO+d8hGAyy8krsNAlGIv8es1tzThCac/boAiAmZMZYuofZu+59FODcuuQSfCagusPFsuTRO4L4Q7aHjg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":182078},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":"^22 || ^24 || ^26"},"gitHead":"89053590b809a743649f972d5f8d7f6f64173d0e","scripts":{"test":"NODE_OPTIONS=--experimental-vm-modules jest","build":"tsc -b tsconfig.build.json","clean":"rm -rf dist tsconfig.tsbuildinfo tsconfig.build.tsbuildinfo","test:check":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run --prefix ../.. check"},"_npmUser":{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"},"repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git","directory":"packages/auth-broker"},"_npmVersion":"11.19.0","description":"Per-destination token broker for SAP BTP and ABAP: sessions and service keys from stores, tokens from an injected provider, results persisted","directories":{},"_nodeVersion":"26.7.0","dependencies":{"@mcp-abap-adt/interfaces-auth":"^2.1.0","@mcp-abap-adt/interfaces-utils":"^1.1.0","@mcp-abap-adt/interfaces-auth-sap":"^1.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pino":"^10.1.0","js-yaml":"^4.1.1","pino-pretty":"^13.1.3","@types/js-yaml":"^4.0.9","@mcp-abap-adt/logger":"^0.4.0","@mcp-abap-adt/auth-stores":"^1.2.3","@mcp-abap-adt/auth-providers":"^4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/auth-broker_3.1.0_1790866302672_0.15436726433426928","host":"s3://npm-registry-packages-npm-production"}},"4.0.0":{"_id":"@mcp-abap-adt/auth-broker@4.0.0","bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"dist":{"shasum":"6fec6343e4cc4a3299c042de34b6cd6545953cc5","tarball":"https://registry.npmjs.org/@mcp-abap-adt/auth-broker/-/auth-broker-4.0.0.tgz","fileCount":41,"integrity":"sha512-d+PNGQSkLq3tr3eczMDsRmm4oOOhSTWTe/NOP5pe5vJBM7rnRJzYvjvyKP1exPzZ7IbWcpnCBh5jK08R/6zJXg==","signatures":[{"sig":"MEUCIQDdZlkjm4dib/GABSE8dTT+Zb6jUmWeakBFCo3SykkJZgIgWkVuT4L2V2HGUEbMz9OTcZKGu3i+uhfmlMk91J3vETk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIC0rx5E7DvQsibtoD1e8JVG7pEBpQI4iW+Xbv1hYvu5NAiAeF5BnzsmHQT7TYolQfJfQZ28JHB7H06EkOqEl1hFbVw=="}],"unpackedSize":336870},"main":"dist/index.js","name":"@mcp-abap-adt/auth-broker","types":"dist/index.d.ts","author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"engines":{"node":"^22 || ^24 || ^26"},"gitHead":"43f06acd3105d1ec2ca2c268b16adbe31a47d797","license":"LGPL-3.0-only","scripts":{"test":"cross-env NODE_OPTIONS=--experimental-vm-modules jest","build":"tsc -b tsconfig.build.json","clean":"node -e \"for (const p of ['dist', 'tsconfig.tsbuildinfo', 'tsconfig.build.tsbuildinfo']) require('fs').rmSync(p, { recursive: true, force: true })\"","stand:up":"tests/stand/up.sh","test:live":"cross-env NODE_OPTIONS=--experimental-vm-modules jest -c jest.live.config.js","stand:down":"tests/stand/down.sh","test:check":"tsc -p tsconfig.json --noEmit","test:stand":"tests/stand/run.sh","prepublishOnly":"npm run --prefix ../.. check"},"version":"4.0.0","_npmUser":{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"},"homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/tree/main/packages/auth-broker#readme","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt","xsuaa","oauth2","saml"],"repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git","directory":"packages/auth-broker"},"_npmVersion":"11.19.0","description":"Per-destination credential broker for SAP BTP and ABAP: the IAuthProvider a destination states, built from its key store and session store, with every secret it obtains stored back; and a token API","directories":{},"maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"_nodeVersion":"26.7.0","dependencies":{"@mcp-abap-adt/auth-providers":"^5.2.1","@mcp-abap-adt/interfaces-auth":"^3.0.0","@mcp-abap-adt/interfaces-utils":"^1.1.0","@mcp-abap-adt/interfaces-auth-sap":"^2.0.0","@mcp-abap-adt/interfaces-auth-broker":"^1.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pino":"^10.1.0","js-yaml":"^4.1.1","pino-pretty":"^13.1.3","@types/js-yaml":"^4.0.9","@mcp-abap-adt/logger":"^0.4.0","@mcp-abap-adt/auth-mocks":"^0.3.0","@mcp-abap-adt/connection":"^10.0.3","@mcp-abap-adt/auth-stores":"^3.2.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/auth-broker_4.0.0_1790965317973_0.7954396816359157"}}},"time":{"created":"2025-11-30T13:03:20.227Z","modified":"2026-10-02T18:21:58.311Z","0.1.0":"2025-11-30T13:03:20.576Z","0.1.1":"2025-11-30T14:24:04.277Z","0.1.2":"2025-11-30T14:58:32.134Z","0.1.3":"2025-12-01T09:48:18.870Z","0.1.4":"2025-12-01T18:10:14.298Z","0.1.5":"2025-12-02T07:08:38.948Z","0.1.6":"2025-12-03T21:39:31.556Z","0.1.7":"2025-12-04T07:14:06.561Z","0.1.8":"2025-12-04T10:53:56.036Z","0.1.9":"2025-12-05T12:39:32.859Z","0.1.10":"2025-12-07T19:52:29.408Z","0.1.11":"2025-12-08T06:26:10.931Z","0.1.12":"2025-12-08T21:44:43.395Z","0.2.1":"2025-12-12T19:25:04.752Z","0.2.2":"2025-12-12T20:16:17.207Z","0.2.3":"2025-12-18T17:09:56.632Z","0.2.4":"2025-12-19T18:09:00.930Z","0.2.5":"2025-12-20T15:48:56.590Z","0.2.6":"2025-12-20T17:53:44.861Z","0.2.7":"2025-12-21T08:53:02.755Z","0.2.8":"2025-12-21T12:35:21.359Z","0.2.9":"2025-12-21T15:37:30.794Z","0.2.10":"2025-12-22T13:49:15.693Z","0.2.11":"2025-12-23T18:58:27.915Z","0.2.12":"2025-12-24T20:57:40.420Z","0.2.13":"2025-12-25T05:59:16.597Z","0.2.14":"2025-12-25T08:45:25.058Z","0.2.15":"2025-12-30T15:13:15.140Z","0.2.16":"2025-12-30T21:13:39.585Z","0.2.17":"2025-12-30T21:36:14.848Z","0.3.0":"2025-12-31T15:18:24.692Z","0.3.2":"2026-01-28T06:16:52.658Z","0.3.4":"2026-01-28T06:33:27.522Z","0.3.6":"2026-01-28T07:27:49.568Z","1.0.0":"2026-02-10T20:32:05.748Z","1.0.1":"2026-02-10T20:37:50.969Z","1.0.3":"2026-02-11T14:01:23.627Z","1.0.5":"2026-02-12T11:01:14.576Z","1.0.6":"2026-06-02T15:24:05.056Z","1.0.7":"2026-06-08T12:09:34.094Z","1.0.8":"2026-07-28T20:47:39.446Z","2.0.0":"2026-08-02T14:11:25.115Z","2.1.0":"2026-09-23T21:29:38.414Z","2.2.0":"2026-09-24T05:56:17.484Z","3.0.0":"2026-09-26T14:25:33.560Z","3.0.1":"2026-09-26T19:40:40.811Z","3.0.2":"2026-09-27T16:22:53.833Z","3.0.3":"2026-09-27T17:51:40.341Z","3.0.4":"2026-09-27T20:50:57.495Z","3.1.0":"2026-10-01T14:51:42.783Z","4.0.0":"2026-10-02T18:21:58.120Z"},"bugs":{"url":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/issues"},"author":{"name":"Oleksii Kyslytsia","email":"oleksij.kyslytsja@gmail.com"},"license":"LGPL-3.0-only","homepage":"https://github.com/fr0ster/mcp-abap-adt-auth-broker/tree/main/packages/auth-broker#readme","keywords":["abap","sap","adt","jwt","authentication","token","broker","mcp","abap-adt","xsuaa","oauth2","saml"],"repository":{"url":"git+https://github.com/fr0ster/mcp-abap-adt-auth-broker.git","type":"git","directory":"packages/auth-broker"},"description":"Per-destination credential broker for SAP BTP and ABAP: the IAuthProvider a destination states, built from its key store and session store, with every secret it obtains stored back; and a token API","maintainers":[{"name":"fr0ster","email":"oleksij.kyslytsja@gmail.com"}],"readme":"# @mcp-abap-adt/auth-broker\n[![Stand With Ukraine](https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/badges/StandWithUkraine.svg)](https://stand-with-ukraine.pp.ua)\n\nA per-destination credential broker for SAP BTP and ABAP systems. For a destination — a name,\nsuch as `TRIAL` — `getProvider` builds the `IAuthProvider` the destination states (basic, SNC, a\nUAA, OIDC or SAML grant, or a credential handed over) from the *means* in the service key store\nand the *secret* in the session store, ready for a `@mcp-abap-adt/connection` 10 connector, and\nstores back every token or set of SAML session cookies that provider obtains or renews. The\ntoken API (`getToken`, `refreshToken`, `createTokenRefresher`) serves whoever wants a token and\nnothing else. It decides nothing about tokens itself: whether the cached token is still good,\nwhen to refresh and when to log in is the provider's call (`@mcp-abap-adt/auth-providers`), and\nwhere means and secrets live is the stores' (`@mcp-abap-adt/auth-stores`, or your own).\n\n**Upgrading from 3.x?** See [*Migrating from 3.x*](#migrating-from-3x) — 4.0.0 needs a session\nstore that takes the secret alone (auth-stores 3 or later), means stated in a key store, and\nthe contracts of `interfaces-auth` 3.\n\nThe `mcp-auth` and `mcp-sso` commands that write destination files are in\n[`@mcp-abap-adt/auth-broker-cli`](../auth-broker-cli/README.md) (2.0.0, on this\nversion), in the same repository. Up to 3.0.4 they shipped in this package; from 3.1.0 this package\nhas no `bin`. Install the commands with\n`npm i -g @mcp-abap-adt/auth-broker-cli` — after\n`npm uninstall -g @mcp-abap-adt/auth-broker` if you had installed this one\nglobally for them.\n\n## Features\n\n- 🔌 **A credential for a connector**: `getProvider(destination)` builds the `IAuthProvider` the destination states — basic, SNC, the UAA grants (authorization code, client credentials, passcode), the OIDC grants (authorization code with PKCE, device code, password, token exchange), the SAML grants (session cookies, bearer token), or a credential handed over — from the service key store's means and the session store's secret\n- 💾 **What a provider obtains is stored**: every token or set of SAML session cookies a `getProvider` provider obtains or renews — at `prepare()`, on expiry, or after a 401 in `rejected()` — is written to the session store, the secret alone with what it is bound to; a failed write is retried by the broker, and `flush()` tells you whether everything landed\n- 🔒 **A secret goes only where it was obtained**: a stored token is used only for the resource it was obtained for, from the issuer and client that issued it — otherwise it is discarded and the provider logs in afresh\n- 🎯 **Per destination**: one provider per destination name, shared by `getProvider` and the token API — one token, one refresh token, one renewal in flight\n- 🔄 **Provider-driven token lifecycle**: The provider decides whether its cached token is still good, refreshes it, or logs in; the broker persists what it returns\n- 🪙 **A token API for whoever wants a token and nothing else**: `getToken`, `refreshToken` and `createTokenRefresher` on the destination's own provider, or on one you give the broker, as in 3.x\n- ⚡ **Forced refresh**: `refreshToken()` obtains a new token even when the cached one looks valid — for a caller holding a 401\n- 🧾 **JWT or SAML cookies**: what the provider returns is saved as a token or as session cookies\n- 🔑 **No secrets copied**: The client secret stays in the service key; the session store gets tokens only\n\n## Installation\n\n```bash\nnpm install @mcp-abap-adt/auth-broker\n```\n\nRequires Node.js 22, 24 or 26 (`engines: \"^22 || ^24 || ^26\"`): 22 and 24 are\nthe versions SAP BTP's Cloud Foundry Node.js buildpack offers, and 26 is\nsupported as well.\n\n## Usage\n\n### Basic Usage\n\nThis is the token API with a provider of your own — the 3.x way, which keeps\nworking. The broker takes a session store, an optional service key store, and\na token provider implementing `IRefreshableTokenProvider` (from\n`@mcp-abap-adt/interfaces-auth`) — or a factory that builds one per\ndestination. Without a `provider` the token API serves what the destination\nstates, on the provider `getProvider` builds (see *Getting Tokens*); for a\n`@mcp-abap-adt/connection` 10 connector, use `getProvider` itself.\n\n```typescript\nimport { AuthBroker } from '@mcp-abap-adt/auth-broker';\nimport {\n  AbapServiceKeyStore,\n  AbapSessionStore,\n} from '@mcp-abap-adt/auth-stores';\nimport {\n  AuthorizationCodeProvider,\n  browserCallbackStrategy,\n} from '@mcp-abap-adt/auth-providers';\n\nconst broker = new AuthBroker(\n  {\n    sessionStore: new AbapSessionStore('/path/to/sessions'),\n    serviceKeyStore: new AbapServiceKeyStore('/path/to/keys'), // optional\n    // Called once per destination, seeded with what the stores hold.\n    provider: (destination, authConfig, connConfig) => {\n      if (!authConfig) throw new Error(`No UAA credentials for ${destination}`);\n      return new AuthorizationCodeProvider({\n        uaaUrl: authConfig.uaaUrl,\n        clientId: authConfig.uaaClientId,\n        clientSecret: authConfig.uaaClientSecret,\n        refreshToken: authConfig.refreshToken, // stored by an earlier login\n        accessToken: connConfig.authorizationToken, // reused while valid\n        authorization: browserCallbackStrategy({ browser: 'system' }),\n      });\n    },\n  },\n  logger, // optional ILogger\n);\n\nconst token = await broker.getToken('TRIAL');\n```\n\nThe factory receives:\n\n- `authConfig` — the UAA credentials: the session's own when it holds them,\n  else the service key's; carrying the refresh token the session stored.\n  `null` when no store has credentials (a SAML flow needs none).\n- `connConfig` — the session's connection config, with `serviceUrl` resolved\n  (from the session, else the service key) and the token stored last.\n\nThese are 3.x's reads, in 3.x's order, kept for this path: a session store\nthat still answers a client or a URL is read first. auth-stores 3's session\nstores answer neither, so the key store's are what is found. What the broker\nwrites back is the session secret alone (see *Getting Tokens*).\n\nA provider instance can be passed instead of a factory; it is then used as\ngiven, for every destination, and the broker seeds it with nothing:\n\n```typescript\nconst broker = new AuthBroker({\n  sessionStore: new AbapSessionStore('/path/to/sessions'),\n  provider: new AuthorizationCodeProvider({\n    uaaUrl, clientId, clientSecret,\n    authorization: browserCallbackStrategy({ browser: 'system' }),\n  }),\n});\n```\n\n> `AuthorizationCodeProvider` and the other `@mcp-abap-adt/auth-providers` 5\n> providers implement `IRefreshableTokenProvider` (from `@mcp-abap-adt/interfaces-auth`\n> 3). Since auth-providers 5 the interactive ones take their `authorization`\n> strategy explicitly — none is built for you.\n\n### A Provider for a Connector: `getProvider`\n\n`getProvider(destination)` returns the `IAuthProvider` (from\n`@mcp-abap-adt/interfaces-auth` 3) that a `@mcp-abap-adt/connection` 10\nconnector takes as it is. The destination states which provider it gets; the\nbroker reads two stores, each for one role:\n\n- **the means** — `authType`, `grantType`, basic's user and password, the SNC,\n  OIDC and SAML fields, `serviceUrl`, the client — from the **service key store**\n  (`getConnectionConfig`), and only from there;\n- **the secret** — the token or session cookies, `expiresAt`, the refresh\n  token — from the **session store** (`loadSession`), and only from there.\n\nMeans a session store happens to answer are not read, and neither is a token\nor cookies a key store happens to answer. Nothing is inferred: the\ndestination's `authType` (and `grantType`, for `jwt` and `saml`) decides the\nprovider, never which other fields are present.\n\n```typescript\nimport { AuthBroker } from '@mcp-abap-adt/auth-broker';\n\nconst broker = new AuthBroker({\n  serviceKeyStore: myKeyStore, // the means — required by getProvider\n  sessionStore: mySessionStore, // the secret\n  // no `provider`: that option is the token API's source, not getProvider's\n});\n\nconst provider = await broker.getProvider('DEV'); // an IAuthProvider\n// const connection = createAbapConnection({ url, provider }, logger) …\n```\n\n| `authType` / `grantType` | Provider (auth-providers 5.2) | Read from the key store | Read from the session store |\n|---|---|---|---|\n| `basic` (no grant read) | `new BasicAuthProvider(username, password)` | `username`, `password` | nothing |\n| `snc` (no grant read) | `SncLogonProvider.forSecureLoginClient({ partnerName, qop, sncLib, myName, logger })` | `sncPartnerName` (required); `sncQop`, `sncLib`, `sncMyName` when set | nothing |\n| `jwt` / `authorization_code` | `AuthorizationCodeProvider` | the client: `uaaUrl`, `uaaClientId`, `uaaClientSecret`; `serviceUrl`, `sapClient` for the binding | the seed: `authorizationToken`, `refreshToken`, `expiresAt` — used only when `issuedFor` and `issuedBy` match |\n| `jwt` / `client_credentials` | `ClientCredentialsProvider` | the client: `uaaUrl`, `uaaClientId`, `uaaClientSecret`; `serviceUrl`, `sapClient` for the binding | nothing (the row takes the client alone) |\n| `jwt` / `passcode` | `UaaPasscodeProvider` | the client: `uaaUrl`, `uaaClientId`, `uaaClientSecret` (`''` = a public client); `serviceUrl`, `sapClient` for the binding | the seed: `authorizationToken`, `refreshToken`, `expiresAt` — used only when `issuedFor` and `issuedBy` match |\n| `jwt` / `oidc_authorization_code` | `OidcBrowserProvider` (PKCE) | `uaaClientId`, `uaaClientSecret` (`''` = a public client); `oidcIssuerUrl`, or `oidcAuthorizationEndpoint` + `oidcTokenEndpoint`; `oidcScopes`; `serviceUrl`, `sapClient` for the binding | the seed — used only when `issuedFor` and `issuedBy` match |\n| `jwt` / `device_code` | `OidcDeviceFlowProvider` | the client as above; `oidcIssuerUrl`, or `oidcDeviceAuthorizationEndpoint` + `oidcTokenEndpoint`; `oidcScopes`; `serviceUrl`, `sapClient` | the seed, as above |\n| `jwt` / `password` | `OidcPasswordProvider` | the client as above; `username`, `password`; `oidcIssuerUrl`, or `oidcTokenEndpoint`; `oidcScopes`; `serviceUrl`, `sapClient` | the seed, as above |\n| `jwt` / `token_exchange` | `OidcTokenExchangeProvider` (RFC 8693) | the client as above; `oidcSubjectToken`, `oidcSubjectTokenType`; `oidcAudience`, `oidcActorToken`, `oidcActorTokenType` when set; `oidcScopes`, joined by one space into its `scope`; `oidcIssuerUrl`, or `oidcTokenEndpoint`; `serviceUrl`, `sapClient` | the seed, as above (it has no refresh grant: a renewal exchanges again) |\n| `saml` / `saml2_pure` | `Saml2PureProvider` | `samlIdpSsoUrl`, `samlSpEntityId`, `samlIdpEntityId` (the expected issuer), `samlIdpCertificates`; `samlAcsUrl`, `samlRelayState`, `samlIdpInitiated`, `samlClockSkewMs` when set; `serviceUrl`, `sapClient` for the binding | the seed: `sessionCookies`, `expiresAt` — used only when `issuedFor` and `issuedBy` match |\n| `saml` / `saml2_bearer` | `Saml2BearerProvider` (RFC 7522) | the same SAML fields; `samlTokenUrl` when set; the client: `uaaUrl`, `uaaClientId`, `uaaClientSecret` (`''` = a public client); `serviceUrl`, `sapClient` | the seed: `authorizationToken`, `refreshToken`, `expiresAt` — used only when `issuedFor` and `issuedBy` match |\n| `jwt` / `none` | `TokenAuthProvider.fixed(authorizationToken)` | `authType`, `grantType`, `serviceUrl` (+ `sapClient`); an issuer, when stated: `oidcIssuerUrl`, or the client's `uaaUrl` + `uaaClientId` | `authorizationToken` (required), `issuedFor` (required to match); `issuedBy` when the means state an issuer |\n| `saml` / `none` | `new SamlAuthProvider(sessionCookies)` | `authType`, `grantType`, `serviceUrl` (+ `sapClient`); `samlAcsUrl` when stated | `sessionCookies` (required), `issuedFor` (required to match); `issuedBy` when `samlAcsUrl` is stated |\n\n**No provider reads `serviceUrl`.** The URL of the system is where the\nconnector connects, not authorization data: no token provider reads it — a\nUAA grant needs the client and `uaaUrl` — so `getProvider` neither requires it\nnor passes it to a provider. Give the connector its URL from your key store\n(`getConnectionConfig`), as the key store answers it. The broker reads it,\nwith `sapClient`, for one thing only: to bind a stored secret to the resource\nit was obtained for (see *A Secret Is Bound to Its Resource and Issuer*). A\ntoken destination without it still gets its provider, but no stored secret\nis reused for it.\n\n`none` is how a handed-over credential is stated: the key store says\n`grantType: 'none'`, and the token or cookies live in the session. The SNC\nrow takes the contract's own defaults when a field is absent — the library is\ndiscovered (`SNC_LIB_64`, `SNC_LIB`, the Secure Login Client's install path)\nwhen `sncLib` is, the user's SNC name comes from the credential when\n`sncMyName` is, and `qop` is the provider's `'9'` when `sncQop` is.\n\nThe allowed pairs are `jwt` with `authorization_code`, `client_credentials`,\n`passcode`, `oidc_authorization_code`, `device_code`, `password`,\n`token_exchange` or `none`, and `saml` with `saml2_pure`, `saml2_bearer` or\n`none`. A pair outside them is a `DestinationConfigError` naming `grantType`.\n\n**The UAA grants.** The client comes from the key store's\n`getAuthorizationConfig` — never from the session store. A session is the\nseed: the stored token is presented while it is valid (a JWT's own `exp`\ndecides; the stored `expiresAt` serves a token that carries none), and the\nstored refresh token renews it. Without a session the provider is built\nunseeded and obtains its first token at `prepare()`. `uaaClientSecret: ''` is\na public client: `passcode` takes it as no secret; `AuthorizationCodeProvider`\nand `ClientCredentialsProvider` require a secret, so for them `''` is missing.\n\n**The `authorization` option** is the interactive half of\n`authorization_code` and `passcode`: a function of the destination and the\ngrant, returning the `IAuthorizationStrategy<string>` the provider logs in\nwith. The broker calls it once, when it builds that destination's provider,\nand never disposes what it returns — whoever constructs, disposes. For\n`passcode` the strategy is handed `<uaaUrl>/passcode` as the URL to send the\nuser to, and returns the code. There is no default: a destination whose grant\nneeds it, without it, is a `DestinationConfigError` naming `authorization`.\nA headless process passes one that refuses (see *Headless Processes*).\n\n```typescript\nimport { browserCallbackStrategy, manualPasscodeStrategy } from '@mcp-abap-adt/auth-providers';\n\nconst broker = new AuthBroker({\n  serviceKeyStore: myKeyStore,\n  sessionStore: mySessionStore,\n  authorization: (destination, grant) =>\n    grant === 'passcode'\n      ? manualPasscodeStrategy({ timeoutMs: 300_000 })\n      : browserCallbackStrategy({ timeoutMs: 120_000 }),\n});\n```\n\n**The OIDC grants.** The client is the key store's `getAuthorizationConfig`\nagain: `uaaClientId`, and `uaaClientSecret` — `''` is a public client, sent\nwith no secret. (A key store answers a client when it holds one: from\nauth-stores 3.2.0, `EnvDestinationStore` answers one whenever `uaaClientId`\nis stated, a missing `uaaUrl` or secret as `''` — so an OIDC destination\nstates its issuer in `oidcIssuerUrl` alone, and a public client no secret.)\nThe endpoints come from `oidcIssuerUrl`, which the provider discovers them\nfrom, or — without it — from every explicit endpoint the row reads\n(`oidcAuthorizationEndpoint`, `oidcDeviceAuthorizationEndpoint`,\n`oidcTokenEndpoint`); without either the error names `oidcIssuerUrl` and the\nendpoints missing. `oidcScopes` is passed as given (`token_exchange` takes\none `scope` string: the scopes joined by a space). The subject and actor\ntokens of `token_exchange` and the user and password of `password` are\nmeans: sent to the token endpoint, never written to the session.\n\n**The SAML grants.** Each provider validates the assertion before anything\nuses it, with a validator the broker composes from the destination's trust\nand your replay store: `createSignedResponseValidator` for `saml2_pure` (the\nResponse must be signed — the cookies' system receives it whole) and\n`createSignedAssertionValidator` for `saml2_bearer` (the Assertion must be\nsigned — the token endpoint receives it alone), from `samlIdpCertificates`\n(PEM or base64 DER; several during a rotation), `samlClockSkewMs` and\n`assertionReplayStore(destination)`; `samlIdpEntityId` is the issuer every\nassertion must name. A certificate the validator cannot read, or a\n`samlClockSkewMs` that is not a whole, non-negative number of milliseconds,\nis a `DestinationConfigError` naming the field. `samlIdpInitiated: true`\ndeclares an IdP-initiated login: no AuthnRequest, and an assertion carrying\nno `InResponseTo` — your strategy then hands over the SAMLResponse without\nasking for an authorization URL (a strategy that asks gets Oops from\n`prepare()`). `saml2_pure` is seeded with the stored cookies and their\n`expiresAt` — cookies carry no expiry of their own, so the provider keeps them\nuntil the assertion's earliest `NotOnOrAfter` (less the provider's one-minute\nmargin: an identity provider whose assertions live a minute or less makes\nevery request a login); SAML has no refresh token, so a renewal is a new\nlogin through your strategy. `saml2_bearer` posts the Assertion to\n`samlTokenUrl`, else `<uaaUrl>/oauth/token`, with the client, and renews by\nits refresh token.\n\n**The collaborator options** — each a function of the destination, called\nonce when that destination's provider is built, never disposed by the\nbroker, and required only by the rows that use it; a row whose option is\nmissing is a `DestinationConfigError` naming it:\n\n| Option | Rows | What it returns |\n|---|---|---|\n| `authorization(destination, grant)` | `authorization_code`, `passcode`, `saml2_pure`, `saml2_bearer` (the grant is passed) | the `IAuthorizationStrategy<string>` that conducts the login — for the SAML grants, the one that returns the SAMLResponse (`samlCallbackStrategy`, `manualSamlResponseStrategy`, …) |\n| `oidcAuthorization(destination)` | `oidc_authorization_code` | an `IAuthorizationStrategy<OidcCallbackResult>` (`oidcCallbackStrategy`, or `asOidcResult(…)` over a string strategy) |\n| `deviceCodePresenter(destination)` | `device_code` | an `IDeviceCodePresenter` that shows the user the verification URL and code (`consoleDeviceCodePresenter(logger)`, or your UI) |\n| `samlCookies(destination)` | `saml2_pure` | `(samlResponse) => Promise<string>`: posts the validated SAMLResponse to the system's ACS and returns the session cookies it sets |\n| `assertionReplayStore(destination)` | `saml2_pure`, `saml2_bearer` | the `IAssertionReplayStore` the validator records each assertion in, refusing one presented twice — `defaultReplayStore` (process-wide, in memory) or a shared one of yours |\n\n```typescript\nimport {\n  consoleDeviceCodePresenter,\n  defaultReplayStore,\n  oidcCallbackStrategy,\n  samlCallbackStrategy,\n} from '@mcp-abap-adt/auth-providers';\n\nconst broker = new AuthBroker(\n  {\n    serviceKeyStore: myKeyStore,\n    sessionStore: mySessionStore,\n    authorization: (destination, grant) =>\n      grant === 'saml2_pure' || grant === 'saml2_bearer'\n        ? samlCallbackStrategy({ timeoutMs: 120_000 })\n        : browserCallbackStrategy({ timeoutMs: 120_000 }),\n    oidcAuthorization: () => oidcCallbackStrategy({ timeoutMs: 120_000 }),\n    deviceCodePresenter: () => consoleDeviceCodePresenter(logger),\n    samlCookies: (destination) => (samlResponse) =>\n      postToAcs(destination, samlResponse), // yours: the system's ACS answers Set-Cookie\n    assertionReplayStore: () => defaultReplayStore,\n  },\n  logger,\n);\n```\n\n### A Secret Is Bound to Its Resource and Issuer\n\nA token's audience, cookies' host and path, a system's client: presenting a\nsecret to a resource it was not obtained for is a leak, and a secret from\nanother authorization server or client must not stand in for this\ndestination's. So the session store keeps, beside the secret, two strings\n(`IConnectionConfig`, `@mcp-abap-adt/interfaces-auth-broker` 1.1.0):\n\n- **`issuedFor`** — the resource: `serviceUrl` with the SAP client, e.g.\n  `https://my-abap.example.com:443/sap/bc/adt?sap-client=100`;\n- **`issuedBy`** — who issued it, to which client: `uaaUrl` with\n  `client_id=<uaaClientId>` for the UAA grants and `saml2_bearer`, e.g.\n  `https://sub.authentication.us10.hana.ondemand.com:443?client_id=sb-abap-trial`;\n  `oidcIssuerUrl` — else `uaaUrl` — with `client_id=<uaaClientId>` for the\n  OIDC grants; for `saml2_pure`'s cookies, the ACS of the system that set\n  them: `samlAcsUrl`, origin and path.\n\nThe broker computes both from the destination's means and compares them,\ncanonicalised on **both** sides, with what the session holds:\n\n- **The canonical form:** scheme and host lower-cased; the port explicit\n  (`443` for `https`, `80` for `http`); the path without a trailing `/` (the\n  root path is empty); one query parameter at most — `sap-client` (the means'\n  `sapClient` wins over a `sap-client` already in `serviceUrl`) or\n  `client_id` — parsed and re-encoded, so a value percent-encoded on one side\n  and plain on the other compares equal; no user info, no other parameter,\n  no fragment. A URL that does not parse binds nothing. A store keeps the\n  strings as given and need not canonicalise them.\n- **The grants that obtain a secret** (UAA, OIDC, SAML)**:** a stored secret seeds the provider only when **both**\n  stored values equal the computed ones. Otherwise — either different, or\n  absent on either side (no `serviceUrl` in the means, an OIDC destination\n  stating neither `oidcIssuerUrl` nor `uaaUrl`, a `saml2_pure` one without\n  `samlAcsUrl`, a session written without them) — the secret is not used,\n  **refresh token included**: the\n  provider is built as with no session and logs in afresh by its grant, and\n  the log says only `<destination>: secret bound to another resource,\n  discarded` — never a URI, never a token. The new secret is written with\n  both fields.\n- **The `none` rows** present a credential the broker cannot obtain again, so\n  a mismatch is refused, not discarded: a `DestinationConfigError` naming\n  `issuedFor` when the stored resource differs or is absent (or the means\n  state no `serviceUrl`), and naming `issuedBy` when the means state an issuer\n  (`oidcIssuerUrl` or the client for `jwt`, `samlAcsUrl` for `saml` — then\n  canonicalised as origin and path) and the stored one differs or is absent.\n  Means that state no issuer leave `issuedBy` uncompared.\n- **The binding does not check the token.** Its audience stays the\n  resource's to enforce; the broker compares two strings and parses no token.\n- **`bindingOf(means, client?)` — for a consumer that hands over a\n  credential.** A `none` destination presents a token or cookies the broker\n  cannot obtain; whoever writes them to the session store must write the\n  binding beside them. `bindingOf` answers exactly what the broker computes for\n  those means — the one function `getProvider` checks against and `persist`\n  writes (`issuedFor` from `serviceUrl` + `sapClient`, `issuedBy` from the\n  issuer, client or ACS the grant uses) — so a consumer never canonicalises a\n  URI itself:\n\n  ```typescript\n  const means = await keyStore.getConnectionConfig('DEV'); // saml / none\n  await sessionStore.saveSession('DEV', {\n    sessionCookies: cookies,\n    ...bindingOf(means ?? {}), // { issuedFor: 'https://dev.example.com:443?sap-client=100' }\n  });\n  ```\n\n  A destination that states no `jwt` / `saml` type or no grant binds nothing\n  (`{}`). `mcp-sso … --cookie` writes its cookies this way.\n\n**What you meet:**\n\n1. **A custom `ISessionStore`** (a database, a message log, a secret store)\n   must persist `issuedFor` and `issuedBy` beside the secret, and answer\n   them from `loadSession`. One that drops them still type-checks, but the\n   broker then never reuses its sessions: every process start is a fresh\n   login — a browser each time for an interactive grant.\n2. **A headless process whose strategy refuses logins** gets Oops (\"login\n   required\") from `prepare()` / `rejected()` on a mismatch, instead of\n   presenting a foreign secret; log in again with the CLI.\n3. **Changing a destination's URL, SAP client, UAA or client** costs one\n   fresh login — intended.\n4. **Session files written before auth-stores 3.1.0** keep working: its\n   session stores answer `issuedFor` from the file's `SAP_URL` (+\n   `SAP_CLIENT`) and `issuedBy` from `SAP_UAA_URL` + `SAP_UAA_CLIENT_ID`,\n   which the 3.x broker and CLI wrote with the token — so a stored token whose\n   URL and client are the destination's is reused. XSUAA sessions written with\n   an empty URL have no `issuedFor`, and log in once.\n\n**One provider per destination** for the broker's life, shared with the token\nAPI when the broker has no `provider` option (see *Getting Tokens*):\nconcurrent first calls share one build, and a build that threw is tried again\non the next call. A destination rewritten from outside is picked up by a new\nbroker.\n\n### Persistence and `flush()`\n\nEvery token provider `getProvider` builds writes what it obtains back to the\nsession store, through its `onTokens` hook, before it answers — whichever\nmoment triggered the renewal: `prepare()`, `authorize()` on expiry, or\n`rejected()` after a 401. A renewal inside a connector is stored before the\nconnector resends.\n\n- **The secret alone, with its binding, in one write**:\n  `saveSession(destination, { authorizationToken, expiresAt, refreshToken,\n  issuedFor, issuedBy })` — or, for `saml2_pure`'s cookies (a result of\n  `tokenType: 'saml'`), `{ sessionCookies, expiresAt, issuedFor, issuedBy }`,\n  with no refresh token: SAML has none. `saml2_bearer`'s result is a token\n  and is written as one — `issuedFor` / `issuedBy` as computed when the\n  provider was built, each left out when the means lack its source (so the\n  store clears it). No means is ever written — not `serviceUrl`, not\n  `authType`, not the client: the client secret lives in the key store, and\n  the broker never writes the key store (its contract has no write method).\n  `expiresAt` is the result's, else the `expires_in` it reported counted from\n  when it arrived. A result without a refresh token keeps the one the session\n  holds — when that one is bound where the new secret is; one bound to\n  another resource or issuer is not carried into it.\n- **`basic` and `snc` are never written**: they obtain no session secret, and\n  `none` obtains nothing either. A destination the key store states as\n  `basic` or `snc` at write time is not written.\n- **The token API writes through the same path** (see *Getting Tokens*):\n  with a `provider` of yours, every answer it gets is written as above — the\n  stored refresh token carried forward whatever its binding, as your provider\n  was seeded with it.\n- **A failed write does not fail the authentication.** The connector goes on\n  with the token it holds; the broker keeps the result pending for that\n  destination and retries on its own — one second, doubling, capped at one\n  minute — on a timer that never keeps the process alive. A newer result\n  replaces the pending one; writes for one destination never overlap. Each\n  failure is logged by its class name, never its message. The token API's\n  caller still gets the failure: `getToken()` / `refreshToken()` throw the\n  store's error for the token they received, while the retry goes on.\n- **`flush()`** gives every pending write one more attempt, resolves when all\n  have landed, and rejects (an `AggregateError` naming the destinations; each\n  of its `errors` is `\"<destination>\": <error class>` — never the store's own\n  message, which may quote what was being written) when the store still\n  refuses — the broker keeps retrying.\n  Call it on shutdown — on `SIGTERM`, before a stdio transport closes — to\n  know whether every token is stored.\n\n```typescript\nprocess.on('SIGTERM', async () => {\n  try {\n    await broker.flush();\n  } catch (error) {\n    logger.error(`Tokens not stored: ${(error as Error).message}`);\n  }\n  process.exit(0);\n});\n```\n\n**A destination that lacks what its type needs** is a `DestinationConfigError`\n(see *Error Handling*), thrown by `getProvider` before any provider exists —\nnever a provider built only to refuse in `prepare()`.\n\n### Headless Processes (No Browser)\n\nWhether a login may open a browser is the provider's authorization strategy,\nnot a broker option. A process nobody is watching (an MCP server on stdio, a\nCI job) gives the provider a strategy that refuses, and catches its own error —\nthe broker hands it back unchanged:\n\n```typescript\nclass LoginRequiredError extends Error {}\n\nconst provider = new AuthorizationCodeProvider({\n  uaaUrl, clientId, clientSecret, refreshToken,\n  authorization: {\n    authorize: async () => {\n      throw new LoginRequiredError('Run mcp-auth to log in');\n    },\n  },\n});\n\ntry {\n  await broker.getToken('TRIAL');\n} catch (error) {\n  if (error instanceof LoginRequiredError) {\n    // No usable token or refresh token: a person has to log in.\n  }\n}\n```\n\nA cached token that is still valid, or a refresh token the UAA accepts, never\nreaches the strategy.\n\nWith `getProvider` the same holds for every collaborator option: give the\nbroker an `authorization` / `oidcAuthorization` that refuses, and a\n`deviceCodePresenter` that routes the code to wherever a person can see it —\nor refuses. The provider then runs on its stored secret and refresh token;\nwhen a login is needed, `prepare()` / `rejected()` answer Oops — whose\nrefusal carries fixed wording, never the message of what your collaborator\nthrew — and nothing is written:\n\n```typescript\nconst refuseLogin = {\n  authorize: async () => {\n    throw new LoginRequiredError('Run mcp-auth to log in');\n  },\n};\n\nconst broker = new AuthBroker({\n  serviceKeyStore: myKeyStore,\n  sessionStore: mySessionStore,\n  authorization: () => refuseLogin,\n  oidcAuthorization: () => refuseLogin,\n  deviceCodePresenter: () => ({\n    present: async () => {\n      throw new LoginRequiredError('No one to show a device code to');\n    },\n  }),\n});\n```\n\n### Custom Browser Auth Port\n\nHow a login is conducted — including which port the local OAuth2 callback\nlistens on — is an `IAuthorizationStrategy` passed as `authorization`, not a\nfield on the provider config. `browserCallbackStrategy` from\n`@mcp-abap-adt/auth-providers` builds the ready-made one; its default port is\n`61001`, chosen to sit well clear of the range application servers and\nproxies typically use (e.g. `3001`/`3333`). Pass `port` to avoid conflicts\nwith a specific redirect URI registered at the identity provider:\n\n```typescript\nnew AuthorizationCodeProvider({\n  uaaUrl, clientId, clientSecret,\n  authorization: browserCallbackStrategy({ browser: 'system', port: 4001 }),\n});\n```\n\n### Getting Tokens\n\n```typescript\n// The provider's current token: cached while valid, else refreshed or logged in.\nconst token = await broker.getToken('TRIAL');\n\n// A new token, never the cached one — after the server refused the token (401).\nconst newToken = await broker.refreshToken('TRIAL');\n```\n\n**Which provider answers.**\n\n- **No `provider` option** — the destination's own: the very provider\n  `getProvider('TRIAL')` hands out, from the same per-destination cache. A\n  connector and the token API in one process therefore share one token, one\n  refresh token and one renewal: a `refreshToken()` while the connector renews\n  in `rejected()` joins that renewal, and a token the connector renewed is\n  what `getToken()` answers next. The destination must state a grant that\n  obtains a token — every grant but `none` (see the table under *A Provider\n  for a Connector*); a `none` destination is a `DestinationConfigError`\n  naming `provider`, before any provider is built.\n- **A `provider` option** — yours, as in 3.x (see *Basic Usage*): the factory\n  is called once per destination (concurrent first calls build once; a call\n  after one that threw builds again), an instance serves every destination.\n\n**What is written.** The session secret alone, in one `saveSession` — the\ntoken, or the cookies of a SAML result (`tokenType: 'saml'`), its\n`expiresAt`, the refresh token (the stored one carried forward when the\nresult has none), and what the secret is bound to (`issuedFor`, `issuedBy`,\nsee *A Secret Is Bound to Its Resource and Issuer*). Never `serviceUrl`,\n`authType` or a client: they are means, and live in the key store.\n\n- Without a `provider`, the token API writes nothing itself: the provider's\n  `onTokens` writes every token it obtains (see *Persistence and `flush()`*),\n  and a cache hit writes nothing.\n- With a `provider`, the token API writes after every answer, cache hits\n  included, through the same write path. `issuedFor` is the `serviceUrl` it\n  resolved, with the SAP client; `issuedBy` the client a factory was handed —\n  an instance is handed none, so what it obtains is bound to no issuer and\n  `getProvider` never seeds from it. Both are fixed when your provider is\n  built for the destination (an instance: at its first call for it) and kept\n  with it: a URL or client changed later never re-labels a token that\n  provider obtained — a new broker picks the change up.\n\n**A write that fails** reaches the caller: `getToken()` / `refreshToken()`\nthrow the store's error, as raised, for the token they received — and the\nbroker keeps retrying that write on its own; `flush()` tells you when it\nlanded.\n\n**A destination stated `basic` or `snc` has no token API.** The token API\nreads the destination's `authType` from the key store first and, for `basic`\nor `snc`, throws `DestinationConfigError` naming `authType` before any provider\nis asked — a token written over such a session would replace a credential\nthat is not one. A key store that states no `authType` (a 3.x setup), or no\nkey store, is served as before.\n\n**Two token sources, with a `provider` option.** `getProvider` never uses\nthe `provider` option: the destination states its own provider. A process\nthat gives the broker a `provider` and also calls `getProvider` for the same\ndestination has two token sources for it — each with its own token and\nrenewal, both writing to the same session. Use one of them per destination;\nor, to hand your own provider to a connector, wrap the token API:\n`TokenAuthProvider.from(broker.createTokenRefresher('TRIAL'))`\n(`@mcp-abap-adt/auth-providers`), whose every renewal the token API writes.\n\n### Creating Token Refresher for DI\n\n`createTokenRefresher(destination)` returns an `ITokenRefresher` (from\n`@mcp-abap-adt/interfaces-auth`) bound to one destination — `getToken()` is\n`broker.getToken(destination)`, `refreshToken()` is\n`broker.refreshToken(destination)` — for a connection of your own that asks\nfor a token per request and for a new one after a 401. It is unchanged since\n3.x and not deprecated: calm-server injects it into its own connection.\n\n```typescript\nconst tokenRefresher = broker.createTokenRefresher('TRIAL');\n\n// In your own connection:\nconst token = await tokenRefresher.getToken();\n// …the server answered 401:\nconst newToken = await tokenRefresher.refreshToken();\n```\n\nA `@mcp-abap-adt/connection` 10 connector takes an `IAuthProvider` instead:\ngive it `await broker.getProvider('TRIAL')`.\n\n## Migrating from 3.x\n\n4.0.0 is a major: what a 3.x consumer must do, in short (the full list is the\n[CHANGELOG](CHANGELOG.md)'s 4.0.0 entry).\n\n1. **Session store: `@mcp-abap-adt/auth-stores` 3 or later** (`^3.1.0` for\n   the binding), or one of your own on the\n   `@mcp-abap-adt/interfaces-auth-broker` contract. The broker writes the\n   secret alone — token or cookies, `expiresAt`, refresh token, `issuedFor`,\n   `issuedBy` — and auth-stores 1.x/2.x's session stores refuse such a write\n   (their `AbapSessionStore` throws without `serviceUrl`): they are not\n   supported. A custom store must keep `issuedFor` and `issuedBy`.\n2. **State the means in a key store**, not in the session: `authType`, and\n   for `jwt` / `saml` a `grantType`; the client; the URL. For a SAP service\n   key, `new AbapServiceKeyStore(dir, { grantType: 'authorization_code' })`\n   (or `XsuaaServiceKeyStore`); otherwise `EnvDestinationStore(dir, {\n   fallback })`. A 3.x session file is a readable destination as it is once\n   it states `SAP_AUTH_TYPE` (and `SAP_GRANT_TYPE` for `jwt` / `saml`).\n3. **A connector of `@mcp-abap-adt/connection` 10** takes `await\n   broker.getProvider(destination)` — no `getToken` before connecting, no\n   token refresher. Give the broker the collaborators its grants need\n   (`authorization`, `oidcAuthorization`, `deviceCodePresenter`,\n   `samlCookies`, `assertionReplayStore`); there is no default.\n4. **The token API** keeps its calls, signatures and 3.x reads with a\n   `provider` of yours; it writes the secret alone, refuses a destination\n   stated `basic` or `snc`, and throws a failed write while the broker retries\n   it.\n5. **`getConnectionConfig` / `getAuthorizationConfig`** compose the key\n   store's means with the session's secret; a URL or client kept only in the\n   session store is not found any more.\n6. **New:** catch `DestinationConfigError`; call `flush()` on shutdown;\n   write `bindingOf(means)` beside a credential you hand over yourself.\n7. **Contracts:** `interfaces-auth` 3, `interfaces-auth-sap` 2,\n   `interfaces-auth-broker` 1.1 (the store contracts moved there from\n   `interfaces-auth-sap`), auth-providers 5. The commands are\n   `@mcp-abap-adt/auth-broker-cli` 2.0.0.\n\n## Migrating from 2.2.0\n\n1. `tokenProvider` is now `provider`, and the `browser` argument is gone:\n   `new AuthBroker({ sessionStore, serviceKeyStore, tokenProvider }, 'system', logger)`\n   becomes `new AuthBroker({ sessionStore, serviceKeyStore, provider }, logger)`.\n2. The provider must implement `IRefreshableTokenProvider` (`refreshTokens()`,\n   a new token, never the cached one) — `@mcp-abap-adt/auth-providers` 4.2.0\n   providers do. Pass a factory instead of an instance to have the broker seed\n   it with the stored refresh token and token.\n3. `allowBrowserAuth: false` and `BROWSER_AUTH_REQUIRED` are gone: give the\n   provider an authorization strategy that refuses and catch your own error\n   (see *Headless Processes*). A browser login that fails — timeout, the\n   identity provider's refusal, a busy callback port — is auth-providers'\n   `BrowserAuthError` (from 4.2.0).\n4. Provider errors arrive unchanged: match on the class or `code`, not on the\n   old `Token provider … error for <destination>` messages.\n5. The broker no longer writes the client secret into the session store. Read\n   it from the service key store if you relied on finding it in the session.\n6. `refreshToken()` now forces a new token; it used to return `getToken()`'s.\n7. Node.js 22, 24 or 26; SAML runs need the IdP trust (see *Migrating `mcp-sso`\n   SAML runs from 2.2.0* in the [CLI's README](../auth-broker-cli/README.md)).\n\n## Configuration\n\n### Environment Variables\n\nThe library reads no environment variable: the stores take their directories\nfrom their constructors, and the providers their settings from the\ndestination's means and the collaborators you give the broker. (In the\nrepository's test suites, `DEBUG_BROKER=true` — or `DEBUG_AUTH_BROKER=true`,\n`DEBUG=broker` — turns on the test logger, its level from `AUTH_LOG_LEVEL`.)\n\n### Logging\n\nPass an `ILogger` as the constructor's second argument (for instance\n`DefaultLogger` from `@mcp-abap-adt/logger`); without one, nothing is logged.\n\n**What is logged:** the broker's initialization (whether a key store is\ngiven; the `provider` option: `none`, `factory` or `instance`), each provider build (the destination's `authType` and grant, whether\nit was seeded), each session secret saved (token or cookies, whether a\nrefresh token came back, the expiry), a stored secret discarded because it is\nbound elsewhere (the destination only), and each failed write with the error's\nclass name.\n\n**What is never logged:** any part of a token, refresh token, password or\nsecret — not a prefix, not a suffix — nor a store error's message, which may\nquote what was being written.\n\nWith `DefaultLogger` at `info`:\n\n```\n[INFO] ℹ️ [AuthBroker] Session secret saved for TRIAL\n{\"credential\":\"token\",\"hasRefreshToken\":true,\"expiresAt\":1790000000000}\n```\n\n### File Structure\n\nWith `@mcp-abap-adt/auth-stores` 3 one `<destination>.env` file can hold a\ndestination whole, each store reading and writing only its own keys — the\nmeans through `EnvDestinationStore`, the secret through `AbapSessionStore`\n(or both in separate directories, as you compose them):\n\n```env\n# The means — EnvDestinationStore (ABAP_DESTINATION_VARS); the broker never writes them\nSAP_URL=https://your-system.abap.us10.hana.ondemand.com\nSAP_CLIENT=100\nSAP_AUTH_TYPE=jwt\nSAP_GRANT_TYPE=authorization_code\nSAP_UAA_URL=https://your-account.authentication.us10.hana.ondemand.com\nSAP_UAA_CLIENT_ID=client_id\nSAP_UAA_CLIENT_SECRET=client_secret\n\n# The secret — AbapSessionStore (ABAP_SESSION_VARS); what the broker writes\nSAP_JWT_TOKEN=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...\nSAP_EXPIRES_AT=1790000000000\nSAP_REFRESH_TOKEN=refresh_token_string\nSAP_ISSUED_FOR=https://your-system.abap.us10.hana.ondemand.com:443?sap-client=100\nSAP_ISSUED_BY=https://your-account.authentication.us10.hana.ondemand.com:443?client_id=client_id\n```\n\nSAML cookies are `SAP_SESSION_COOKIES_B64` in place of `SAP_JWT_TOKEN`. The\nXSUAA stores use the same names with `XSUAA_` (`XSUAA_DESTINATION_VARS`,\n`XSUAA_SESSION_VARS`; the URL is `XSUAA_MCP_URL`). Every means key\n(`SAP_USERNAME`, `SAP_SNC_*`, `SAP_OIDC_*`, `SAP_SAML_*`, …) is listed in\n[USAGE.md](../../docs/using/USAGE.md#environment-variables).\n\n#### Service Key File (`{destination}.json`)\n\nA SAP service key, read by `AbapServiceKeyStore` (an ABAP environment key:\nthe client and the ABAP URL) or `XsuaaServiceKeyStore` (an XSUAA key: the\nclient). A key cannot state which grant the destination uses, so the store is\ntold: `new AbapServiceKeyStore(dir, { grantType: 'authorization_code' })`.\n\n```json\n{\n  \"url\": \"https://your-system.abap.us10.hana.ondemand.com\",\n  \"uaa\": {\n    \"url\": \"https://your-account.authentication.us10.hana.ondemand.com\",\n    \"clientid\": \"your_client_id\",\n    \"clientsecret\": \"your_client_secret\"\n  }\n}\n```\n\nAn XSUAA key carries no URL of the resource it authorizes for: state it as\nmeans in an `EnvDestinationStore` (`XSUAA_MCP_URL`, with\n`XSUAA_DESTINATION_VARS`) whose `fallback` is the `XsuaaServiceKeyStore`.\n\n## Responsibilities and Design Principles\n\n### Core Development Principle\n\n**Interface-Only Communication**: This package follows a fundamental development principle: **all interactions with external dependencies happen ONLY through interfaces**. The code knows **NOTHING beyond what is defined in the interfaces**.\n\nThis means:\n- Does not know about concrete store classes (e.g., `AbapSessionStore`); the provider classes it knows only to construct the one a destination states, and hands out as `IAuthProvider`\n- Does not know about internal data structures or methods not defined in interfaces\n- Does not make assumptions about implementation behavior beyond interface contracts\n- Does not access properties or methods not explicitly defined in interfaces\n\nThis principle ensures:\n- **Loose coupling**: `AuthBroker` is decoupled from concrete implementations\n- **Flexibility**: New implementations can be added without modifying `AuthBroker`\n- **Testability**: Easy to mock dependencies for testing\n- **Maintainability**: Changes to implementations don't affect `AuthBroker`\n\n### Package Responsibilities\n\nThe `@mcp-abap-adt/auth-broker` package defines **interfaces** and provides **orchestration logic** for authentication. It does **not** implement concrete storage or token acquisition mechanisms - these are provided by separate packages (`@mcp-abap-adt/auth-stores`, `@mcp-abap-adt/auth-providers`).\n\n#### What AuthBroker Does\n\n- **Resolves what the stores hold**: the means from the key store, the secret from the session store (and, for a `provider` of yours, the 3.x reads: the service URL and the UAA credentials, session first)\n- **Builds or reuses the provider**: one per destination — the one the destination states, shared by `getProvider` and the token API; or your factory, called once per destination\n- **Asks the provider once**: `getTokens()` for `getToken()`, `refreshTokens()` for `refreshToken()` — no retries, no fallbacks\n- **Persists the answer**: the session secret alone — token or session cookies, `expiresAt`, the refresh token, and what it is bound to — to `sessionStore`, retrying a write that fails\n- **Works with interfaces only**: `IServiceKeyStore`, `ISessionStore`, `IAuthProvider`, `IRefreshableTokenProvider`\n\n#### What AuthBroker Does NOT Do\n\n- **Does NOT implement storage**: File I/O, parsing, and storage logic are handled by concrete store implementations from `@mcp-abap-adt/auth-stores`\n- **Does NOT implement token acquisition**: OAuth2 flows, refresh token logic, and client credentials are handled by concrete provider implementations from `@mcp-abap-adt/auth-providers`\n- **Does NOT judge the token**: whether a cached token is still valid, and whether to refresh or log in, is the provider's decision\n- **Does NOT decide how a login is conducted**: browser, headless or pasted code is the provider's authorization strategy\n- **Does NOT copy secrets**: the client secret stays in the service key store\n\n### Consumer Responsibilities\n\nThe **consumer** (application using `AuthBroker`) is responsible for:\n\n1. **Composing the stores and collaborators**: an `IServiceKeyStore` for the means and an `ISessionStore` for the secret — with auth-stores 3:\n   - **ABAP systems (a SAP service key)**: `AbapServiceKeyStore(dir, { grantType })`, alone or as the `fallback` of an `EnvDestinationStore`, and `AbapSessionStore` (or `SafeAbapSessionStore`, in memory)\n   - **Destinations without a key** (basic, SNC, OIDC, SAML, `none`): `EnvDestinationStore(dir)` and `AbapSessionStore`\n   - **XSUAA services**: `EnvDestinationStore(dir, { variables: XSUAA_DESTINATION_VARS, fallback: new XsuaaServiceKeyStore(keys, { grantType }) })` and `XsuaaSessionStore` (or `SafeXsuaaSessionStore`)\n   - the collaborator options the destinations' grants need — or, for the token API the 3.x way, an `IRefreshableTokenProvider` of your own\n\n2. **Stating the means in the key store**: `authType`, `grantType` and the fields its row reads, the client, and `serviceUrl` — for the token API with a `provider` of yours, the service URL comes from the session, else the key store.\n\n3. **A session store that takes the secret alone**: the broker writes the token or cookies, `expiresAt`, the refresh token, `issuedFor` and `issuedBy` in one `saveSession`, and nothing else. auth-stores 3's session stores do; auth-stores 1.x/2.x's `AbapSessionStore` and `SafeAbapSessionStore` refuse a write without `serviceUrl` (measured on 1.2.3, 1.2.4, 2.0.0), so a token API on them throws after every token. A custom store must also keep `issuedFor` and `issuedBy`.\n\n### Store Responsibilities\n\nConcrete `ISessionStore` implementations are responsible for:\n\n- **Handling their own data format**: Each store knows its internal data format (e.g., `AbapSessionData`, `BtpBaseSessionData`)\n- **Converting between formats**: Converting between `IConfig`/`IConnectionConfig` and internal storage format\n- **Taking the secret alone**: a session store is written the secret and its binding only, and keeps what it held beside them (auth-stores 3 refuses means outright)\n\n### Provider Responsibilities\n\nConcrete `IRefreshableTokenProvider` implementations are responsible for:\n\n- **Obtaining tokens**: Using OAuth2 flows, refresh tokens, or client credentials to obtain JWT tokens\n- **Managing token lifecycle**: Caching, validating, refreshing, and re-authenticating as needed (`getTokens()`)\n- **Forcing a new token**: `refreshTokens()` — never the cached one\n- **Reporting failures with typed errors**, which the broker passes on unchanged\n\n### Design Principles\n\n1. **Interface-Only Communication** (Core Principle): All interactions with external dependencies happen **ONLY through interfaces**. The code knows **NOTHING beyond what is defined in the interfaces** (see [Core Development Principle](#core-development-principle) above)\n2. **Dependency Inversion Principle (DIP)**: `AuthBroker` depends on abstractions (`IServiceKeyStore`, `ISessionStore`, `IAuthProvider`, `IRefreshableTokenProvider`), not concrete store implementations; the providers it builds it hands out as `IAuthProvider`\n3. **Single Responsibility**: Each component has a single, well-defined responsibility:\n   - `AuthBroker`: Orchestration — resolving, asking, persisting\n   - `ISessionStore`: Session data storage and retrieval\n   - `IRefreshableTokenProvider`: Token acquisition and lifecycle\n   - `IServiceKeyStore`: Service key storage and retrieval\n4. **Interface Segregation**: Interfaces are focused and minimal, containing only what's necessary for their specific purpose\n5. **Open/Closed Principle**: New store and provider implementations can be added without modifying `AuthBroker`\n\n## API\n\n### `AuthBroker`\n\n#### Constructor\n\n```typescript\nnew AuthBroker(\n  config: {\n    sessionStore: ISessionStore;        // required\n    serviceKeyStore?: IServiceKeyStore; // getProvider needs it\n    provider?:                          // the token API's, optional\n      | IRefreshableTokenProvider\n      | ((\n          destination: string,\n          authConfig: IAuthorizationConfig | null,\n          connConfig: IConnectionConfig,\n        ) => IRefreshableTokenProvider);\n    // Collaborators, each a function of the destination, called once per\n    // build, never disposed by the broker:\n    authorization?: (destination: string, grant: StrategyGrant) => IAuthorizationStrategy<string>; // authorization_code, passcode, saml2_pure, saml2_bearer\n    oidcAuthorization?: (destination: string) => IAuthorizationStrategy<OidcCallbackResult>; // oidc_authorization_code\n    deviceCodePresenter?: (destination: string) => IDeviceCodePresenter; // device_code\n    samlCookies?: (destination: string) => (samlResponse: string) => Promise<string>; // saml2_pure\n    assertionReplayStore?: (destination: string) => IAssertionReplayStore; // saml2_pure, saml2_bearer\n  },\n  logger?: ILogger,\n)\n```\n\n**Parameters:**\n- `config.sessionStore` - **Required** - The session secret: the token or cookies, `expiresAt`, the refresh token, and what it is bound to (`issuedFor`, `issuedBy`). For the token API with a `provider`, its `serviceUrl`, or the service key's, is required (3.x's reads).\n- `config.serviceKeyStore` - The means: `authType`, `grantType`, the client, basic's user and password, the SNC, OIDC and SAML fields, `serviceUrl`. **Required by `getProvider`**, which has no other source of means.\n- `config.provider` - The token API's source (`getToken`, `refreshToken`, `createTokenRefresher`): a provider instance, used for every destination, or a factory (`TokenProviderFactory`), called once per destination and seeded with what the stores hold (see *Basic Usage*). Not used by `getProvider`. Without it, the token API asks the provider `getProvider` builds for the destination (see *Getting Tokens*); with neither it nor a `serviceKeyStore`, the token API throws `DestinationConfigError` naming both.\n- `config.authorization` - The interactive strategy of `jwt` / `authorization_code`, `jwt` / `passcode`, `saml` / `saml2_pure` and `saml` / `saml2_bearer`, as a function of the destination and the grant (see *A Provider for a Connector*).\n- `config.oidcAuthorization` - The interactive strategy of `jwt` / `oidc_authorization_code`.\n- `config.deviceCodePresenter` - Where `jwt` / `device_code` shows the user the verification URL and code.\n- `config.samlCookies` - `saml2_pure`: turns the validated SAMLResponse into the system's session cookies.\n- `config.assertionReplayStore` - The replay store the SAML validators record each assertion in.\n- Each collaborator option is required only by the rows that use it (missing → `DestinationConfigError` naming it); the broker supplies no default, calls it once per build, and disposes nothing it returns.\n- `logger` - Optional logger. If not provided, nothing is logged.\n\n**Available Implementations:**\n- **Means** (auth-stores 3): `EnvDestinationStore(directory, { fallback? })`, `AbapServiceKeyStore(directory, { grantType?, log? })`, `XsuaaServiceKeyStore(directory, { grantType?, log? })`\n- **Secret** (auth-stores 3): `AbapSessionStore(directory, log?)`, `SafeAbapSessionStore(log?)`, `XsuaaSessionStore(directory, log?)`, `SafeXsuaaSessionStore(log?)`, `EnvFileSessionStore(file, log?)`\n- **Providers** (auth-providers 5): `AuthorizationCodeProvider(...)`, `ClientCredentialsProvider(...)` and the rest, for a `provider` of yours\n\n#### Methods\n\n##### `getProvider(destination: string): Promise<IAuthProvider>`\n\nThe `IAuthProvider` the destination states, built from the key store's means\nand the session store's secret (see *A Provider for a Connector*). Cached per\ndestination; a failed build is retried on the next call. Throws\n`DestinationConfigError` for a destination that lacks what its type needs, and\npasses a store failure other than absence on as the store raised it.\n\n##### `flush(): Promise<void>`\n\nEvery session write still pending gets one more attempt. Resolves when all\nhave landed; rejects with an `AggregateError` naming the destinations whose\nstore still refuses (its `errors` carry each destination and the store\nerror's class only, never its message) — the broker keeps retrying them. See *Persistence and `flush()`*.\n\n##### `getToken(destination: string): Promise<string>`\n\n1. Reads the destination's `authType` from the key store: `basic` or `snc` is a `DestinationConfigError` naming `authType`, before any provider is asked.\n2. **Without a `provider` option:** takes the provider `getProvider(destination)` hands out (the same cache; a `none` destination is a `DestinationConfigError` naming `provider`), calls `getTokens()` once, and writes nothing itself — the provider's `onTokens` wrote anything new.\n3. **With one:** resolves `serviceUrl` (session, else service key; an error if neither has one), builds the provider on first use (factory form) seeded with the credentials, the stored refresh token and the stored token — or uses the instance — calls `getTokens()` once, and writes the result: the secret alone, through the broker's write path.\n4. Throws the store's error if the write of this token failed (the broker keeps retrying it); else returns the token.\n\n##### `refreshToken(destination: string): Promise<string>`\n\nThe same, with `provider.refreshTokens()`: a new token, never the cached one —\nfor a caller whose token the server has just refused. A renewal already in\nflight for the destination (a connector's, in `rejected()`) is joined.\n\n##### `getAuthorizationConfig(destination)` / `getConnectionConfig(destination)`\n\nThe two stores composed, each for its role:\n\n- `getConnectionConfig` — the service key store's means with the session's\n  secret (`authorizationToken`, `sessionCookies`, `expiresAt`) laid over them;\n  `null` when neither store holds anything.\n- `getAuthorizationConfig` — the service key store's client (`uaaUrl`,\n  `uaaClientId`, `uaaClientSecret`) with the session's refresh token; `null`\n  when the key store has no client.\n\nMeans a session store answers (a client, a URL, an `authType`) are not read,\nnor a secret a key store answers. Up to 3.1.0 both answered the session's\nconfiguration whole, and the key's only when the session had none.\n\n##### `createTokenRefresher(destination): ITokenRefresher`\n\n`getToken()` and `refreshToken()` bound to one destination, for injection into a connection of your own. Unchanged since 3.x; not deprecated.\n\n##### Error Handling\n\n- **`DestinationConfigError`** — a destination that lacks what its type needs.\n  `getProvider` throws it before any provider is asked; so does the token\n  API, for the same destinations and for those below. It carries `code:\n  'DESTINATION_CONFIG'`, `destination`, `missingFields` — field or option\n  names only. When a provider's constructor refused (an `sncQop` outside `1`,\n  `2`, `3`, `8`, `9`), the store field is named and the provider's own error\n  is not kept — its message quotes the value. **No stored value\n  reaches it**: not a password, not a token, not an `authType` that is none of\n  the four. Thrown for:\n\n  | Case | `missingFields` |\n  |---|---|\n  | no `serviceKeyStore` option (`getProvider`) | `serviceKeyStore` |\n  | the token API with neither a `provider` nor a `serviceKeyStore` option | `provider`, `serviceKeyStore` |\n  | the token API on a destination stated `basic` or `snc` | `authType` |\n  | the token API without a `provider` option, on a `jwt` / `none` or `saml` / `none` destination | `provider` |\n  | the key store has no means for the destination — whatever the session holds | `authType` |\n  | no `authType`, `''`, or one that is not `basic`, `jwt`, `saml`, `snc` | `authType` |\n  | `jwt` / `saml` without `grantType`, `''`, or a pair outside the table | `grantType` |\n  | `basic` without user or password (`''` counts as missing) | `username`, `password` — each that is missing |\n  | `snc` without `sncPartnerName` | `sncPartnerName` |\n  | `snc` whose settings the provider refuses | the store field, e.g. `sncQop` |\n  | `jwt` / `none` without a token in the session | `authorizationToken` |\n  | `saml` / `none` without cookies in the session | `sessionCookies` |\n  | `jwt` / `none`, `saml` / `none` whose stored `issuedFor` is not the destination's resource, or is absent, or the means state no `serviceUrl` | `issuedFor` |\n  | `jwt` / `none`, `saml` / `none` whose means state an issuer and whose stored `issuedBy` is not it, or is absent | `issuedBy` |\n  | a UAA grant without its client in the key store (`''` counts as missing) | `uaaUrl`, `uaaClientId`, and `uaaClientSecret` for `authorization_code` / `client_credentials` — each that is missing |\n  | `authorization_code` / `passcode` without the `authorization` option | `authorization` |\n  | an OIDC grant without its client's id in the key store | `uaaClientId` |\n  | an OIDC grant with neither `oidcIssuerUrl` nor every endpoint its row reads | `oidcIssuerUrl`, and each endpoint missing: `oidcAuthorizationEndpoint` / `oidcDeviceAuthorizationEndpoint`, `oidcTokenEndpoint` |\n  | `password` without user or password | `username`, `password` — each that is missing |\n  | `token_exchange` without its subject | `oidcSubjectToken`, `oidcSubjectTokenType` — each that is missing |\n  | `oidc_authorization_code` without the `oidcAuthorization` option | `oidcAuthorization` |\n  | `device_code` without the `deviceCodePresenter` option | `deviceCodePresenter` |\n  | a SAML grant without its trust (`''` and an empty certificate list count as missing) | `samlIdpSsoUrl`, `samlSpEntityId`, `samlIdpEntityId`, `samlIdpCertificates` — each that is missing |\n  | `saml2_bearer` without its client | `uaaUrl`, `uaaClientId` — each that is missing |\n  | a SAML grant without its collaborators | `authorization`, `samlCookies` (`saml2_pure`), `assertionReplayStore` — each that is missing |\n  | a certificate the validator cannot read | `samlIdpCertificates` |\n  | a `samlClockSkewMs` that is not a whole, non-negative number | `samlClockSkewMs` |\n\n- **Provider errors propagate unchanged** — the same object, with its class,\n  `code`, `missingFields` and `cause`: auth-providers' `ValidationError`,\n  `BrowserAuthError`, `AssertionValidationError`, network errors (`ECONNREFUSED`,\n  `ETIMEDOUT`, `ENOTFOUND`), and whatever your authorization strategy throws.\n  The broker does not retry a failed call.\n- **Store reads: absence is an answer, a failure is not.** A store that answers\n  `null`, or fails with `FILE_NOT_FOUND` (logged at debug), means \"nothing\n  here\", and the broker goes on to the next source. Any other store failure —\n  a service key that is not valid JSON, a file the process may not read — is\n  thrown unchanged. A failure in the reads that come before the token (the\n  session's connection config, the service key) stops the call before the\n  provider is asked; one in the reads that save it (the session's\n  authorization config, the session) arrives after the provider answered and\n  the new token was written. (The session stores of\n  auth-stores answer an unreadable session file with `null` themselves, so it\n  reads as absent before the broker sees it.)\n- **Store writes**: a write that fails reaches the token API's caller — the\n  store's error, as raised, for the token it received — and is retried by the\n  broker all the same. A `getProvider` provider's write never fails the\n  authentication; it is retried, and `flush()` reports it.\n- **A provider result without a token** is an error.\n\n```typescript\nimport { DestinationConfigError } from '@mcp-abap-adt/auth-broker';\nimport { ValidationError } from '@mcp-abap-adt/auth-providers';\n\ntry {\n  const provider = await broker.getProvider('TRIAL');\n} catch (error) {\n  if (error instanceof DestinationConfigError) {\n    logger.error(`${error.destination} lacks: ${error.missingFields.join(', ')}`);\n  }\n  throw error;\n}\n\ntry {\n  const token = await broker.getToken('TRIAL');\n} catch (error) {\n  if (error instanceof ValidationError) {\n    logger.error(`Missing: ${error.missingFields?.join(', ')}`);\n  }\n  throw error;\n}\n```\n\n#### Secrets in the Session Store\n\nEverything the broker writes — a `getProvider` provider's token and the\ntoken API's alike — is the secret alone: `authorizationToken` (or\n`sessionCookies`), `expiresAt`, `refreshToken`, with `issuedFor` and\n`issuedBy`, in one `saveSession`, and nothing else (see *Persistence and\n`flush()`*). Never the client secret, never `serviceUrl` or `authType`:\n`setConnectionConfig` and `setAuthorizationConfig` are not called. A store\nthat merges a write into what it holds keeps a client or URL it held beside\nthe secret; auth-stores 3 holds the secret alone.\n\nThe stored refresh token comes back through `loadSession()`, which the broker\nreads to seed the next process's provider.\n\n### Token Providers\n\nProvider implementations live in `@mcp-abap-adt/auth-providers` 5. `getProvider`\nbuilds the one the destination states (see *A Provider for a Connector*); for\nthe token API the 3.x way you pass one yourself — an `IRefreshableTokenProvider`\nor a factory:\n\n- **`ClientCredentialsProvider`** — `client_credentials`: no user, no browser,\n  no refresh token.\n- **`AuthorizationCodeProvider`** — `authorization_code`: refreshes by the\n  stored refresh token, and logs in through the `authorization` strategy you\n  give it — there is no default. `browserCallbackStrategy({ browser?, port?,\n  timeoutMs? })` builds the usual one (callback port `61001` unless `port` is\n  given; held only for the duration of a login).\n\n```typescript\nimport { AuthBroker } from '@mcp-abap-adt/auth-broker';\nimport {\n  XsuaaServiceKeyStore,\n  XsuaaSessionStore,\n} from '@mcp-abap-adt/auth-stores';\nimport { ClientCredentialsProvider } from '@mcp-abap-adt/auth-providers';\n\n// XSUAA, client_credentials: credentials from the service key\nconst xsuaaBroker = new AuthBroker({\n  sessionStore: new XsuaaSessionStore('/path/to/sessions'),\n  serviceKeyStore: new XsuaaServiceKeyStore('/path/to/keys'),\n  provider: (destination, authConfig) => {\n    if (!authConfig) throw new Error(`No UAA credentials for ${destination}`);\n    return new ClientCredentialsProvider({\n      uaaUrl: authConfig.uaaUrl,\n      clientId: authConfig.uaaClientId,\n      clientSecret: authConfig.uaaClientSecret,\n    });\n  },\n});\n```\n\n## Testing\n\nThe library's tests are in `packages/auth-broker/src/__tests__/` and use Jest.\nRun them from the repository root, where the dev dependencies are installed:\n\n```bash\n# Every workspace's tests (library and CLI)\nnpm test\n\n# The library's only\nnpm test -w @mcp-abap-adt/auth-broker\n\n# One file, or one case\nnpm test -w @mcp-abap-adt/auth-broker -- AuthBroker.test.ts\nnpm test -w @mcp-abap-adt/auth-broker -- AuthBroker.test.ts -t \"name of the case\"\n```\n\nTests run sequentially (`maxWorkers: 1` and `maxConcurrency: 1` in\n`packages/auth-broker/jest.config.js`). `AuthBroker.test.ts` needs nothing;\n`AuthBroker.integration.test.ts` reads real service keys and sessions, and\nevery case in it returns early unless the configuration below names a real\ndestination.\n\n### Test Setup\n\n1. Copy `packages/auth-broker/tests/test-config.yaml.template` to\n   `packages/auth-broker/tests/test-config.yaml` (until the workspace layout it\n   lived in `tests/` at the repository root; move an existing copy)\n2. Fill in configuration values (paths, destinations, MCP URL for XSUAA)\n3. Place service key files in configured `service_keys_dir`:\n   - `{destination}.json` for ABAP tests (e.g., `trial.json`)\n   - `{btp_destination}.json` for XSUAA tests (e.g., `btp.json`)\n\nWithout `test-config.yaml` the template is read, its placeholders disable every\nintegration case, and the run reaches no system.\n\n## Documentation\n\nComplete documentation is available in the repository's [`docs/`](../../docs/) directory:\n\n- **[Architecture](../../docs/architecture/ARCHITECTURE.md)** - System architecture and design decisions\n- **[Testing](../../docs/development/TESTING.md)** - Where the suites live, what they need, the release checks\n- **[Installation](../../docs/installing/INSTALLATION.md)** - Installation and setup guide\n- **[Usage](../../docs/using/USAGE.md)** - API reference and usage examples\n\nSee [docs/README.md](../../docs/README.md) for the complete documen","readmeFilename":"README.md"}