{"_id":"@brandon-svec/express_mcp","_rev":"25-373c3bcba4c097d81e7dc4ac4c21ee61","name":"@brandon-svec/express_mcp","dist-tags":{"latest":"0.7.0"},"versions":{"0.1.0":{"name":"@brandon-svec/express_mcp","version":"0.1.0","keywords":["mcp","model-context-protocol","express","oauth","sse","tools","cursor","ai-agents","knowledge-base"],"author":{"name":"Brandon Svec"},"license":"MIT","_id":"@brandon-svec/express_mcp@0.1.0","maintainers":[{"name":"brandon-svec","email":"brandon.svec@gmail.com"}],"homepage":"https://github.com/brandon-svec/express_mcp#readme","bugs":{"url":"https://github.com/brandon-svec/express_mcp/issues"},"dist":{"shasum":"703442c9c96f45ab94e021ddec643cd401362544","tarball":"https://registry.npmjs.org/@brandon-svec/express_mcp/-/express_mcp-0.1.0.tgz","fileCount":31,"integrity":"sha512-l6DESNjDpk6EMgCdZfvah/j8kRVOGzLA/4tNYSJJwbd9MlX0Xu8hbDseZ0t9tDBJ1NCx5mOCkCIsHdWIDg5mpA==","signatures":[{"sig":"MEQCICtZ3D3dzID923yHz7iWmM3RMR/qlo52n+ybSCJltXvHAiBkMAlHPVbpxW5KxaH38aOjJWJg6R+TmGtGBDO1OTsKJg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":182303},"main":"src/index.js","type":"module","engines":{"npm":">=10","node":">=20"},"gitHead":"c9675eca334f90bc679d29ee16ded79a261896a8","scripts":{"dev":"nodemon examples/example.js","lint":"eslint .","test":"npm run test:unit && npm run test:integration","example":"node examples/example.js","coverage":"c8 npm test","lint:fix":"eslint . --fix","test:live":"mocha --config .mocharc.live.cjs","test:unit":"mocha --exit \"tests/unit/**/*.js\" --bail","example:auth":"node examples/example-with-auth.js","pretest:live":"node scripts/assert-live-gemini-config.js","coverage:unit":"c8 npm run test:unit","test:coverage":"c8 --reporter=lcov npm test","coverage:report":"c8 report --reporter lcov --reporter=text","test:integration":"mocha --exit \"tests/integration/**/*.js\" --bail","coverage:integration":"c8 npm run test:integration"},"_npmUser":{"name":"brandon-svec","email":"brandon.svec@gmail.com"},"overrides":{"diff":"^8.0.3","serialize-javascript":"^7.0.5"},"repository":{"url":"git+https://github.com/brandon-svec/express_mcp.git","type":"git"},"_npmVersion":"11.9.0","description":"Add MCP tools, OAuth, and a knowledge base to any Express app so AI clients can call your APIs","directories":{},"_nodeVersion":"25.6.1","dependencies":{"ajv":"^8.17.1","pino":"^9.9.0","flexsearch":"^0.8.205","ajv-formats":"^3.0.1","jsonwebtoken":"^9.0.3","express-session":"^1.19.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^8.0.1","chai":"^4.3.10","mocha":"^11.7.6","eslint":"^9.33.0","express":"^5.2.1","globals":"^16.3.0","ioredis":"^5.6.1","nodemon":"^3.1.10","supertest":"^6.3.3","@eslint/js":"^9.33.0","timekeeper":"^2.3.1","@google/genai":"^1.52.0"},"peerDependencies":{"express":"^4.18.0 || ^5.0.0","ioredis":"^5.0.0","@google/genai":"^1.0.0"},"peerDependenciesMeta":{"ioredis":{"optional":true},"@google/genai":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/express_mcp_0.1.0_1784832742996_0.18504782707295386","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@brandon-svec/express_mcp","version":"0.1.2","keywords":["mcp","model-context-protocol","express","oauth","sse","tools","cursor","ai-agents","knowledge-base"],"author":{"name":"Brandon Svec"},"license":"MIT","_id":"@brandon-svec/express_mcp@0.1.2","maintainers":[{"name":"brandon-svec","email":"brandon.svec@gmail.com"}],"homepage":"https://github.com/brandon-svec/express_mcp#readme","bugs":{"url":"https://github.com/brandon-svec/express_mcp/issues"},"dist":{"shasum":"c1a91bf371485b05bd1e0587097eb7c8b75e75db","tarball":"https://registry.npmjs.org/@brandon-svec/express_mcp/-/express_mcp-0.1.2.tgz","fileCount":31,"integrity":"sha512-GZfGhjSliH20g0DDE8UPXjFLWOZudmTWiPzslN+5I4kEJIGZ3LqZDgDHDbEox6oNyyB1ft/Gy02snJ6owmT6wA==","signatures":[{"sig":"MEYCIQDQLAt0nYlfB7jE4nPC1dcAvLkwXEIbvrSTh1kD9ZB6QQIhANx9y/xAuB9X5P815ahX0dx5aD+UK4QtIqt0RXr/EhGY","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@brandon-svec%2fexpress_mcp@0.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":183727},"main":"src/index.js","type":"module","engines":{"npm":">=10","node":">=20"},"gitHead":"82beb120de6ff09e5dee538e9000e04373e741f9","scripts":{"dev":"nodemon examples/example.js","lint":"eslint .","test":"npm run test:unit && npm run test:integration","example":"node examples/example.js","coverage":"c8 npm test","lint:fix":"eslint . --fix","test:live":"mocha --config .mocharc.live.cjs","test:unit":"mocha --exit \"tests/unit/**/*.js\" --bail","example:auth":"node examples/example-with-auth.js","pretest:live":"node scripts/assert-live-gemini-config.js","coverage:unit":"c8 npm run test:unit","test:coverage":"c8 --reporter=lcov npm test","coverage:report":"c8 report --reporter lcov --reporter=text","test:integration":"mocha --exit \"tests/integration/**/*.js\" --bail","coverage:integration":"c8 npm run test:integration"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:be0e9294-7480-4a9b-893f-3d18e0a4096e"}},"overrides":{"diff":"^8.0.3","serialize-javascript":"^7.0.5"},"repository":{"url":"git+https://github.com/brandon-svec/express_mcp.git","type":"git"},"_npmVersion":"11.16.0","description":"Add MCP tools, OAuth, and a knowledge base to any Express app so AI clients can call your APIs","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ajv":"^8.17.1","pino":"^9.9.0","flexsearch":"^0.8.205","ajv-formats":"^3.0.1","jsonwebtoken":"^9.0.3","express-session":"^1.19.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^8.0.1","chai":"^4.3.10","mocha":"^11.7.6","eslint":"^9.33.0","express":"^5.2.1","globals":"^16.3.0","ioredis":"^5.6.1","nodemon":"^3.1.10","supertest":"^6.3.3","@eslint/js":"^9.33.0","timekeeper":"^2.3.1","@google/genai":"^1.52.0"},"peerDependencies":{"express":"^4.18.0 || ^5.0.0","ioredis":"^5.0.0","@google/genai":"^1.0.0"},"peerDependenciesMeta":{"ioredis":{"optional":true},"@google/genai":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/express_mcp_0.1.2_1784909107158_0.7396418708100725","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@brandon-svec/express_mcp","version":"0.1.3","keywords":["mcp","model-context-protocol","express","oauth","sse","tools","cursor","ai-agents","knowledge-base"],"author":{"name":"Brandon Svec"},"license":"MIT","_id":"@brandon-svec/express_mcp@0.1.3","maintainers":[{"name":"brandon-svec","email":"brandon.svec@gmail.com"}],"homepage":"https://github.com/brandon-svec/express_mcp#readme","bugs":{"url":"https://github.com/brandon-svec/express_mcp/issues"},"dist":{"shasum":"16edf4ccad009efa6624c014cc81216498219727","tarball":"https://registry.npmjs.org/@brandon-svec/express_mcp/-/express_mcp-0.1.3.tgz","fileCount":31,"integrity":"sha512-IYMaFj4WMhj789+o45sxdbFHxhVy6PgFI88zcABDvaTY78CXc9CBIWbowbDccmNxSNhSXsV1sOUIZOtQACoQ2A==","signatures":[{"sig":"MEQCIBgNPpYR6uN51t3oKr3Gxrx6ghcOvZFTlgtj9lzbcoysAiAnU8ErLtzOgGS+eKstyDkfIHdMCWzWxBliE0L0Ns0wJA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@brandon-svec%2fexpress_mcp@0.1.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":187863},"main":"src/index.js","type":"module","engines":{"npm":">=10","node":">=20"},"gitHead":"ce559f65cfdb17d9c4f65a36d09d4926c5a22fad","scripts":{"dev":"nodemon examples/example.js","lint":"eslint .","test":"npm run test:unit && npm run test:integration","example":"node examples/example.js","coverage":"c8 npm test","lint:fix":"eslint . --fix","test:live":"mocha --config .mocharc.live.cjs","test:unit":"mocha --exit \"tests/unit/**/*.js\" --bail","example:auth":"node examples/example-with-auth.js","pretest:live":"node scripts/assert-live-gemini-config.js","coverage:unit":"c8 npm run test:unit","test:coverage":"c8 --reporter=lcov npm test","coverage:report":"c8 report --reporter lcov --reporter=text","test:integration":"mocha --exit \"tests/integration/**/*.js\" --bail","coverage:integration":"c8 npm run test:integration"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:be0e9294-7480-4a9b-893f-3d18e0a4096e"}},"overrides":{"diff":"^8.0.3","serialize-javascript":"^7.0.5"},"repository":{"url":"git+https://github.com/brandon-svec/express_mcp.git","type":"git"},"_npmVersion":"11.16.0","description":"Add MCP tools, OAuth, and a knowledge base to any Express app so AI clients can call your APIs","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ajv":"^8.17.1","pino":"^9.9.0","flexsearch":"^0.8.205","ajv-formats":"^3.0.1","jsonwebtoken":"^9.0.3","express-session":"^1.19.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^8.0.1","chai":"^4.3.10","mocha":"^11.7.6","eslint":"^9.33.0","express":"^5.2.1","globals":"^16.3.0","ioredis":"^5.6.1","nodemon":"^3.1.10","supertest":"^6.3.3","@eslint/js":"^9.33.0","timekeeper":"^2.3.1","@google/genai":"^1.52.0"},"peerDependencies":{"express":"^4.18.0 || ^5.0.0","ioredis":"^5.0.0","@google/genai":"^1.0.0"},"peerDependenciesMeta":{"ioredis":{"optional":true},"@google/genai":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/express_mcp_0.1.3_1784912145113_0.5783341849038739","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@brandon-svec/express_mcp","version":"0.1.4","keywords":["mcp","model-context-protocol","express","oauth","sse","tools","cursor","ai-agents","knowledge-base"],"author":{"name":"Brandon Svec"},"license":"MIT","_id":"@brandon-svec/express_mcp@0.1.4","maintainers":[{"name":"brandon-svec","email":"brandon.svec@gmail.com"}],"homepage":"https://github.com/brandon-svec/express_mcp#readme","bugs":{"url":"https://github.com/brandon-svec/express_mcp/issues"},"dist":{"shasum":"34924396940f550ba5f8acbbb32690f79e8f6f5f","tarball":"https://registry.npmjs.org/@brandon-svec/express_mcp/-/express_mcp-0.1.4.tgz","fileCount":31,"integrity":"sha512-J76rVPc5u8PrgMIypER/8A0wyrCz5Z/1TkUDwedXVkql2Dby6VXwIPqzwoP9Rd2jqIlzX4mH+2ApZd7NFs5g5Q==","signatures":[{"sig":"MEUCIEOcAkMvvq3u6ywmIXEqFdaOI2XKzFqlwDxpOm5EaUtEAiEAlhBEV+s3djqH0zHUAGgP/zzUXn/Rxa1jJYxl8xSlm0s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@brandon-svec%2fexpress_mcp@0.1.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":170815},"main":"src/index.js","type":"module","engines":{"npm":">=10","node":">=20"},"gitHead":"2f36f8b620eb85d7fdca7461d25472e55570be24","scripts":{"dev":"nodemon examples/example.js","lint":"eslint .","test":"npm run test:unit && npm run test:integration","example":"node examples/example.js","coverage":"c8 npm test","lint:fix":"eslint . --fix","test:live":"mocha --config .mocharc.live.cjs","test:unit":"mocha --exit \"tests/unit/**/*.js\" --bail","example:auth":"node examples/example-with-auth.js","pretest:live":"node scripts/assert-live-gemini-config.js","coverage:unit":"c8 npm run test:unit","test:coverage":"c8 --reporter=lcov npm test","coverage:report":"c8 report --reporter lcov --reporter=text","test:integration":"mocha --exit \"tests/integration/**/*.js\" --bail","coverage:integration":"c8 npm run test:integration"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:be0e9294-7480-4a9b-893f-3d18e0a4096e"}},"overrides":{"diff":"^8.0.3","serialize-javascript":"^7.0.5"},"repository":{"url":"git+https://github.com/brandon-svec/express_mcp.git","type":"git"},"_npmVersion":"11.16.0","description":"Add MCP tools, OAuth, and a knowledge base to any Express app so AI clients can call your APIs","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ajv":"^8.17.1","pino":"^9.9.0","flexsearch":"^0.8.205","ajv-formats":"^3.0.1","jsonwebtoken":"^9.0.3","express-session":"^1.19.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^8.0.1","chai":"^4.3.10","mocha":"^11.7.6","eslint":"^9.33.0","express":"^5.2.1","globals":"^16.3.0","ioredis":"^5.6.1","nodemon":"^3.1.10","supertest":"^6.3.3","@eslint/js":"^9.33.0","timekeeper":"^2.3.1","@google/genai":"^1.52.0"},"peerDependencies":{"express":"^4.18.0 || ^5.0.0","ioredis":"^5.0.0","@google/genai":"^1.0.0"},"peerDependenciesMeta":{"ioredis":{"optional":true},"@google/genai":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/express_mcp_0.1.4_1785012221711_0.7044877990887157","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@brandon-svec/express_mcp","version":"0.1.5","keywords":["mcp","model-context-protocol","express","oauth","sse","tools","cursor","ai-agents","knowledge-base"],"author":{"name":"Brandon Svec"},"license":"MIT","_id":"@brandon-svec/express_mcp@0.1.5","maintainers":[{"name":"brandon-svec","email":"brandon.svec@gmail.com"}],"homepage":"https://github.com/brandon-svec/express_mcp#readme","bugs":{"url":"https://github.com/brandon-svec/express_mcp/issues"},"dist":{"shasum":"28547628b9a42237c561b4c07fef29b56869c24e","tarball":"https://registry.npmjs.org/@brandon-svec/express_mcp/-/express_mcp-0.1.5.tgz","fileCount":31,"integrity":"sha512-z6YpKUcXrj8R1+Dmjw0EsyeV6gPFgFXur5k53MtKUWnk2kOt5f6d3tazVMsBhslxJPLDpqLYEOCyot6Imx517A==","signatures":[{"sig":"MEQCIGvVKn07cwkHHd31BYGPQNFNAESeO0KcpvVMv0tEBoBbAiAWpsEaOdDdqAreAR03Eg7JgnPRYrXHYrg3cnmsLDrOBA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@brandon-svec%2fexpress_mcp@0.1.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":173412},"main":"src/index.js","type":"module","engines":{"npm":">=10","node":">=20"},"gitHead":"4844bee32a69a434a93e03e40fd4fa3845ee31f9","scripts":{"dev":"nodemon examples/example.js","lint":"eslint .","test":"npm run test:unit && npm run test:integration","example":"node examples/example.js","coverage":"c8 npm test","lint:fix":"eslint . --fix","test:live":"mocha --config .mocharc.live.cjs","test:unit":"mocha --exit \"tests/unit/**/*.js\" --bail","example:auth":"node examples/example-with-auth.js","pretest:live":"node scripts/assert-live-gemini-config.js","coverage:unit":"c8 npm run test:unit","test:coverage":"c8 --reporter=lcov npm test","coverage:report":"c8 report --reporter lcov --reporter=text","test:integration":"mocha --exit \"tests/integration/**/*.js\" --bail","coverage:integration":"c8 npm run test:integration"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:be0e9294-7480-4a9b-893f-3d18e0a4096e"}},"overrides":{"diff":"^8.0.3","serialize-javascript":"^7.0.5"},"repository":{"url":"git+https://github.com/brandon-svec/express_mcp.git","type":"git"},"_npmVersion":"11.16.0","description":"Add MCP tools, OAuth, and a knowledge base to any Express app so AI clients can call your APIs","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ajv":"^8.17.1","pino":"^9.9.0","flexsearch":"^0.8.205","ajv-formats":"^3.0.1","jsonwebtoken":"^9.0.3","express-session":"^1.19.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^8.0.1","chai":"^4.3.10","mocha":"^11.7.6","eslint":"^9.33.0","express":"^5.2.1","globals":"^16.3.0","ioredis":"^5.6.1","nodemon":"^3.1.10","supertest":"^6.3.3","@eslint/js":"^9.33.0","timekeeper":"^2.3.1","@google/genai":"^1.52.0"},"peerDependencies":{"express":"^4.18.0 || ^5.0.0","ioredis":"^5.0.0","@google/genai":"^1.0.0"},"peerDependenciesMeta":{"ioredis":{"optional":true},"@google/genai":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/express_mcp_0.1.5_1786682923107_0.5287241594168812","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@brandon-svec/express_mcp","version":"0.2.0","keywords":["mcp","model-context-protocol","express","oauth","sse","tools","cursor","ai-agents","knowledge-base"],"author":{"name":"Brandon Svec"},"license":"MIT","_id":"@brandon-svec/express_mcp@0.2.0","maintainers":[{"name":"brandon-svec","email":"brandon.svec@gmail.com"}],"homepage":"https://github.com/brandon-svec/express_mcp#readme","bugs":{"url":"https://github.com/brandon-svec/express_mcp/issues"},"dist":{"shasum":"7ac13ecf1f5d2d6f288907e49bb874b79590d37e","tarball":"https://registry.npmjs.org/@brandon-svec/express_mcp/-/express_mcp-0.2.0.tgz","fileCount":31,"integrity":"sha512-JaWrPm+iIg2kEK0gnZoCUJDM2tu7gbQg6HhFXOYHcydv95QT2dGb9hd1V1ZByl6pUOxcYCzVp2ZiOGPWnaOQQQ==","signatures":[{"sig":"MEYCIQDI8p1fhGK+wdsjDO7Nf9D/1NIYotRXk6kW3svnKLMVfAIhAJ2CMAtZt8MsaTmfA2tqZvh/953w/AMq2KepRWJl7UtP","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDKs8ZKf/1Z5rJVkLMCjBDT1WWa5RaxT18mxAqCwIIlhwIhANUCcR6Q509rJboEsnj0DWhKViiApdrTsls75W+zY5ZB","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@brandon-svec%2fexpress_mcp@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":175350},"main":"src/index.js","type":"module","engines":{"npm":">=10","node":">=20"},"gitHead":"1359cd07d85e5963ae5a790826a51f49341db8fc","scripts":{"dev":"nodemon examples/example.js","lint":"eslint .","test":"npm run test:unit && npm run test:integration","example":"node examples/example.js","coverage":"c8 npm test","lint:fix":"eslint . --fix","test:live":"mocha --config .mocharc.live.cjs","test:unit":"mocha --exit \"tests/unit/**/*.js\" --bail","example:auth":"node examples/example-with-auth.js","pretest:live":"node scripts/assert-live-gemini-config.js","coverage:unit":"c8 npm run test:unit","test:coverage":"c8 --reporter=lcov npm test","coverage:report":"c8 report --reporter lcov --reporter=text","test:integration":"mocha --exit \"tests/integration/**/*.js\" --bail","coverage:integration":"c8 npm run test:integration"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:be0e9294-7480-4a9b-893f-3d18e0a4096e"}},"overrides":{"diff":"^8.0.3","serialize-javascript":"^7.0.5"},"repository":{"url":"git+https://github.com/brandon-svec/express_mcp.git","type":"git"},"_npmVersion":"11.19.0","description":"Add MCP tools, OAuth, and a knowledge base to any Express app so AI clients can call your APIs","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ajv":"^8.17.1","pino":"^9.9.0","flexsearch":"^0.8.205","ajv-formats":"^3.0.1","jsonwebtoken":"^9.0.3","express-session":"^1.19.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^8.0.1","chai":"^4.3.10","mocha":"^11.7.6","eslint":"^9.33.0","express":"^5.2.1","globals":"^16.3.0","ioredis":"^5.6.1","nodemon":"^3.1.10","supertest":"^6.3.3","@eslint/js":"^9.33.0","timekeeper":"^2.3.1","@google/genai":"^1.52.0"},"peerDependencies":{"express":"^4.18.0 || ^5.0.0","ioredis":"^5.0.0","@google/genai":"^1.0.0"},"peerDependenciesMeta":{"ioredis":{"optional":true},"@google/genai":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/express_mcp_0.2.0_1789141092938_0.4733884300185194","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@brandon-svec/express_mcp","version":"0.2.1","keywords":["mcp","model-context-protocol","express","oauth","sse","tools","cursor","ai-agents","knowledge-base"],"author":{"name":"Brandon Svec"},"license":"MIT","_id":"@brandon-svec/express_mcp@0.2.1","maintainers":[{"name":"brandon-svec","email":"brandon.svec@gmail.com"}],"homepage":"https://github.com/brandon-svec/express_mcp#readme","bugs":{"url":"https://github.com/brandon-svec/express_mcp/issues"},"dist":{"shasum":"492e9825cb1f9976306a9e2729bc0cd8cacba04a","tarball":"https://registry.npmjs.org/@brandon-svec/express_mcp/-/express_mcp-0.2.1.tgz","fileCount":31,"integrity":"sha512-wO1ImTagELlla5V75TR19QD5aTJqKFGSJa83sgIiwcOrD+4gcw7CcRysFt0+W0BV93Mgd7VnlGCSPO0El5zAbg==","signatures":[{"sig":"MEUCIQDcLv1tVjWgdoGJxQocxvF5l3KL6QtsrWfng+ECP8ASHAIgHpL8cDMF0hisA2k2QQMCjzhuLeYR/EDaXhOAPTLrHMs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIH8nhQQAQVX8m90Wa7EBC/ufv7VaXtjWZfAmIAbpLS+vAiEAqbvOnTWn2A29aAz5fiJbCJTmeAvGOLL8DndqxvmU3YI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@brandon-svec%2fexpress_mcp@0.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":176538},"main":"src/index.js","type":"module","engines":{"npm":">=10","node":">=20"},"gitHead":"0c69fb016b1bbb66f28db6c752de574fb84abbc6","scripts":{"dev":"nodemon examples/example.js","lint":"eslint .","test":"npm run test:unit && npm run test:integration","example":"node examples/example.js","coverage":"c8 npm test","lint:fix":"eslint . --fix","test:live":"mocha --config .mocharc.live.cjs","test:unit":"mocha --exit \"tests/unit/**/*.js\" --bail","example:auth":"node examples/example-with-auth.js","pretest:live":"node scripts/assert-live-gemini-config.js","coverage:unit":"c8 npm run test:unit","test:coverage":"c8 --reporter=lcov npm test","coverage:report":"c8 report --reporter lcov --reporter=text","test:integration":"mocha --exit \"tests/integration/**/*.js\" --bail","coverage:integration":"c8 npm run test:integration"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:be0e9294-7480-4a9b-893f-3d18e0a4096e"}},"overrides":{"diff":"^8.0.3","serialize-javascript":"^7.0.5"},"repository":{"url":"git+https://github.com/brandon-svec/express_mcp.git","type":"git"},"_npmVersion":"11.19.0","description":"Add MCP tools, OAuth, and a knowledge base to any Express app so AI clients can call your APIs","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ajv":"^8.17.1","pino":"^9.9.0","flexsearch":"^0.8.205","ajv-formats":"^3.0.1","jsonwebtoken":"^9.0.3","express-session":"^1.19.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^8.0.1","chai":"^4.3.10","mocha":"^11.7.6","eslint":"^9.33.0","express":"^5.2.1","globals":"^16.3.0","ioredis":"^5.6.1","nodemon":"^3.1.10","supertest":"^6.3.3","@eslint/js":"^9.33.0","timekeeper":"^2.3.1","@google/genai":"^1.52.0"},"peerDependencies":{"express":"^4.18.0 || ^5.0.0","ioredis":"^5.0.0","@google/genai":"^1.0.0"},"peerDependenciesMeta":{"ioredis":{"optional":true},"@google/genai":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/express_mcp_0.2.1_1789233371157_0.5114478422856614","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@brandon-svec/express_mcp","version":"0.3.0","keywords":["mcp","model-context-protocol","express","oauth","sse","tools","cursor","ai-agents","knowledge-base"],"author":{"name":"Brandon Svec"},"license":"MIT","_id":"@brandon-svec/express_mcp@0.3.0","maintainers":[{"name":"brandon-svec","email":"brandon.svec@gmail.com"}],"homepage":"https://github.com/brandon-svec/express_mcp#readme","bugs":{"url":"https://github.com/brandon-svec/express_mcp/issues"},"dist":{"shasum":"b269cd2e13b0ce2f31ccc8467f5dff90d8e0673c","tarball":"https://registry.npmjs.org/@brandon-svec/express_mcp/-/express_mcp-0.3.0.tgz","fileCount":31,"integrity":"sha512-1GUUKczukzMzD8KW9OnL0EI+vyEIu43kyWpAgT0W4NSoCgHiLvj2cPyDMNvT0jj+csJM5oKNXtUm1sKbxayC9w==","signatures":[{"sig":"MEQCIBL99E3F290Sao9hJ9+/vez0I27AIwgOHn5DynHlYDNzAiAMG+SZWV3xcRqMj6Zi8lzl5hUKXNlPdObtzQRbW/RueQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIBgnA1kA9Rn6cYW7hnNfeolNgsW/L/0xxXqkE+L+NOubAiEAvSYHkeZ+nArL3EhqVkrFZuaKXpTBIb9L4MqgnFfCDxk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@brandon-svec%2fexpress_mcp@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":187000},"main":"src/index.js","type":"module","engines":{"npm":">=10","node":">=20"},"gitHead":"c3b7ca899a9a80fabec6ceba75cd6828628ac98b","scripts":{"dev":"nodemon examples/example.js","lint":"eslint .","test":"npm run test:unit && npm run test:integration","example":"node examples/example.js","coverage":"c8 npm test","lint:fix":"eslint . --fix","test:live":"mocha --config .mocharc.live.cjs","test:unit":"mocha --exit \"tests/unit/**/*.js\" --bail","example:auth":"node examples/example-with-auth.js","pretest:live":"node scripts/assert-live-gemini-config.js","coverage:unit":"c8 npm run test:unit","test:coverage":"c8 --reporter=lcov npm test","coverage:report":"c8 report --reporter lcov --reporter=text","test:integration":"mocha --exit \"tests/integration/**/*.js\" --bail","coverage:integration":"c8 npm run test:integration"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:be0e9294-7480-4a9b-893f-3d18e0a4096e"}},"overrides":{"diff":"^8.0.3","serialize-javascript":"^7.0.5"},"repository":{"url":"git+https://github.com/brandon-svec/express_mcp.git","type":"git"},"_npmVersion":"11.19.0","description":"Add MCP tools, OAuth, and a knowledge base to any Express app so AI clients can call your APIs","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ajv":"^8.17.1","pino":"^9.9.0","flexsearch":"^0.8.205","ajv-formats":"^3.0.1","jsonwebtoken":"^9.0.3","express-session":"^1.19.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^8.0.1","chai":"^4.3.10","mocha":"^11.7.6","eslint":"^9.33.0","express":"^5.2.1","globals":"^16.3.0","ioredis":"^5.6.1","nodemon":"^3.1.10","supertest":"^6.3.3","@eslint/js":"^9.33.0","timekeeper":"^2.3.1","@google/genai":"^1.52.0"},"peerDependencies":{"express":"^4.18.0 || ^5.0.0","ioredis":"^5.0.0","@google/genai":"^1.0.0"},"peerDependenciesMeta":{"ioredis":{"optional":true},"@google/genai":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/express_mcp_0.3.0_1789681155687_0.4258800183742779","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@brandon-svec/express_mcp","version":"0.3.1","keywords":["mcp","model-context-protocol","express","oauth","sse","tools","cursor","ai-agents","knowledge-base"],"author":{"name":"Brandon Svec"},"license":"MIT","_id":"@brandon-svec/express_mcp@0.3.1","maintainers":[{"name":"brandon-svec","email":"brandon.svec@gmail.com"}],"homepage":"https://github.com/brandon-svec/express_mcp#readme","bugs":{"url":"https://github.com/brandon-svec/express_mcp/issues"},"dist":{"shasum":"a4e72e2caa520a2b96c357226d125b2704753f9d","tarball":"https://registry.npmjs.org/@brandon-svec/express_mcp/-/express_mcp-0.3.1.tgz","fileCount":31,"integrity":"sha512-Tp9JQrtgD2/a2klPlMeisjdMDrActnW72WJfhX+2EVsY1QBNJZsRLkHDd497tjS2cDGYUIjuL9HaAU8yFovwmg==","signatures":[{"sig":"MEUCIQClgQB77WeyItL2jQYhT2wBQsbgHI6CJ7yuI/7Li0JkYAIgUQMcCs300JQEBcIXSuJX8igQ734hn61FiFaB+NRfdEE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCoFAqwVgYN5/AdrzYA5z2RT0dKM5Lm3GpPjvXXh8ITbwIgVeETytMpRyNGYSROkSLkDRbB5xIGXYmAdrDwuE6uyDg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@brandon-svec%2fexpress_mcp@0.3.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":188993},"main":"src/index.js","type":"module","engines":{"npm":">=10","node":">=20"},"gitHead":"db8db02ea937288a2aa633b062ab3db7cce92413","scripts":{"dev":"nodemon examples/example.js","lint":"eslint .","test":"npm run test:unit && npm run test:integration","example":"node examples/example.js","coverage":"c8 npm test","lint:fix":"eslint . --fix","test:live":"mocha --config .mocharc.live.cjs","test:unit":"mocha --exit \"tests/unit/**/*.js\" --bail","example:auth":"node examples/example-with-auth.js","pretest:live":"node scripts/assert-live-gemini-config.js","coverage:unit":"c8 npm run test:unit","test:coverage":"c8 --reporter=lcov npm test","coverage:report":"c8 report --reporter lcov --reporter=text","test:integration":"mocha --exit \"tests/integration/**/*.js\" --bail","coverage:integration":"c8 npm run test:integration"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:be0e9294-7480-4a9b-893f-3d18e0a4096e"}},"overrides":{"diff":"^8.0.3","serialize-javascript":"^7.0.5"},"repository":{"url":"git+https://github.com/brandon-svec/express_mcp.git","type":"git"},"_npmVersion":"11.19.0","description":"Add MCP tools, OAuth, and a knowledge base to any Express app so AI clients can call your APIs","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ajv":"^8.17.1","pino":"^9.9.0","flexsearch":"^0.8.205","ajv-formats":"^3.0.1","jsonwebtoken":"^9.0.3","express-session":"^1.19.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^8.0.1","chai":"^4.3.10","mocha":"^11.7.6","eslint":"^9.33.0","express":"^5.2.1","globals":"^16.3.0","ioredis":"^5.6.1","nodemon":"^3.1.10","supertest":"^6.3.3","@eslint/js":"^9.33.0","timekeeper":"^2.3.1","@google/genai":"^1.52.0"},"peerDependencies":{"express":"^4.18.0 || ^5.0.0","ioredis":"^5.0.0","@google/genai":"^1.0.0"},"peerDependenciesMeta":{"ioredis":{"optional":true},"@google/genai":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/express_mcp_0.3.1_1789682466095_0.11761573460376495","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@brandon-svec/express_mcp","version":"0.4.0","keywords":["mcp","model-context-protocol","express","oauth","sse","tools","cursor","ai-agents","knowledge-base"],"author":{"name":"Brandon Svec"},"license":"MIT","_id":"@brandon-svec/express_mcp@0.4.0","maintainers":[{"name":"brandon-svec","email":"brandon.svec@gmail.com"}],"homepage":"https://github.com/brandon-svec/express_mcp#readme","bugs":{"url":"https://github.com/brandon-svec/express_mcp/issues"},"dist":{"shasum":"35b0d56872949e7b913d9fdb4cdda6544e374996","tarball":"https://registry.npmjs.org/@brandon-svec/express_mcp/-/express_mcp-0.4.0.tgz","fileCount":32,"integrity":"sha512-I2JuXt6vw+fjXynfw+v69OgAUMgCUmApoEGQxALj/nphg7Os6is2CGkjglbb+YQBwIUzxkKu2ug1H3N+zHfzXQ==","signatures":[{"sig":"MEUCIDRK+2WW26f0dHAWFCkaFdYF6X08P7A2vVK6+i0aKpFxAiEA3V7WSp5IcwoJ3ju7QN6lMwV1TtF6fJIRgPHddPeWDvM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIBgBDzP0xqLm14xZSF1vYk/+w6KBpiD0k0PCFLNCfZszAiALI2xLefhiprY2h+yMZPYiCzJxyr2xwyfYT5TO8y298w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@brandon-svec%2fexpress_mcp@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":216334},"main":"src/index.js","type":"module","engines":{"npm":">=10","node":">=20"},"gitHead":"1ae6799dfb0f1c182208b8714a925b8bc33e088c","scripts":{"dev":"nodemon examples/example.js","lint":"eslint .","test":"npm run test:unit && npm run test:integration","example":"node examples/example.js","coverage":"c8 npm test","lint:fix":"eslint . --fix","test:live":"mocha --config .mocharc.live.cjs","test:unit":"mocha --exit \"tests/unit/**/*.js\" --bail","example:auth":"node examples/example-with-auth.js","pretest:live":"node scripts/assert-live-gemini-config.js","coverage:unit":"c8 npm run test:unit","test:coverage":"c8 --reporter=lcov npm test","coverage:report":"c8 report --reporter lcov --reporter=text","test:integration":"mocha --exit \"tests/integration/**/*.js\" --bail","coverage:integration":"c8 npm run test:integration"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:be0e9294-7480-4a9b-893f-3d18e0a4096e"}},"overrides":{"diff":"^8.0.3","serialize-javascript":"^7.0.5"},"repository":{"url":"git+https://github.com/brandon-svec/express_mcp.git","type":"git"},"_npmVersion":"11.19.0","description":"Add MCP tools, OAuth, and a knowledge base to any Express app so AI clients can call your APIs","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ajv":"^8.17.1","pino":"^9.9.0","flexsearch":"^0.8.205","ajv-formats":"^3.0.1","jsonwebtoken":"^9.0.3","express-session":"^1.19.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^8.0.1","chai":"^4.3.10","mocha":"^11.7.6","eslint":"^9.33.0","express":"^5.2.1","globals":"^16.3.0","ioredis":"^5.6.1","nodemon":"^3.1.10","supertest":"^6.3.3","@eslint/js":"^9.33.0","timekeeper":"^2.3.1","@google/genai":"^1.52.0"},"peerDependencies":{"express":"^4.18.0 || ^5.0.0","ioredis":"^5.0.0","@google/genai":"^1.0.0"},"peerDependenciesMeta":{"ioredis":{"optional":true},"@google/genai":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/express_mcp_0.4.0_1789740394611_0.5037348595625155","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@brandon-svec/express_mcp","version":"0.4.1","keywords":["mcp","model-context-protocol","express","oauth","sse","tools","cursor","ai-agents","knowledge-base"],"author":{"name":"Brandon Svec"},"license":"MIT","_id":"@brandon-svec/express_mcp@0.4.1","maintainers":[{"name":"brandon-svec","email":"brandon.svec@gmail.com"}],"homepage":"https://github.com/brandon-svec/express_mcp#readme","bugs":{"url":"https://github.com/brandon-svec/express_mcp/issues"},"dist":{"shasum":"1a617ba668f2a597bcbcfbdaaa04f0c4f33ce04a","tarball":"https://registry.npmjs.org/@brandon-svec/express_mcp/-/express_mcp-0.4.1.tgz","fileCount":33,"integrity":"sha512-IaGlIiaSE8XvXhK7DMugr2WQyTv0wvvY6MY61ueP5pUJdqftZhWAKR2vkxOX6V+gSlqZNSr7jMNxQqUX0mgIPQ==","signatures":[{"sig":"MEYCIQDxqA7B9yCakTSd7PrY+QYWhwTJKmz2ijPrESUDcjo4YQIhAOR/3f78z4SUP3nYxO7h0lDbBYU0Amn3YDVNmIjjdBTa","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDUxSia0EOSGnUCGKNoA7rQxtVkMjYGubkF38EyXOLO1gIgZ6nx9pvmzVcM7K4KkyF8yOWjOvBCgcdRvkMjg3LcHew=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@brandon-svec%2fexpress_mcp@0.4.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":222650},"main":"src/index.js","type":"module","engines":{"npm":">=10","node":">=20"},"gitHead":"041627af42b2be8bf1da12e649e553ff1c03ff2b","scripts":{"dev":"nodemon examples/example.js","lint":"eslint .","test":"npm run test:unit && npm run test:integration","example":"node examples/example.js","coverage":"c8 npm test","lint:fix":"eslint . --fix","test:live":"mocha --config .mocharc.live.cjs","test:unit":"mocha --exit \"tests/unit/**/*.js\" --bail","example:auth":"node examples/example-with-auth.js","pretest:live":"node scripts/assert-live-gemini-config.js","coverage:unit":"c8 npm run test:unit","test:coverage":"c8 --reporter=lcov npm test","coverage:report":"c8 report --reporter lcov --reporter=text","test:integration":"mocha --exit \"tests/integration/**/*.js\" --bail","coverage:integration":"c8 npm run test:integration"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:be0e9294-7480-4a9b-893f-3d18e0a4096e"}},"overrides":{"diff":"^8.0.3","serialize-javascript":"^7.0.5"},"repository":{"url":"git+https://github.com/brandon-svec/express_mcp.git","type":"git"},"_npmVersion":"11.19.0","description":"Add MCP tools, OAuth, and a knowledge base to any Express app so AI clients can call your APIs","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ajv":"^8.17.1","pino":"^9.9.0","flexsearch":"^0.8.205","ajv-formats":"^3.0.1","jsonwebtoken":"^9.0.3","express-session":"^1.19.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^8.0.1","chai":"^4.3.10","mocha":"^11.7.6","eslint":"^9.33.0","express":"^5.2.1","globals":"^16.3.0","ioredis":"^5.6.1","nodemon":"^3.1.10","supertest":"^6.3.3","@eslint/js":"^9.33.0","timekeeper":"^2.3.1","@google/genai":"^1.52.0"},"peerDependencies":{"express":"^4.18.0 || ^5.0.0","ioredis":"^5.0.0","@google/genai":"^1.0.0"},"peerDependenciesMeta":{"ioredis":{"optional":true},"@google/genai":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/express_mcp_0.4.1_1789744110882_0.7377796826027816","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@brandon-svec/express_mcp","version":"0.5.0","keywords":["mcp","model-context-protocol","express","oauth","sse","tools","cursor","ai-agents","knowledge-base"],"author":{"name":"Brandon Svec"},"license":"MIT","_id":"@brandon-svec/express_mcp@0.5.0","maintainers":[{"name":"brandon-svec","email":"brandon.svec@gmail.com"}],"homepage":"https://github.com/brandon-svec/express_mcp#readme","bugs":{"url":"https://github.com/brandon-svec/express_mcp/issues"},"dist":{"shasum":"c639f6724be2be1bfd170c1967629dc07aec8306","tarball":"https://registry.npmjs.org/@brandon-svec/express_mcp/-/express_mcp-0.5.0.tgz","fileCount":33,"integrity":"sha512-Gku2FTC65zE36/4XafDbiPDYND8ia3B+O6ibwt+H2lBoAwiUC+J6S5ij+kc7A+RH4tJlA8xtIst2il4unMPbmA==","signatures":[{"sig":"MEYCIQCTN+oiEYp0nxuOA2YUtrpU9HRJB55njv3CWXWoTk1eqQIhAMgS8IqpIeGEc4V9ii3SmqE2b2G1XZ7XEN+1am+ALcF5","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIHnuwVvmsSprwd9nlknhYPpL21MLPI9biU+jrvlQamJLAiAO0We2vYOfjKj0l7uvtKRhutNzHvGPfIj0HAzORD5bZw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@brandon-svec%2fexpress_mcp@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":230062},"main":"src/index.js","type":"module","engines":{"npm":">=10","node":">=20"},"gitHead":"b09136d8ad82b23587a3fe1c26c73cc47df2e5c0","scripts":{"dev":"nodemon examples/example.js","lint":"eslint .","test":"npm run test:unit && npm run test:integration","example":"node examples/example.js","coverage":"c8 npm test","lint:fix":"eslint . --fix","test:live":"mocha --config .mocharc.live.cjs","test:unit":"mocha --exit \"tests/unit/**/*.js\" --bail","example:auth":"node examples/example-with-auth.js","pretest:live":"node scripts/assert-live-gemini-config.js","coverage:unit":"c8 npm run test:unit","test:coverage":"c8 --reporter=lcov npm test","coverage:report":"c8 report --reporter lcov --reporter=text","test:integration":"mocha --exit \"tests/integration/**/*.js\" --bail","coverage:integration":"c8 npm run test:integration"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:be0e9294-7480-4a9b-893f-3d18e0a4096e"}},"overrides":{"diff":"^8.0.3","serialize-javascript":"^7.0.5"},"repository":{"url":"git+https://github.com/brandon-svec/express_mcp.git","type":"git"},"_npmVersion":"11.19.0","description":"Add MCP tools, OAuth, and a knowledge base to any Express app so AI clients can call your APIs","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ajv":"^8.17.1","pino":"^9.9.0","flexsearch":"^0.8.205","ajv-formats":"^3.0.1","jsonwebtoken":"^9.0.3","express-session":"^1.19.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^8.0.1","chai":"^4.3.10","mocha":"^11.7.6","eslint":"^9.33.0","express":"^5.2.1","globals":"^16.3.0","ioredis":"^5.6.1","nodemon":"^3.1.10","supertest":"^6.3.3","@eslint/js":"^9.33.0","timekeeper":"^2.3.1","@google/genai":"^1.52.0"},"peerDependencies":{"express":"^4.18.0 || ^5.0.0","ioredis":"^5.0.0","@google/genai":"^1.0.0"},"peerDependenciesMeta":{"ioredis":{"optional":true},"@google/genai":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/express_mcp_0.5.0_1789843203677_0.3422633692649786","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@brandon-svec/express_mcp","version":"0.6.0","keywords":["mcp","model-context-protocol","express","oauth","sse","tools","cursor","ai-agents","knowledge-base"],"author":{"name":"Brandon Svec"},"license":"MIT","_id":"@brandon-svec/express_mcp@0.6.0","maintainers":[{"name":"brandon-svec","email":"brandon.svec@gmail.com"}],"homepage":"https://github.com/brandon-svec/express_mcp#readme","bugs":{"url":"https://github.com/brandon-svec/express_mcp/issues"},"dist":{"shasum":"59e98e2dc63c6e2f50bd7e0e3acb4229345fbf17","tarball":"https://registry.npmjs.org/@brandon-svec/express_mcp/-/express_mcp-0.6.0.tgz","fileCount":33,"integrity":"sha512-msy86mIpRHMuIVCd1rHKIeogC56vG1JsPgBUQYMrtJAK8RWTdB0cWMW6Mwp8zQUpGzH9s5H4wSd7gy8D5P7igg==","signatures":[{"sig":"MEYCIQCCvZc4Imd6m+6CwLAfmTjxo5SXFAbqtn19iJFSx8JpmwIhAIafH6Ihf3Aph8cwI+gkKgBKFyhQHj/bmh68wZBVe1UF","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIBHweYzBPg5E+HxGLm/iPhHIYqx4tvpB5rbuS+dEy7dsAiEA1/U8gGwa+Z6L0ESGDPB1v6KzKbuZUPWHXcwE+Mx5gAU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@brandon-svec%2fexpress_mcp@0.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":242035},"main":"src/index.js","type":"module","engines":{"npm":">=10","node":">=20"},"gitHead":"be596e023fee6d1e6d959ca753b2ac631cf5ca7d","scripts":{"dev":"nodemon examples/example.js","lint":"eslint .","test":"npm run test:unit && npm run test:integration","example":"node examples/example.js","coverage":"c8 npm test","lint:fix":"eslint . --fix","test:live":"mocha --config .mocharc.live.cjs","test:unit":"mocha --exit \"tests/unit/**/*.js\" --bail","example:auth":"node examples/example-with-auth.js","pretest:live":"node scripts/assert-live-gemini-config.js","coverage:unit":"c8 npm run test:unit","test:coverage":"c8 --reporter=lcov npm test","coverage:report":"c8 report --reporter lcov --reporter=text","test:integration":"mocha --exit \"tests/integration/**/*.js\" --bail","coverage:integration":"c8 npm run test:integration"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:be0e9294-7480-4a9b-893f-3d18e0a4096e"}},"overrides":{"diff":"^8.0.3","serialize-javascript":"^7.0.5"},"repository":{"url":"git+https://github.com/brandon-svec/express_mcp.git","type":"git"},"_npmVersion":"11.19.0","description":"Add MCP tools, OAuth, and a knowledge base to any Express app so AI clients can call your APIs","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ajv":"^8.17.1","pino":"^9.9.0","flexsearch":"^0.8.205","ajv-formats":"^3.0.1","jsonwebtoken":"^9.0.3","express-session":"^1.19.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^8.0.1","chai":"^4.3.10","mocha":"^11.7.6","eslint":"^9.33.0","express":"^5.2.1","globals":"^16.3.0","ioredis":"^5.6.1","nodemon":"^3.1.10","supertest":"^6.3.3","@eslint/js":"^9.33.0","timekeeper":"^2.3.1","@google/genai":"^1.52.0"},"peerDependencies":{"express":"^4.18.0 || ^5.0.0","ioredis":"^5.0.0","@google/genai":"^1.0.0"},"peerDependenciesMeta":{"ioredis":{"optional":true},"@google/genai":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/express_mcp_0.6.0_1789852523977_0.40888907775863625","host":"s3://npm-registry-packages-npm-production"}},"0.6.1":{"name":"@brandon-svec/express_mcp","version":"0.6.1","keywords":["mcp","model-context-protocol","express","oauth","sse","tools","cursor","ai-agents","knowledge-base"],"author":{"name":"Brandon Svec"},"license":"MIT","_id":"@brandon-svec/express_mcp@0.6.1","maintainers":[{"name":"brandon-svec","email":"brandon.svec@gmail.com"}],"homepage":"https://github.com/brandon-svec/express_mcp#readme","bugs":{"url":"https://github.com/brandon-svec/express_mcp/issues"},"dist":{"shasum":"44b0408a82755034c0b9f97634c5cd334f28c05f","tarball":"https://registry.npmjs.org/@brandon-svec/express_mcp/-/express_mcp-0.6.1.tgz","fileCount":33,"integrity":"sha512-BmAdvop/EyaWcHyecqpPF2OL+arCnrVHzZmomdPLYL/TmpPq1S4TPZ4blV8tOArQjSgF8i3T4DBIpe15DJH1Zg==","signatures":[{"sig":"MEUCIQCjGEUvRfXUhXHaibGKcKrKKxV787h+1UVICVgS1gvTXgIgV4Kp/B5npz/57c1MO4F4WITk2ZGwjV5Z7pfVcKKgBe4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIEzVOp69Y9PbGvntVjxB/EafB7TxTwQEYBgiAZ6Dk8FGAiEA1KW28zmJfiY5j0G4QGpEBLHw/oPT1uZ01ltLDUUjsbQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@brandon-svec%2fexpress_mcp@0.6.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":242229},"main":"src/index.js","type":"module","engines":{"npm":">=10","node":">=20"},"gitHead":"e88097118ad6ead9e8c118b06b91bc41900de7c9","scripts":{"dev":"nodemon examples/example.js","lint":"eslint .","test":"npm run test:unit && npm run test:integration","example":"node examples/example.js","coverage":"c8 npm test","lint:fix":"eslint . --fix","test:live":"mocha --config .mocharc.live.cjs","test:unit":"mocha --exit \"tests/unit/**/*.js\" --bail","example:auth":"node examples/example-with-auth.js","pretest:live":"node scripts/assert-live-gemini-config.js","coverage:unit":"c8 npm run test:unit","test:coverage":"c8 --reporter=lcov npm test","coverage:report":"c8 report --reporter lcov --reporter=text","test:integration":"mocha --exit \"tests/integration/**/*.js\" --bail","coverage:integration":"c8 npm run test:integration"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:be0e9294-7480-4a9b-893f-3d18e0a4096e"}},"overrides":{"diff":"^8.0.3","serialize-javascript":"^7.0.5"},"repository":{"url":"git+https://github.com/brandon-svec/express_mcp.git","type":"git"},"_npmVersion":"11.19.0","description":"Add MCP tools, OAuth, and a knowledge base to any Express app so AI clients can call your APIs","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ajv":"^8.17.1","pino":"^9.9.0","flexsearch":"^0.8.205","ajv-formats":"^3.0.1","jsonwebtoken":"^9.0.3","express-session":"^1.19.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^8.0.1","chai":"^4.3.10","mocha":"^11.7.6","eslint":"^9.33.0","express":"^5.2.1","globals":"^16.3.0","ioredis":"^5.6.1","nodemon":"^3.1.10","supertest":"^6.3.3","@eslint/js":"^9.33.0","timekeeper":"^2.3.1","@google/genai":"^1.52.0"},"peerDependencies":{"express":"^4.18.0 || ^5.0.0","ioredis":"^5.0.0","@google/genai":"^1.0.0"},"peerDependenciesMeta":{"ioredis":{"optional":true},"@google/genai":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/express_mcp_0.6.1_1789937150678_0.06472494405069273","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"_id":"@brandon-svec/express_mcp@0.7.0","bugs":{"url":"https://github.com/brandon-svec/express_mcp/issues"},"dist":{"shasum":"322c332b90ac1acb56a1ba8ebca4e503b62c8978","tarball":"https://registry.npmjs.org/@brandon-svec/express_mcp/-/express_mcp-0.7.0.tgz","fileCount":33,"integrity":"sha512-/G5h33gMilPoSTxWRXPtr9QNalnE6XZjL4P46EHy4MCdSsofkBwATlnAdZpx0fI/BE1ImAVm9eC42qhDob3Bpg==","signatures":[{"sig":"MEUCIQDzTECUdXJYWRin9jc5Bhy2GuXp3724USIcu80KqkCxHwIgNNhcNyOKPOPLV4/oQCBfqsxUwSHduS7E5I9Uull0A9k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQD+Oo3bOVdsKYS4wck9IXdCQ2X3mzBCHI25ndLdaDfpXQIgOTbRxlz6EYZjzM+fLWkQNSyx010CNlvK0EQzQXvOe/0="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@brandon-svec%2fexpress_mcp@0.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":242531},"main":"src/index.js","name":"@brandon-svec/express_mcp","type":"module","author":{"name":"Brandon Svec"},"engines":{"npm":">=10","node":">=20"},"gitHead":"690fc557ebe349f9125c734a1bcb413aa8bd59e8","license":"MIT","scripts":{"dev":"nodemon examples/example.js","lint":"eslint .","test":"npm run test:unit && npm run test:integration","example":"node examples/example.js","coverage":"c8 npm test","lint:fix":"eslint . --fix","test:live":"mocha --config .mocharc.live.cjs","test:unit":"mocha --exit \"tests/unit/**/*.js\" --bail","example:auth":"node examples/example-with-auth.js","pretest:live":"node scripts/assert-live-gemini-config.js","coverage:unit":"c8 npm run test:unit","test:coverage":"c8 --reporter=lcov npm test","coverage:report":"c8 report --reporter lcov --reporter=text","test:integration":"mocha --exit \"tests/integration/**/*.js\" --bail","coverage:integration":"c8 npm run test:integration"},"version":"0.7.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:be0e9294-7480-4a9b-893f-3d18e0a4096e"}},"homepage":"https://github.com/brandon-svec/express_mcp#readme","keywords":["mcp","model-context-protocol","express","oauth","sse","tools","cursor","ai-agents","knowledge-base"],"overrides":{"diff":"^8.0.3","serialize-javascript":"^7.0.5"},"repository":{"url":"git+https://github.com/brandon-svec/express_mcp.git","type":"git"},"_npmVersion":"11.19.0","description":"Add MCP tools, OAuth, and a knowledge base to any Express app so AI clients can call your APIs","directories":{},"maintainers":[{"name":"brandon-svec","email":"brandon.svec@gmail.com"}],"_nodeVersion":"24.21.0","dependencies":{"ajv":"^8.17.1","pino":"^9.9.0","flexsearch":"^0.8.205","ajv-formats":"^3.0.1","jsonwebtoken":"^9.0.3","express-session":"^1.19.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^8.0.1","chai":"^4.3.10","mocha":"^11.7.6","eslint":"^9.33.0","express":"^5.2.1","globals":"^16.3.0","ioredis":"^5.6.1","nodemon":"^3.1.10","supertest":"^6.3.3","@eslint/js":"^9.33.0","timekeeper":"^2.3.1","@google/genai":"^1.52.0"},"peerDependencies":{"express":"^4.18.0 || ^5.0.0","ioredis":"^5.0.0","@google/genai":"^1.0.0"},"peerDependenciesMeta":{"ioredis":{"optional":true},"@google/genai":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/express_mcp_0.7.0_1790347073082_0.769102610143032"}}},"time":{"created":"2026-07-23T18:52:22.839Z","modified":"2026-09-25T14:37:53.566Z","0.0.1":"2026-04-27T00:38:11.304Z","0.0.2":"2026-05-23T17:15:32.561Z","0.0.3":"2026-05-24T01:41:32.991Z","0.0.4":"2026-05-25T17:02:30.425Z","0.0.5":"2026-05-25T17:37:18.275Z","0.0.6":"2026-05-25T17:58:08.881Z","0.0.7":"2026-05-25T23:40:50.987Z","0.0.8":"2026-07-21T18:25:39.991Z","0.0.9":"2026-07-21T19:24:19.040Z","0.1.0":"2026-07-23T18:52:23.149Z","0.1.2":"2026-07-24T16:05:07.305Z","0.1.3":"2026-07-24T16:55:45.250Z","0.1.4":"2026-07-25T20:43:41.854Z","0.1.5":"2026-08-14T04:48:43.243Z","0.2.0":"2026-09-11T15:38:13.026Z","0.2.1":"2026-09-12T17:16:11.243Z","0.3.0":"2026-09-17T21:39:15.776Z","0.3.1":"2026-09-17T22:01:06.193Z","0.4.0":"2026-09-18T14:06:34.709Z","0.4.1":"2026-09-18T15:08:31.000Z","0.5.0":"2026-09-19T18:40:03.775Z","0.6.0":"2026-09-19T21:15:24.090Z","0.6.1":"2026-09-20T20:45:50.759Z","0.7.0":"2026-09-25T14:37:53.177Z"},"bugs":{"url":"https://github.com/brandon-svec/express_mcp/issues"},"author":{"name":"Brandon Svec"},"license":"MIT","homepage":"https://github.com/brandon-svec/express_mcp#readme","keywords":["mcp","model-context-protocol","express","oauth","sse","tools","cursor","ai-agents","knowledge-base"],"repository":{"url":"git+https://github.com/brandon-svec/express_mcp.git","type":"git"},"description":"Add MCP tools, OAuth, and a knowledge base to any Express app so AI clients can call your APIs","maintainers":[{"name":"brandon-svec","email":"brandon.svec@gmail.com"}],"readme":"# Express MCP\n\nMount the [Model Context Protocol](https://modelcontextprotocol.io/) on any Express app so AI clients (Cursor, Claude, Gemini Spark Connected Apps, and other MCP-compatible tools) can agentically interact with your pre-existing API server without standing up a separate MCP server.\n\nRegister tools against your existing business logic, optionally add OAuth SSO (GitHub/Google), a FlexSearch knowledge base, and an in-process LLM agent. This package ships **routers and middleware only**; your host Express app remains in control of TLS, CORS, body parsers, and rate limits.\n\n## Features\n\n- **Drop-in MCP on Express** — Mount JSON-RPC MCP endpoints on the app you already run\n- **Your tools, your data** — Register custom tools that wrap existing APIs and services\n- **Optional OAuth SSO** — GitHub/Google login, Bearer JWTs, PKCE, and Dynamic Client Registration for MCP clients\n- **Gemini Spark Connected Apps** — First-class Google Account Linking for Spark: default DCR allowlist for `oauth-redirect*.googleusercontent.com`, wire-encoded `state` echo, and `refresh_token` issuance\n- **Built-in knowledge base** — Full-text document search via FlexSearch (`kb_search`, `kb_list`, `kb_get`)\n- **Tool name prefixing** — Avoid collisions when multiple MCP services share a client\n- **Optional agent** — Gemini-backed `agent_ask` that can call your registered tools\n\n## Requirements\n\n- **Node.js**: Version 20 or higher\n- **Express**: Version ^4.18.0 || ^5.0.0 (peer dependency)\n\n## Installation\n\n```bash\nnpm install @brandon-svec/express_mcp express\n```\n\nExpress is a peer dependency. Ensure you have Express ^4.18.0 or ^5.0.0 installed in your project.\n\n## Quick Start\n\n```javascript\nimport express from 'express';\nimport { ExpressMcp, BaseTool } from '@brandon-svec/express_mcp';\n\nconst app = express();\napp.use(express.json());\n\nconst expressMcp = new ExpressMcp();\n\n// Extend BaseTool: name + description for tools/list, inputSchema for args, execute for the handler\nclass GreetingTool extends BaseTool {\n  constructor() {\n    super('greeting', 'A simple greeting tool'); // Tool name and description for your agent to know when to use the tool\n    this.inputSchema = {\n      type: 'object',\n      properties: {\n        name: { type: 'string', description: 'Name to greet' } // Good descriptions improve agent operations\n      },\n      required: ['name']\n    };\n  }\n\n  async execute(params) {\n    return `Hello, ${params.name}!`;\n  }\n}\n\nexpressMcp.registerTool(new GreetingTool());\napp.use('/mcp', expressMcp.router());\n\napp.listen(3000, () => {\n  console.log('MCP endpoint: http://localhost:3000/mcp');\n});\n```\n\nWhen auth is enabled, `execute` can take a second `context` argument and read `context.user` (`sub`, `login`, `email`, `provider`).\n\n## Knowledge Base\n\nExpress MCP includes a FlexSearch-backed knowledge base with three MCP tools: `kb_search`, `kb_list`, and `kb_get`. When you pass a `name` to `ExpressMcp`, those tools are prefixed (e.g. `my-service_kb_search`) so multiple MCP services can coexist in one client.\n\n```javascript\nimport { ExpressMcp } from '@brandon-svec/express_mcp';\n\nconst expressMcp = new ExpressMcp({\n  name: 'my-api-server',\n  description: 'Internal API documentation and guides'\n});\n\nawait expressMcp.addDocument('getting-started', {\n  title: 'Getting Started Guide',\n  content: 'This guide will help you get started with our API...',\n  tags: ['guide', 'tutorial', 'beginner'],\n  metadata: { category: 'documentation' }\n});\n```\n\n### Document management\n\n```javascript\nawait expressMcp.addDocument('doc-id', {\n  title: 'Document Title',\n  content: 'Document content goes here...',\n  tags: ['tag1', 'tag2'],\n  metadata: { key: 'value' }\n});\n\nawait expressMcp.updateDocument('doc-id', {\n  title: 'Updated Title',\n  content: 'Updated content...'\n});\n\nawait expressMcp.removeDocument('doc-id');\n\nconst stats = await expressMcp.getKnowledgeBaseStats();\n// { totalDocuments, totalWords, uniqueTags, tags }\n```\n\n### Built-in MCP tools\n\n| Tool | Purpose |\n|------|---------|\n| `kb_search` / `{name}_kb_search` | Full-text search (`query`, optional `limit`, `includeContent`) |\n| `kb_list` / `{name}_kb_list` | List documents (optional `tag`, `limit`) |\n| `kb_get` / `{name}_kb_get` | Fetch one document by `id` |\n\nTool descriptions update as you add documents: available tags and your custom `description` are included so AI clients know what is searchable.\n\nDisable the knowledge base with `enableKnowledgeBase: false`.\n\n## Authentication (OAuth SSO)\n\nOptional GitHub and/or Google login. Users receive a JWT; MCP clients send `Authorization: Bearer <token>` on each request.\n\nSee **[docs/AUTH.md](docs/AUTH.md)** for the full config reference, env vars, session stores, and OAuth provider setup.\n\n```javascript\nimport { ExpressMcp } from '@brandon-svec/express_mcp';\n\nconst expressMcp = new ExpressMcp({\n  name: 'my-service',\n  auth: {\n    enabled: true,\n    baseUrl: 'https://my-host.example.com',\n    callbackUrl: 'https://my-host.example.com/mcp/auth/callback',\n    jwtSecret: process.env.JWT_SECRET,\n    sessionSecret: process.env.SESSION_SECRET,\n    jwtExpiresIn: '7d',\n    allowedUsers: [],\n    providers: {\n      google: { clientId: '...', clientSecret: '...' },\n      github: { clientId: '...', clientSecret: '...' }\n    }\n  }\n});\n\napp.use(expressMcp.httpRouter()); // OAuth + MCP on one router\n```\n\nOr build auth from environment variables:\n\n```javascript\nimport { buildAuthOptionsFromEnv } from '@brandon-svec/express_mcp';\n\nconst auth = buildAuthOptionsFromEnv({ baseUrl: 'http://localhost:3000' });\nif (auth) {\n  const expressMcp = new ExpressMcp({ name: 'my-service', auth });\n}\n```\n\nEnv vars: `GITHUB_CLIENT_ID`, `GITHUB_CLIENT_SECRET`, `GOOGLE_CLIENT_ID`, `GOOGLE_CLIENT_SECRET`, `JWT_SECRET`, `SESSION_SECRET`. Optional: `JWT_EXPIRES_IN`, `AUTH_ALLOWED_USERS`, `OAUTH_CALLBACK_URL`.\n\n### Gemini Spark Connected Apps\n\nSpark connects through [Google Account Linking](https://developers.google.com/identity/account-linking/oauth-linking), not by pasting your `GOOGLE_CLIENT_SECRET` into Spark’s UI.\n\n1. Enable auth with a Google IdP client. Register **only** `{baseUrl}/mcp/auth/callback` on that Google Cloud OAuth client (the server’s IdP callback).\n2. Point Spark Connected Apps at your MCP HTTPS URL. Spark DCR registers `oauth-redirect` / `oauth-redirect-sandbox` / `oauth-redirect-test` `.googleusercontent.com` redirect hosts — those are trusted by default (no `trustedRedirectHosts` or `allowAnyHttpsRedirect` required for Spark).\n3. After the user signs in, Google’s servers call your `POST /mcp/token`. The library returns `refresh_token` and echoes the wire-encoded `state` unchanged (required for Account Linking).\n\nDo not add `oauth-redirect*.googleusercontent.com` URLs to the Google Cloud OAuth client’s authorized redirect list. See **[docs/AUTH.md](docs/AUTH.md)** for `trustedRedirectHosts` and `allowAnyHttpsRedirect` when integrating other agents.\n\n## Optional AI Agent\n\nEnable an in-process Gemini agent that can call your registered tools (exposed as `agent_ask` by default):\n\n```javascript\nconst expressMcp = new ExpressMcp({\n  name: 'my-service',\n  auth: { /* auth config */ },\n  agent: {\n    enabled: true,\n    systemInstruction: 'You help users with this service.',\n    gemini: {\n      apiKey: process.env.GEMINI_API_KEY,\n      model: 'gemini-2.0-flash'\n    }\n  }\n});\n```\n\nRequires auth by default (`agent.allowUnauthenticated: true` to opt out). `@google/genai` is an optional peer dependency.\n\nUse `getAgent().processMessage(historyKey, text, options)` for inbound turns. Optional `options.ephemeralPrefix` is prepended to `text` for the model on **this turn only** (including tool rounds) and is **never** stored or replayed — hosts use it for working-memory fences and similar ephemeral context. Optional per-turn options:\n\n- `toolNames: string[]` — only these registered tools are declared and callable for this turn (must pass `excludeTools` / `toolAllowlist`). An empty list omits the `tools` key from the Gemini request entirely (Gemini rejects `functionDeclarations: []` with `INVALID_ARGUMENT`).\n- `systemInstruction: string` — replace the agent constructor system instruction for this turn only.\n- `escalation: { toolNames, systemInstruction }` — requires `toolNames`. Adds a synthetic `request_tools` declaration; when the model calls it, the agent swaps to the escalation tool set and instruction for the remaining rounds, logs `Agent tool set escalated`, and grants **+1** `maxToolRounds` budget. `request_tools` call/response pairs are stripped from stored history (atomic pair scrub) so Gemini function-pairing stays valid on replay.\n\nOptional agent constructor options:\n\n- `historyToolTurns: 'full' | 'omit'` — `'full'` (default) stores tool-loop `functionCall` / `functionResponse` parts; `'omit'` stores only the user text and final model reply so large tool payloads are not replayed.\n- `historyMaxTurns` — when using the default in-memory history, keep at most this many turns after TTL pruning (oldest first). Cannot be set together with a custom `agent.history`.\n- `excludeTools: string[]` — additional tool names the agent must not call (merged with built-in session / `agent_ask` exclusions).\n\n`httpRouter({ mcpPath, rootAliases, sessionOptions })`: set `rootAliases: false` for a secondary mount (e.g. `/mcp/admin`) so it does not register site-root OAuth AS aliases that would collide with the primary. Path-based discovery (`/.well-known/oauth-authorization-server{mcpPath}`) is always registered. Auth middleware is attached only to exact `/` MCP routes so a longer sibling path is not intercepted.\n\nFor **host-initiated agent speech** (proactive reminders, notifications) that must appear in the next turn’s conversation history without calling the LLM, use `getAgent().recordAssistantMessage(historyKey, text)`. That method requires a history store and throws if none is configured. When recorded model turns leave history starting with a `model` role, `processMessage` prepends a synthetic user `[continued]` turn before calling Gemini so contents remain valid. Schema and tool execution errors are returned to the model as `{ ok: false, error }` functionResponses so further `maxToolRounds` can fix args and retry (same recovery Cursor gets over MCP JSON-RPC).\n\nSet `loggerOptions.level` to `trace` to log the exact model request (`contents`, `systemInstruction`, `toolDeclarations`) plus a per-content size breakdown before each generate. Trace payloads include raw user content. At `info`, each completed turn logs character totals (`contentsChars`, `systemInstructionChars`, `toolDeclarationChars`, `historyTurns`, `toolCount`, `escalated`) without the request body.\n\n## API Reference\n\n### `ExpressMcp`\n\n```javascript\nconst expressMcp = new ExpressMcp({\n  name: 'my-service',           // Instance name (tool prefixing + logger name)\n  description: 'My API docs',   // Appended to knowledge base tool descriptions\n  enableKnowledgeBase: true,    // Register kb_* tools (default: true)\n  loggerOptions: {\n    enabled: true,\n    level: 'info',\n    name: 'express-mcp'\n  },\n  logger: customLoggerInstance, // Optional; overrides loggerOptions\n  auth: { /* see docs/AUTH.md */ },\n  agent: { /* optional; see above */ }\n});\n```\n\n#### Tool name prefixing\n\nWhen `name` is set, knowledge base tools become `{name}_kb_search`, `{name}_kb_list`, `{name}_kb_get`. Use a unique name per service so clients like Cursor can route calls correctly when multiple MCP servers are connected.\n\nCustom tools from `registerTool()` are **not** prefixed by default. To prefix a custom tool:\n\n```javascript\nexpressMcp.toolRegistry.register(new MyTool(), 'my-service');\n```\n\nManagement APIs (`hasRegisteredTool`, `unregisterTool`, etc.) accept the **original** tool name.\n\n#### Tool management\n\n- `registerTool(tool)` — Register a tool (custom tools are not prefixed)\n- `unregisterTool(name)` — Unregister by original name\n- `hasRegisteredTool(name)` / `getRegisteredTool(name)`\n- `getRegisteredToolCount()` / `clearRegisteredTools()`\n- `router()` — MCP-only Express router\n- `httpRouter()` — OAuth + MCP when auth is enabled\n\n#### Knowledge base\n\n- `addDocument(id, document)` / `updateDocument(id, updates)` / `removeDocument(id)`\n- `getKnowledgeBaseStats()`\n\n## MCP Protocol Support\n\nThis module implements:\n\n- **initialize** — Initialize MCP session\n- **notifications/initialized** — Confirm initialization\n- **tools/list** — List available tools\n- **tools/call** — Execute a tool with parameters\n\nResponses follow JSON-RPC 2.0 with proper error handling.\n\n## Learn more\n\n| Topic | Document |\n|-------|----------|\n| OAuth SSO, sessions, DCR, agent auth | [docs/AUTH.md](docs/AUTH.md) |\n| Host security (TLS, CORS, rate limits) | [SECURITY.md](SECURITY.md) |\n| Local development, tests, releasing | [CONTRIBUTING.md](CONTRIBUTING.md) |\n\n## License\n\nMIT\n","readmeFilename":"README.md"}