{"_id":"data-analyst-mcp","_rev":"9-0bc89eb8d97f972471010d05018d980b","name":"data-analyst-mcp","dist-tags":{"latest":"0.9.0"},"versions":{"0.0.0-stage":{"name":"data-analyst-mcp","version":"0.0.0-stage","_id":"data-analyst-mcp@0.0.0-stage","stub":true,"maintainers":[{"name":"sevenzsu","email":"azure.ss@gmail.com"}],"dist":{"shasum":"9737e489e10b50c5164b754afc585aeebee49c04","tarball":"https://registry.npmjs.org/data-analyst-mcp/-/data-analyst-mcp-0.0.0-stage.tgz","fileCount":2,"integrity":"sha512-OOaWGmOavddfQQly34fMNuigheslSarDFasE35AUWVXrHhxXO53cRYztMwUe/gEdbRgvyggRQxbLXdyoZ5qrzQ==","signatures":[{"sig":"MEQCIBhJyB6vSQeuPiy936BFfHnYVZuAbslUcQhB8CHJzT1iAiAe8hZuUAwSC6NapOInj17NZqRLAEq8PzRs85BTxOg/Jw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":338},"_npmUser":{"name":"sevenzsu","email":"azure.ss@gmail.com"},"description":"Temporary package placeholder for staged publishing","directories":{}},"0.3.0":{"name":"data-analyst-mcp","version":"0.3.0","keywords":["mcp","model-context-protocol","government-data","data.gov","census","bea"],"license":"MIT","_id":"data-analyst-mcp@0.3.0","maintainers":[{"name":"sevenzsu","email":"azure.ss@gmail.com"}],"homepage":"https://github.com/zsu/data-analyst-mcp#readme","bugs":{"url":"https://github.com/zsu/data-analyst-mcp/issues"},"bin":{"data-analyst-mcp":"dist/bin/cli.js"},"dist":{"shasum":"9fa163856068260746cf4406029b3c49d9437ab5","tarball":"https://registry.npmjs.org/data-analyst-mcp/-/data-analyst-mcp-0.3.0.tgz","fileCount":640,"integrity":"sha512-JPaDB0AtdrXTfdJDZQusvGWSM7sAstTBqZtGeoYRWTR06oGgVdEJbiUrFc0du2XUTB6sa3+HnDrVRE8TMekirg==","signatures":[{"sig":"MEYCIQCcFAd7BGJL+98MacjrzJbwA855qJWiDMEMbWFOElgPaAIhAIc9bP4nRjIymtGR5q7UIfe74+Ky7qdptvCXCGUXEx4n","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCICy2AP0Ud07aaZAmjNrUlWwe9zvzBJ8JOScBbe3uYIVeAiEA8DHwUPe+xXiu2qdsNFU3llB1U4FzlCS7FfScHvfnyLw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7144898},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"89ce56975d0ce22ad647ff7a8c407b0e56bd9c13","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","smoke":"tsx scripts/smoke.ts","start":"node dist/bin/cli.js","typecheck":"tsc -p tsconfig.json --noEmit && tsc -p tsconfig.test.json","smoke:http":"tsx scripts/smoke-http.ts","prepublishOnly":"npm run typecheck && npm test && npm run build"},"_npmUser":{"name":"sevenzsu","email":"azure.ss@gmail.com"},"repository":{"url":"git+https://github.com/zsu/data-analyst-mcp.git","type":"git"},"_npmVersion":"11.11.0","description":"MCP server for U.S. government data: asks the critical questions first, fetches from the agency, cites every number.","directories":{},"_nodeVersion":"24.14.1","dependencies":{"zod":"^4.1.0","xlsx":"https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz","fflate":"^0.8.3","express":"^5.3.0","csv-parse":"^7.0.3","csv-stringify":"^6.6.0","express-rate-limit":"^8.7.3","@modelcontextprotocol/sdk":"^1.32.2"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.15","vitest":"^4.0.0","typescript":"~5.9.3","@types/node":"^24.19.2","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/data-analyst-mcp_0.3.0_1794086775718_0.7926293369823181","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"data-analyst-mcp","version":"0.3.1","keywords":["mcp","model-context-protocol","government-data","data.gov","census","bea"],"license":"MIT","_id":"data-analyst-mcp@0.3.1","maintainers":[{"name":"sevenzsu","email":"azure.ss@gmail.com"}],"homepage":"https://github.com/zsu/data-analyst-mcp#readme","bugs":{"url":"https://github.com/zsu/data-analyst-mcp/issues"},"bin":{"data-analyst-mcp":"dist/bin/cli.js"},"dist":{"shasum":"3128ba52f491b771f7578c4260b5c5f466a2d6ab","tarball":"https://registry.npmjs.org/data-analyst-mcp/-/data-analyst-mcp-0.3.1.tgz","fileCount":640,"integrity":"sha512-ExESl3x1aqWMwyTie+u51rR2u7/rhKlS8rig7CiCPdn0iy4aV6Uv05ebpi00atk18Mt0bP6kd2430bsMACRwIQ==","signatures":[{"sig":"MEUCIQD4CsyrA27M4xNT/javLtN4bPJeH9aI3VBR0I8AP5CzzwIgA+tiph9U8Skz43K4nDijFp9XLDg9xJU39G+Tj6Uc82U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIC8AczlxfryGZk2WQe4lPhSpNktUsO1fUg8lONYx/l5sAiEAvIMhZY0LPuFJMdGCqG/9UiIAYkuJbVKoXTL45Il4HaU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/data-analyst-mcp@0.3.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":7115731},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"f8db6b5763bbf6ecd8f199e79d2195719e03ff3e","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","smoke":"tsx scripts/smoke.ts","start":"node dist/bin/cli.js","typecheck":"tsc -p tsconfig.json --noEmit && tsc -p tsconfig.test.json","smoke:http":"tsx scripts/smoke-http.ts","prepublishOnly":"npm run typecheck && npm test && npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"db10bbf2-3887-46ef-a87f-70184fa8e580"}},"repository":{"url":"git+https://github.com/zsu/data-analyst-mcp.git","type":"git"},"_npmVersion":"11.19.1","description":"MCP server for U.S. government data: asks the critical questions first, fetches from the agency, cites every number.","directories":{},"_nodeVersion":"24.22.2","dependencies":{"zod":"^4.1.0","xlsx":"https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz","fflate":"^0.8.3","express":"^5.3.0","csv-parse":"^7.0.3","csv-stringify":"^6.6.0","express-rate-limit":"^8.7.3","@modelcontextprotocol/sdk":"^1.32.2"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.15","vitest":"^4.0.0","typescript":"~5.9.3","@types/node":"^24.19.2","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/data-analyst-mcp_0.3.1_1794092576632_0.5323663587374847","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"data-analyst-mcp","version":"0.4.0","keywords":["mcp","model-context-protocol","government-data","data.gov","census","bea"],"license":"MIT","_id":"data-analyst-mcp@0.4.0","maintainers":[{"name":"sevenzsu","email":"azure.ss@gmail.com"}],"homepage":"https://github.com/zsu/data-analyst-mcp#readme","bugs":{"url":"https://github.com/zsu/data-analyst-mcp/issues"},"bin":{"data-analyst-mcp":"dist/bin/cli.js"},"dist":{"shasum":"4309c42ee4705a2f86d6a6923cd6b2656e170dcd","tarball":"https://registry.npmjs.org/data-analyst-mcp/-/data-analyst-mcp-0.4.0.tgz","fileCount":724,"integrity":"sha512-YcJlmR/IsBkz23ZZPQkCyqNgRPNEDdbk1lgJ63C7zKqWiRKG+TOdX6zlbOkBWVtmXPshQ8tplbw9SKngQZQkMw==","signatures":[{"sig":"MEUCIQCeishM3tV128VN872fbx7m/yG+ESIrxl+ZgSRHl1K+iQIgHW2AaiPnvIX8OGFXegnCAH+5BoS88A3RaWZPJoAgIUI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCICxJP79EiTqSwh7LLkTsG9vJCzB9oSjMqSDuKqVQ8PL7AiEA36DPR6gcZ4BdB3qNa96PqLKt/6nOOA5Cwxon8jtd/HI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/data-analyst-mcp@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":7435943},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"a6d7e25d7ab4832f94d2173018965a36a45b6d86","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","smoke":"tsx scripts/smoke.ts","start":"node dist/bin/cli.js","typecheck":"tsc -p tsconfig.json --noEmit && tsc -p tsconfig.test.json","smoke:http":"tsx scripts/smoke-http.ts","prepublishOnly":"npm run typecheck && npm test && npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"db10bbf2-3887-46ef-a87f-70184fa8e580"}},"repository":{"url":"git+https://github.com/zsu/data-analyst-mcp.git","type":"git"},"_npmVersion":"11.19.1","description":"MCP server for U.S. government data: asks the critical questions first, fetches from the agency, cites every number.","directories":{},"_nodeVersion":"24.22.2","dependencies":{"zod":"^4.1.0","xlsx":"https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz","fflate":"^0.8.3","express":"^5.3.0","csv-parse":"^7.0.3","csv-stringify":"^6.6.0","express-rate-limit":"^8.7.3","@modelcontextprotocol/sdk":"^1.32.2"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.15","vitest":"^4.0.0","typescript":"~5.9.3","@types/node":"^24.19.2","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/data-analyst-mcp_0.4.0_1794098790546_0.24688581858268555","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"data-analyst-mcp","version":"0.5.0","keywords":["mcp","model-context-protocol","government-data","data.gov","census","bea"],"license":"MIT","_id":"data-analyst-mcp@0.5.0","maintainers":[{"name":"sevenzsu","email":"azure.ss@gmail.com"}],"homepage":"https://github.com/zsu/data-analyst-mcp#readme","bugs":{"url":"https://github.com/zsu/data-analyst-mcp/issues"},"bin":{"data-analyst-mcp":"dist/bin/cli.js"},"dist":{"shasum":"ef2844ee5e6f9b9fb4462b4f8e8b1071a46ae8b0","tarball":"https://registry.npmjs.org/data-analyst-mcp/-/data-analyst-mcp-0.5.0.tgz","fileCount":728,"integrity":"sha512-IIRUlyu7t4mgdx9VIyzhO1t39RAzas5qrLjDWf4DNn5MUXHIu7b4DfRFYqHahvKklQoZ3VYQpBFLzmbFZhiNug==","signatures":[{"sig":"MEYCIQDRr742y0sBj7NXaA5WOHXrAKsvsdIav60fS5mnhyed5QIhALivi4y4ZRinX0t+vSD4ZuSw8aH9kNDfXf/gHWWkmSt2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDSCHaFQPGFNEAr+CZgk8JrUCKwARiLZk41rsEfMj0SjAIhAOeQeuUM4MH2/GFgxrR3JL4WELHUg0ZmWHf8osLh8vOM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/data-analyst-mcp@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":7502517},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"3c67e11e6bcb9369783bfc04117f562b7caf552e","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","smoke":"tsx scripts/smoke.ts","start":"node dist/bin/cli.js","typecheck":"tsc -p tsconfig.json --noEmit && tsc -p tsconfig.test.json","smoke:http":"tsx scripts/smoke-http.ts","prepublishOnly":"npm run typecheck && npm test && npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"db10bbf2-3887-46ef-a87f-70184fa8e580"}},"repository":{"url":"git+https://github.com/zsu/data-analyst-mcp.git","type":"git"},"_npmVersion":"11.19.1","description":"MCP server for U.S. government data: asks the critical questions first, fetches from the agency, cites every number.","directories":{},"_nodeVersion":"24.22.2","dependencies":{"zod":"^4.1.0","xlsx":"https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz","fflate":"^0.8.3","express":"^5.3.0","csv-parse":"^7.0.3","csv-stringify":"^6.6.0","express-rate-limit":"^8.7.3","@modelcontextprotocol/sdk":"^1.32.2"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.15","vitest":"^4.0.0","typescript":"~5.9.3","@types/node":"^24.19.2","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/data-analyst-mcp_0.5.0_1794154818157_0.5294729962523929","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"data-analyst-mcp","version":"0.6.0","keywords":["mcp","model-context-protocol","government-data","data.gov","census","bea"],"license":"MIT","_id":"data-analyst-mcp@0.6.0","maintainers":[{"name":"sevenzsu","email":"azure.ss@gmail.com"}],"homepage":"https://github.com/zsu/data-analyst-mcp#readme","bugs":{"url":"https://github.com/zsu/data-analyst-mcp/issues"},"bin":{"data-analyst-mcp":"dist/bin/cli.js"},"dist":{"shasum":"2a577c45256089154ed42ba99ac47bceb21ac399","tarball":"https://registry.npmjs.org/data-analyst-mcp/-/data-analyst-mcp-0.6.0.tgz","fileCount":739,"integrity":"sha512-zoafMPzy8yzzN2KIaONUmTThB5e35nLBxHqY76tYQU/Mb8MAhdww+1dMrEG5QMfSbrZ777poBK0iH6UMQ76yqg==","signatures":[{"sig":"MEUCIQCureyboVKVnrL7d9ahkUDirTT2Uk7llWUvzN2LdijdbwIgbowwlwPY4OIRLHquUTjowEPpNRVPwNORVjX6pDveDAU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDZRK9J4Fc57k2KrI6CCfP4x5khSFPc6HeNmlIv0h3pBQIhAPKjgCl1c76GuxXs3LZBc+QrjFuRD+S0QDcuAzLQvJP9","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/data-analyst-mcp@0.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":7725198},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"5000f39865302eb1cfa1f397f7d4a755045486b0","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","smoke":"tsx scripts/smoke.ts","start":"node dist/bin/cli.js","typecheck":"tsc -p tsconfig.json --noEmit && tsc -p tsconfig.test.json","smoke:http":"tsx scripts/smoke-http.ts","prepublishOnly":"npm run typecheck && npm test && npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"db10bbf2-3887-46ef-a87f-70184fa8e580"}},"repository":{"url":"git+https://github.com/zsu/data-analyst-mcp.git","type":"git"},"_npmVersion":"11.19.1","description":"MCP server for U.S. government data: asks the critical questions first, fetches from the agency, cites every number.","directories":{},"_nodeVersion":"24.22.2","dependencies":{"zod":"^4.1.0","xlsx":"https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz","fflate":"^0.8.3","express":"^5.3.0","csv-parse":"^7.0.3","csv-stringify":"^6.6.0","express-rate-limit":"^8.7.3","@modelcontextprotocol/sdk":"^1.32.2"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.15","vitest":"^4.0.0","typescript":"~5.9.3","@types/node":"^24.19.2","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/data-analyst-mcp_0.6.0_1794163047298_0.8119560586884204","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"data-analyst-mcp","version":"0.7.0","keywords":["mcp","model-context-protocol","government-data","data.gov","census","bea"],"license":"MIT","_id":"data-analyst-mcp@0.7.0","maintainers":[{"name":"sevenzsu","email":"azure.ss@gmail.com"}],"homepage":"https://github.com/zsu/data-analyst-mcp#readme","bugs":{"url":"https://github.com/zsu/data-analyst-mcp/issues"},"bin":{"data-analyst-mcp":"dist/bin/cli.js"},"dist":{"shasum":"e9e9b8f8b318af1ed03126a43f12277a8c08f249","tarball":"https://registry.npmjs.org/data-analyst-mcp/-/data-analyst-mcp-0.7.0.tgz","fileCount":748,"integrity":"sha512-G0YEWc+RJy2nWOJWGTdZOJI1AHI7RVcr47TXr8CCRar7GE3eNHHE/sY75XCIPSKNcrZpfQD6xXONLtAKCF1YlA==","signatures":[{"sig":"MEUCICrOk0leop1Wjra+Sq84Lj3Pj4DCXdaUIlN2e+1U+f7RAiEAo4te6BYTnavFTLtl+pay+TO7hKkmcHejfcJ9j7EOsak=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIE7EC+bR2uWyp5wqogSEMPNvn1O1T/mk5shLF/Z82LiBAiAc/2qwTA4c1DLdRCeF1iPDbwlEoTp4ZGvR1aYCbmLKWg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/data-analyst-mcp@0.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":7764098},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"31b958fe6741023987ef65a0a12fe2a8d5cc448a","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","smoke":"tsx scripts/smoke.ts","start":"node dist/bin/cli.js","typecheck":"tsc -p tsconfig.json --noEmit && tsc -p tsconfig.test.json","smoke:http":"tsx scripts/smoke-http.ts","prepublishOnly":"npm run typecheck && npm test && npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"db10bbf2-3887-46ef-a87f-70184fa8e580"}},"repository":{"url":"git+https://github.com/zsu/data-analyst-mcp.git","type":"git"},"_npmVersion":"11.19.1","description":"MCP server for U.S. government data: asks the critical questions first, fetches from the agency, cites every number.","directories":{},"_nodeVersion":"24.22.2","dependencies":{"zod":"^4.1.0","xlsx":"https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz","fflate":"^0.8.3","express":"^5.3.0","csv-parse":"^7.0.3","csv-stringify":"^6.6.0","express-rate-limit":"^8.7.3","@modelcontextprotocol/sdk":"^1.32.2"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.15","vitest":"^4.0.0","typescript":"~5.9.3","@types/node":"^24.19.2","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/data-analyst-mcp_0.7.0_1794171564798_0.20989028327051507","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"data-analyst-mcp","version":"0.8.0","keywords":["mcp","model-context-protocol","government-data","data.gov","census","bea"],"license":"MIT","_id":"data-analyst-mcp@0.8.0","maintainers":[{"name":"sevenzsu","email":"azure.ss@gmail.com"}],"homepage":"https://github.com/zsu/data-analyst-mcp#readme","bugs":{"url":"https://github.com/zsu/data-analyst-mcp/issues"},"bin":{"data-analyst-mcp":"dist/bin/cli.js"},"dist":{"shasum":"bee17f832488ff776f81e4e7b6d59ee83921488d","tarball":"https://registry.npmjs.org/data-analyst-mcp/-/data-analyst-mcp-0.8.0.tgz","fileCount":763,"integrity":"sha512-Hs+0oVuUwlK7aMFntOmioOF3evgX8bqnOgWxG46J8UFYScWYvq7hiZFRj6nU+frUKcRt2YJfYzniPqPvlh79eg==","signatures":[{"sig":"MEQCIHypkQHbVHCK00ohbS2LZOfMst/uox//8iMPVL6oOJXAAiADVCA93zwllxmd4B97R9RTgoBqMIzvNySIF9J8q/HtJA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDH0f7h3fXNMUaDOzHDJ5Xo49diEy5B3VxacwJIUn/hBQIgTkXT4/8oQS/KV87KwKYmItv/87KDhAd763JJ4fIcM6Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/data-analyst-mcp@0.8.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":7863416},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"e16b7c02f68d757cc25fc03710743ecb41c3ccf7","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","smoke":"tsx scripts/smoke.ts","start":"node dist/bin/cli.js","typecheck":"tsc -p tsconfig.json --noEmit && tsc -p tsconfig.test.json","smoke:http":"tsx scripts/smoke-http.ts","prepublishOnly":"npm run typecheck && npm test && npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"db10bbf2-3887-46ef-a87f-70184fa8e580"}},"repository":{"url":"git+https://github.com/zsu/data-analyst-mcp.git","type":"git"},"_npmVersion":"11.19.1","description":"MCP server for U.S. government data: asks the critical questions first, fetches from the agency, cites every number.","directories":{},"_nodeVersion":"24.22.2","dependencies":{"zod":"^4.1.0","xlsx":"https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz","fflate":"^0.8.3","express":"^5.3.0","csv-parse":"^7.0.3","csv-stringify":"^6.6.0","express-rate-limit":"^8.7.3","@modelcontextprotocol/sdk":"^1.32.2"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.15","vitest":"^4.0.0","typescript":"~5.9.3","@types/node":"^24.19.2","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/data-analyst-mcp_0.8.0_1794178947452_0.7228784394721048","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"_id":"data-analyst-mcp@0.9.0","bin":{"data-analyst-mcp":"dist/bin/cli.js"},"bugs":{"url":"https://github.com/zsu/data-analyst-mcp/issues"},"dist":{"shasum":"98100eccd630a6519ae6baa66976b073f89de46c","tarball":"https://registry.npmjs.org/data-analyst-mcp/-/data-analyst-mcp-0.9.0.tgz","fileCount":769,"integrity":"sha512-MIKcYY1clfMWfdpRq4EjkRBVW5EWPflAlLhpVm4744i0X4tq/tv0x+2JSsVlrAuDLzNjBgdGUGGtbFKmZQ/D+Q==","signatures":[{"sig":"MEUCIHb3Z25jMeWR7sDLq4fNQ8mssdLKkZR6UvCLQNmZxUYiAiEAtWTS22AVFqFMnm04RXyU+1vy4z3msPNAo8OqFmJVav8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCHI4c5qddjyw5M+y0FGhEnzSGvGUIY59Chcya+AQYyFQIhAM3f/0hg1rHl1+tezrq9k1S7HEbNqaInXtKjN9wI29XZ"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/data-analyst-mcp@0.9.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":7885385},"main":"dist/index.js","name":"data-analyst-mcp","type":"module","types":"dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"1db71debe868dac2e3459619fcf059dfefd12e4f","license":"MIT","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","smoke":"tsx scripts/smoke.ts","start":"node dist/bin/cli.js","typecheck":"tsc -p tsconfig.json --noEmit && tsc -p tsconfig.test.json","smoke:http":"tsx scripts/smoke-http.ts","prepublishOnly":"npm run typecheck && npm test && npm run build"},"version":"0.9.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"db10bbf2-3887-46ef-a87f-70184fa8e580"}},"homepage":"https://github.com/zsu/data-analyst-mcp#readme","keywords":["mcp","model-context-protocol","government-data","data.gov","census","bea"],"repository":{"url":"git+https://github.com/zsu/data-analyst-mcp.git","type":"git"},"_npmVersion":"11.19.1","description":"MCP server for U.S. government data: asks the critical questions first, fetches from the agency, cites every number.","directories":{},"maintainers":[{"name":"sevenzsu","email":"azure.ss@gmail.com"}],"_nodeVersion":"24.22.2","dependencies":{"zod":"^4.1.0","xlsx":"https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz","fflate":"^0.8.3","express":"^5.3.0","csv-parse":"^7.0.3","csv-stringify":"^6.6.0","express-rate-limit":"^8.7.3","@modelcontextprotocol/sdk":"^1.32.2"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.15","vitest":"^4.0.0","typescript":"~5.9.3","@types/node":"^24.19.2","@types/express":"^5.0.6"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/data-analyst-mcp_0.9.0_1794404174337_0.49851676417702806"}}},"time":{"created":"2026-11-07T21:23:38.387Z","modified":"2026-11-11T13:36:14.888Z","0.0.0-stage":"2026-11-07T21:23:38.387Z","0.3.0":"2026-11-07T21:26:15.841Z","0.3.1":"2026-11-07T23:02:56.764Z","0.4.0":"2026-11-08T00:46:30.682Z","0.5.0":"2026-11-08T16:20:18.349Z","0.6.0":"2026-11-08T18:37:27.442Z","0.7.0":"2026-11-08T20:59:24.924Z","0.8.0":"2026-11-08T23:02:27.591Z","0.9.0":"2026-11-11T13:36:14.477Z"},"bugs":{"url":"https://github.com/zsu/data-analyst-mcp/issues"},"license":"MIT","homepage":"https://github.com/zsu/data-analyst-mcp#readme","keywords":["mcp","model-context-protocol","government-data","data.gov","census","bea"],"repository":{"url":"git+https://github.com/zsu/data-analyst-mcp.git","type":"git"},"description":"MCP server for U.S. government data: asks the critical questions first, fetches from the agency, cites every number.","maintainers":[{"name":"sevenzsu","email":"azure.ss@gmail.com"}],"readme":"# data-analyst-mcp\n\nAn MCP server for official U.S. government data. It asks the user the questions that change a headline\nnumber before fetching anything, gets the data from the agency at call time, packages it (CSV, data\ndictionary, provenance) and cites every result. It covers 77 sources.\n\n> **Status: 0.3.** All 77 sources work, along with the analysis and audit tools, hosted mode (streamable HTTP, a\n> claude.ai connector) and per-user keys. The test suite runs offline on recorded fixtures.\n> One gap remains: usda-fna's three PDF endpoints need a PDF text reader, and return `not_supported`.\n> Four sources are manual only, because their sites refuse scripts: cdc-wonder, hud-ahar, foreign-assistance and\n> cpsc's NEISS endpoint (`manual_bundle` gives the links, `ingest` reads the saved file).\n> The package is not published to npm yet.\n\n## Install\n\nRequires Node.js 22 or later. Most sources need no key, so steps 2 and 3 are optional.\n\n### 1. Add the server to your client\n\n**Claude Code**\n\n```bash\nclaude mcp add data-analyst -- npx -y data-analyst-mcp\n```\n\nAdd `--scope user` to make it available in every project. To pass a key here, put `-e` before the `--`, for example\n`claude mcp add data-analyst -e DATA_GOV_API_KEY=your-key -- npx -y data-analyst-mcp`.\n\n**Claude Desktop**: `claude_desktop_config.json`, in `~/Library/Application Support/Claude/` (macOS) or\n`%APPDATA%\\Claude\\` (Windows). Settings → Developer → Edit Config opens it. Restart Claude Desktop after editing.\n\n```json\n{\n  \"mcpServers\": {\n    \"data-analyst\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"data-analyst-mcp\"],\n      \"env\": { \"DATA_GOV_API_KEY\": \"your-key\" }\n    }\n  }\n}\n```\n\n**Cursor**: the same `mcpServers` block in `~/.cursor/mcp.json` (every project) or `.cursor/mcp.json` (one project).\n\n**VS Code**: `.vscode/mcp.json` uses `servers` instead of `mcpServers`. An `inputs` entry makes VS Code ask for the key\nonce and store it, so the key is not written into a file you might commit.\n\n```json\n{\n  \"inputs\": [\n    { \"type\": \"promptString\", \"id\": \"data-gov-key\", \"description\": \"api.data.gov API key\", \"password\": true }\n  ],\n  \"servers\": {\n    \"data-analyst\": {\n      \"type\": \"stdio\",\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"data-analyst-mcp\"],\n      \"env\": { \"DATA_GOV_API_KEY\": \"${input:data-gov-key}\" }\n    }\n  }\n}\n```\n\n**Codex**: `~/.codex/config.toml`\n\n```toml\n[mcp_servers.data-analyst]\ncommand = \"npx\"\nargs = [\"-y\", \"data-analyst-mcp\"]\n\n[mcp_servers.data-analyst.env]\nDATA_GOV_API_KEY = \"your-key\"\n```\n\nLeave out the `env` block if you have no keys, or if you store them with `setup` (step 2).\n\n**Until the package is published to npm**, build it and point the client at the build:\n\n```bash\ngit clone https://github.com/zsu/data-analyst-mcp.git\n```\n\n```bash\ncd data-analyst-mcp && npm install && npm run build\n```\n\nThen use `\"command\": \"node\", \"args\": [\"<path>/data-analyst-mcp/dist/bin/cli.js\"]` in the configs above, and\n`node dist/bin/cli.js setup <source>` in place of `npx -y data-analyst-mcp setup <source>` below.\n\n### 2. Add keys (optional)\n\nEach key is free. Without a key, a source either falls back to a keyless route with lower limits, or offers a\nmanual download (`manual_bundle`): the user downloads the files in a browser, and the server packages them.\n\n| Variable | Sources | Without it | Free key |\n|---|---|---|---|\n| `AQS_API_KEY` + `AQS_EMAIL` | epa-aqs | manual download only | [aqs.epa.gov](https://aqs.epa.gov/data/api/signup?email=YOUR_EMAIL) |\n| `BEA_API_KEY` | bea | bulk files for the main tables; the API-only datasets need the key | [apps.bea.gov](https://apps.bea.gov/API/signup/) |\n| `BLS_API_KEY` | bls | 25 queries a day, 25 series and 10 years each; no annual averages or catalog titles | [data.bls.gov](https://data.bls.gov/registrationEngine/) |\n| `CENSUS_API_KEY` | census | manual download only | [api.census.gov](https://api.census.gov/data/key_signup.html) |\n| `DATA_GOV_API_KEY` | college-scorecard, congress, fbi, fda, fec, govinfo, nrel, regulations, usda-fooddata, usgs | `DEMO_KEY` or keyless, at a few requests an hour (fda: 1,000 a day; usgs earthquakes never need a key) | [api.data.gov](https://api.data.gov/signup/) |\n| `DOL_API_KEY` | dol | catalog and field lists only; data queries need the key | [dataportal.dol.gov](https://dataportal.dol.gov/registration) |\n| `EIA_API_KEY` | eia | `DEMO_KEY`, about 10 requests an hour | [eia.gov](https://www.eia.gov/opendata/register.php) |\n| `FRED_API_KEY` | fred | observations only; search, vintages, revision history and GeoFRED need the key | [fredaccount.stlouisfed.org](https://fredaccount.stlouisfed.org/apikeys) |\n| `HUD_USER_TOKEN` | hud | manual download only | [huduser.gov](https://www.huduser.gov/hudapi/public/register) |\n| `IPUMS_API_KEY` | ipums | build the extract on the IPUMS website (free account) | [account.ipums.org](https://account.ipums.org/api_keys) |\n| `LDA_API_KEY` | senate-lobbying | 15 requests a minute instead of 120 | [lda.gov](https://lda.gov/api/register/) |\n| `NOAA_API_KEY` | noaa | the keyless data and station-search endpoints; Climate Data Online v2 needs the key | [ncei.noaa.gov](https://www.ncei.noaa.gov/cdo-web/token) |\n| `USDA_NASS_API_KEY` | usda-nass | manual download only | [quickstats.nass.usda.gov](https://quickstats.nass.usda.gov/api) |\n| `USPTO_API_KEY` | uspto | manual download only | [data.uspto.gov](https://data.uspto.gov/apis/getting-started) |\n\nTwo settings are not keys. SEC asks every client to identify itself, so set `SEC_USER_AGENT` to your name and email\n(`\"Jane Doe jane@example.com\"`). `NWS_USER_AGENT` is optional and does the same for the weather service.\n\n**Store a key with `setup` (recommended).** It shows the signup link, reads the key with hidden input, and writes\nit to `~/.config/data-analyst/keys.json`. The key stays out of client config files, and every client reads it. It\nworks mid-session, with no restart.\n\n```bash\nnpx -y data-analyst-mcp setup congress\n```\n\n`setup` takes any source that uses the key: `setup congress` stores `DATA_GOV_API_KEY`, and all 10 api.data.gov\nsources use it. `setup epa-aqs` also asks for `AQS_EMAIL`. Or put the variables in the client's `env` block, as in step 1.\n[API keys](#api-keys) lists every place the server looks.\n\n### 3. Check it\n\nAsk your assistant: *\"Is my api.data.gov key set up?\"* The `check_key` tool reports whether the key was found and where,\nnever its value. For census, eia, epa-aqs, noaa, usgs, bea, fred and ipums it also tests the key with one small call\nto the agency's own site and says whether it was accepted, rejected or the site could not be reached. To list only the sources you can use, start the server with `--hide-unconfigured` (see\n[Options](#options)).\n\n### 4. Try it\n\n- *\"How has the unemployment rate compared with CPI inflation since 2020?\"*\n- *\"What is the median household income in each county of Ohio?\"*\n- *\"Which drugs had the most reported adverse events last year?\"*\n- *\"How much did each federal agency spend in fiscal year 2024?\"*\n- *\"How many unhealthy air-quality days did Phoenix have in 2023?\"*\n\nThe assistant asks the questions that change the answer first (which measure, which years, which population),\nthen fetches, computes and cites.\n\nTo host the server for claude.ai or a team, see [docs/hosting.md](docs/hosting.md).\n\n## How it works\n\n| Tool | What it does |\n|---|---|\n| `guide` | the method: framing, asking only critical questions, the accuracy checklist, combining sources |\n| `find_sources` | ranks the sources for a question, or lists them all |\n| `source_brief` | one source's playbook, its **questions_to_ask**, key status, rules and request index |\n| `request_schema` | full parameters of the requests to use; searches a source's catalog |\n| `record_decisions` | how each critical question was settled (answered, Don't know, skipped, not asked and why) |\n| `fetch` | downloads into the session workspace; returns a summary, the files, the citation and notes |\n| `manual_bundle`, `ingest` | a one-command download for the user's own computer, then packaging what they downloaded |\n| `compute` | builds exhibits from the full tables with declarative steps (a whitelisted expression language, no eval); the steps are recorded for `rerun` |\n| `facts`, `write_table`, `cite` | register the numbers cited, write the benchmark and sensitivity tables, snapshot cited pages |\n| `audit_answer`, `rerun` | the release gate: every number in the answer is a registered fact, the method record is complete, and the analysis reproduces |\n| `build_report`, `style_check`, `audit_report` | an HTML report and replication ZIP, only when asked |\n| `handoff` | the per-source data hand-off |\n| `check_key` | whether a key is set up (never shows it), and tested live where the source allows |\n| `read_file` | a small text file from the workspace |\n| `open_workspace` | after a server restart (which starts a new, empty workspace), lists the earlier workspaces and reopens one (local server only) |\n\n**Asking before fetching is enforced, not just suggested.** `fetch` returns `gate_blocked` until, for that\nsource, the model has read `source_brief` and the schemas of the requests it uses, and has recorded how each\ncritical question was settled. The model asks the questions in chat, in one round. A blocking question that\nthe user skips is asked once more. The server also exposes an `analyze` prompt and `source://<id>`\nresources, for clients that let users pick prompts or attach resources.\n\n**Results** have one shape. Success: `{status: \"ok\" | \"partial\", summary, files, citation, notes}`. Failure:\n`{status: \"error\", code, message, fix, retry_after_s?}`. The codes are `invalid_request`, `not_found`,\n`not_supported`, `agency_rejected`, `agency_unavailable`, `key_missing`, `key_rejected`, `rate_limited`,\n`gate_blocked`, `in_progress` and `server_error`. `in_progress` comes from a rerun (`rerun`, or an audit with\n`rerun: true`) that needs longer than a client waits for one call: the replay continues in a worker thread,\nthe same call made again waits on that same replay, and the finished result is kept until the workspace\nchanges. `DATA_ANALYST_RERUN_WAIT_S` sets how long a call waits first (default 45 seconds). The replay gets its own heap,\n`DATA_ANALYST_RERUN_HEAP_MB` (default: 60 percent of the memory the process may use, a container's limit when it\nhas one); if it runs out, the audit reports that, and the server keeps running.\n\n## Options\n\n| Option (flag / environment) | What it does |\n|---|---|\n| `--sources fred,treasury` / `DATA_ANALYST_SOURCES` | serve only these sources |\n| `--domains economy,health` / `DATA_ANALYST_DOMAINS` | serve only the sources in these domains |\n| `--hide-unconfigured` / `DATA_ANALYST_HIDE_UNCONFIGURED=1` | leave out of listings the sources whose required key is not set up |\n| `--workspace <folder>` / `DATA_ANALYST_WORKSPACE` | (stdio) one fixed analysis folder, so a fetch is reused after a restart |\n\n```json\n{ \"mcpServers\": { \"data-analyst\": { \"command\": \"npx\", \"args\": [\"-y\", \"data-analyst-mcp\", \"--domains\", \"economy,health\"] } } }\n```\n\nThe tool list stays the same size whatever is enabled: sources are found with `find_sources`, not loaded as\ntools.\n\nEvery result lists its upstream requests (`requests`: method, credential-free URL, status, cached, time), and\n`citation` names the publisher, page and retrieval date. Requests are rate-limited per host (a token bucket),\nretried with backoff on 429 and 5xx (honoring Retry-After), and kept within each agency's per-minute budgets.\n\n**Caching follows each source's terms.**\n- A source whose policy allows persistent copies (`cache.mode: persistent`) can be cached on disk in\n  `DATA_ANALYST_CACHE` (default `~/.cache/data-analyst`). census and bea do; opm's terms allow it, but its port\n  downloads again for now.\n- Most sources allow reuse only inside the analysis folder, and FRED none at all. For those, a fixed\n  `--workspace` gives reuse across restarts without keeping copies anywhere else.\n\n## As a library\n\n```ts\nimport { route, brief, fetchSource, compute, registerFacts } from \"data-analyst-mcp\";\n\nconst r = await fetchSource(\"cdc\", { description: \"NY deaths 2017\", requests: [{ name: \"ny\", endpoint: \"query\",\n  params: { dataset: \"leading_death\", $where: \"state = 'New York' AND year = '2017'\" } }] }, { out: \"./out/ny\" });\nconsole.log(r.summary.tables[0].rows, r.citation.text);\n```\n\n- **The functions:** the same sources, engine, analysis and audits as the server. The exports are `listSources`,\n  `route`, `brief`, `requestSchema`, `fetchSource`, `ingest`, `manualBundle`, `compute`, `registerFacts`,\n  `writeTable`, `rerun`, `recordDecisions`, `auditAnswer`, `buildReport`, `auditReport`, `createServer` and\n  `createApp`, plus their types.\n- **No ask-first gate:** it is for assistants, so the library leaves it out.\n- **Errors:** a failure throws `ToolError`; its `failure` holds the code and the fix.\n\n## API keys\n\n[Install, step 2](#2-add-keys-optional) lists the keys and how to get them. When a fetch needs a key that is not set up,\n`fetch` returns `key_missing` with a `setup` command for **you** to run in your own terminal. The model never asks\nfor a key in chat. `setup` writes `~/.config/data-analyst/keys.json`.\n\nThe local (stdio) server looks for a key in this order. `DATA_GOV_API_KEY` is the example; each source's variable is named in\nits `source_brief`.\n\n1. The `DATA_GOV_API_KEY` environment variable, for example in the MCP client's `env` block.\n2. The file named by `DATA_GOV_API_KEY_FILE` (for secret managers and mounted secrets).\n3. `\"env\": {\"DATA_GOV_API_KEY\": \"...\"}` in `~/.config/data-analyst/keys.json` (or `$DATA_ANALYST_CONFIG_DIR/keys.json`).\n   `setup` writes this file.\n4. `\"env\": {\"DATA_GOV_API_KEY\": \"...\"}` in Claude Code's `~/.claude/settings.json` (or `$CLAUDE_CONFIG_DIR/settings.json`).\n5. `~/.data-gov/api_key`, a file that holds only the key.\n\nThe files are read again on each lookup, so a key stored during a session works without a restart.\n\nWhat the server guarantees, and tests check:\n\n- **No key in any result.** Every tool result, error, prompt and resource is redacted for every key the server can\n  find, in every form it can be echoed in (as is, URL-encoded, JSON-escaped).\n- **No tool reads a key file.** A path the model names (`ingest`, a `for_each` table, `report.json` paths,\n  `read_file`) is refused when it is one of the files above, a `.env` file, `~/.ssh`, `~/.aws` or a similar place,\n  or when the file holds a key.\n- **No key in a written file.** A key an agency echoes is replaced with `[REDACTED]` in every file written to the\n  workspace (the result says which), and never reaches the download cache or a replication package.\n- **A key goes only to its agency:** never along a next-page link to another site, never from https to http. On a\n  redirect to another host, a key in the URL or a header is dropped; a key in the request body (BLS) follows a\n  307/308 redirect wherever it points.\n\n**What the server cannot stop:** an assistant that has its own file or shell tools (Claude Code does) can open the\nkey files itself. `setup` prints the Claude Code rule that blocks this; add it to the `permissions.deny` list of your\n`~/.claude/settings.json`, for example:\n\n```json\n{ \"permissions\": { \"deny\": [\"Read(~/.config/data-analyst/**)\", \"Edit(~/.config/data-analyst/**)\"] } }\n```\n\nPrefer `setup` (or a secret manager through `<VAR>_FILE`) over the `env` block of `~/.claude/settings.json`: that\nfile is one Claude Code reads anyway. The hosted server reads keys only from its environment and from each user's\nencrypted store (see [docs/hosting.md](docs/hosting.md)).\n\n## Hosted mode (claude.ai connector)\n\n`data-analyst-mcp serve --http` serves MCP at `/mcp` over streamable HTTP. With `DATA_ANALYST_ACCOUNTS=1`, users\nsign in through OAuth and store their own API keys on a write-only page. The keys are encrypted at rest, and the\nmodel never sees them. See [docs/hosting.md](docs/hosting.md) and the `Dockerfile`.\n\n## Workspace\n\nEach session writes to its own folder under `$DATA_ANALYST_OUT` (default: the system temp folder,\n`data-analyst-mcp/<session>`), with `data/<source>/` and `decisions.json` inside. Nothing is written inside the\npackage. A local server that restarts (a client may restart it after a call it gave up on) starts a new folder;\nthe earlier one stays, and `open_workspace` reopens it. `--workspace <folder>` keeps one fixed folder instead.\n\n## Development\n\n```bash\nnpm install\nnpm test\nnpm run build\nnpm run smoke\n```\n\n- `npm test` runs offline, on recorded fixtures.\n- `npm run smoke` drives the built server over stdio and makes one live fetch.\n","readmeFilename":"README.md"}