{"_id":"agnost","_rev":"14-63651d74661ee62b20e4ccb9231c4274","name":"agnost","dist-tags":{"latest":"0.2.1"},"versions":{"0.1.0":{"name":"agnost","version":"0.1.0","keywords":["analytics","mcp","model context protocol","ai","tools"],"author":{"name":"Agnost AI","email":"founders@agnost.ai"},"_id":"agnost@0.1.0","maintainers":[{"name":"prrthh132","email":"ajmeraparth132@gmail.com"}],"homepage":"https://github.com/agnost-ai/analytics-sdk","bugs":{"url":"https://docs.agnost.ai"},"dist":{"shasum":"4bdb19c422936e65e6dac229cafa9ac0d74a804e","tarball":"https://registry.npmjs.org/agnost/-/agnost-0.1.0.tgz","fileCount":40,"integrity":"sha512-7DKIJZHSmZWzFKQzGb8K/XRuhljSntjOVzXrndVbTE0cg9mT5gQOSkyNJACS7hRn9H4O+a5yLfh671pLvtXxDg==","signatures":[{"sig":"MEQCIDYmkAPPKzUYIzozm8G5skaxKA6Yrl06rSvjkLXNk94VAiBTUZ/O2O8u3AsGIEPoP4flVnpB4YAovf90w3BMUl05bQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":79658},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"dae2502e2da71541107d569872352244667ed3e0","scripts":{"test":"jest","build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"prrthh132","email":"ajmeraparth132@gmail.com"},"repository":{"url":"git+https://github.com/agnostai/agnostai.git","type":"git"},"_npmVersion":"10.9.2","description":"Analytics SDK for Model Context Protocol Servers","directories":{},"_nodeVersion":"23.11.0","dependencies":{"uuid":"^9.0.0","axios":"^1.4.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","vitest":"^3.2.4","typescript":"^5.9.2","@types/jest":"^29.0.0","@types/node":"^18.19.127","@types/uuid":"^10.0.0","@types/express":"^5.0.3"},"peerDependencies":{"@modelcontextprotocol/sdk":"^0.5.0"},"peerDependenciesMeta":{"@modelcontextprotocol/sdk":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/agnost_0.1.0_1758812444772_0.31033133483590825","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"agnost","version":"0.1.1","keywords":["analytics","mcp","model context protocol","ai","tools"],"author":{"name":"Agnost AI","email":"founders@agnost.ai"},"_id":"agnost@0.1.1","maintainers":[{"name":"prrthh132","email":"ajmeraparth132@gmail.com"}],"homepage":"https://agnost.ai","bugs":{"url":"https://docs.agnost.ai"},"dist":{"shasum":"f29be678db6b02fc8dbe2d77e29262c4863e56ea","tarball":"https://registry.npmjs.org/agnost/-/agnost-0.1.1.tgz","fileCount":34,"integrity":"sha512-31WunIgpoyW/hGkSBQ/xV/k/eGJ4HkH/X864kJLXPXtsvZX6wrBnSWlrhCAGE3brcFVRN05dI6fSRF2qH4UdPg==","signatures":[{"sig":"MEUCICllXyqaLeu83yHlRCoXBQJaSYkMr+ni4FUeoaH4N3WGAiEAo630HlKYHKh1QieweSZETP/f/Cap95YagV/aRzlpVm0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":60850},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"6c7d8c575e0a8706edb9bcd19b875ad167c33297","scripts":{"test":"jest","build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"prrthh132","email":"ajmeraparth132@gmail.com"},"_npmVersion":"10.9.2","description":"Analytics SDK for Model Context Protocol Servers","directories":{},"_nodeVersion":"23.11.1","dependencies":{"uuid":"^9.0.0","axios":"^1.4.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","vitest":"^3.2.4","typescript":"^5.9.2","@types/jest":"^29.0.0","@types/node":"^18.19.127","@types/uuid":"^10.0.0","@types/express":"^5.0.3"},"_npmOperationalInternal":{"tmp":"tmp/agnost_0.1.1_1758837321282_0.7216845411861696","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"agnost","version":"0.1.2","keywords":["analytics","mcp","model context protocol","ai","tools"],"author":{"name":"Agnost AI","email":"founders@agnost.ai"},"_id":"agnost@0.1.2","maintainers":[{"name":"prrthh132","email":"ajmeraparth132@gmail.com"}],"homepage":"https://agnost.ai","bugs":{"url":"https://docs.agnost.ai"},"dist":{"shasum":"25e92f9032961cbea1061d055679cfc370a9ce8f","tarball":"https://registry.npmjs.org/agnost/-/agnost-0.1.2.tgz","fileCount":34,"integrity":"sha512-vTxJm1j9OK4x5Hvm8vjLMVimzwmIYegOvNSZfyy02Lip1eFHJEvr0H0YWYNiThci+WYbM9vBvjrHXDfN73tt1A==","signatures":[{"sig":"MEUCIQDAfsX6pEeNRnwc8xBrPiuNOTIf4i6ElAAiN9bgH3j7rQIgRSMgFHHJHGrr6AA7Nzcn9aXVv/UqlusK+LYA7bKpBn0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":65012},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"86206a8e3c97e7873174c316f718b361ee8f2c68","scripts":{"test":"jest","build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"prrthh132","email":"ajmeraparth132@gmail.com"},"_npmVersion":"10.9.2","description":"Analytics SDK for Model Context Protocol Servers","directories":{},"_nodeVersion":"23.11.1","dependencies":{"zod":"^3.25.76","uuid":"^9.0.0","axios":"^1.4.0","dotenv":"^17.2.2","@modelcontextprotocol/sdk":"^1.18.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","vitest":"^3.2.4","typescript":"^5.9.2","@types/jest":"^29.0.0","@types/node":"^18.19.127","@types/uuid":"^10.0.0","@types/express":"^5.0.3"},"_npmOperationalInternal":{"tmp":"tmp/agnost_0.1.2_1759130964681_0.045296964002802254","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"agnost","version":"0.1.3","keywords":["analytics","mcp","model context protocol","ai","tools"],"author":{"name":"Agnost AI","email":"founders@agnost.ai"},"_id":"agnost@0.1.3","maintainers":[{"name":"prrthh132","email":"ajmeraparth132@gmail.com"}],"homepage":"https://agnost.ai","bugs":{"url":"https://docs.agnost.ai"},"dist":{"shasum":"d83bbaeefb73b6ebdfaf2b755afb92a7c50715fb","tarball":"https://registry.npmjs.org/agnost/-/agnost-0.1.3.tgz","fileCount":34,"integrity":"sha512-ZR3Pj21kqULQq64MudVOEEuz7X5i4EaOy6rji8Kux1UtQyfjEPOzVCRuIbL6kSCFYoM3ZxBQeI2GqSas7py+Dw==","signatures":[{"sig":"MEQCIBlT0TJ5uDFVmth+tHujv/C77mNzDa34G4Qc9LttB6yUAiBUDovEnP3v7MpvpB1qn2PM5rXFYKgw8hIbWU7QCvHVQA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":64920},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"9f421957de4341d08e3531b4d61ad2eb1221c6d5","scripts":{"test":"jest","build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"prrthh132","email":"ajmeraparth132@gmail.com"},"_npmVersion":"10.9.2","description":"Analytics SDK for Model Context Protocol Servers","directories":{},"_nodeVersion":"23.11.1","dependencies":{"zod":"^3.25.76","uuid":"^9.0.0","axios":"^1.4.0","dotenv":"^17.2.2","@modelcontextprotocol/sdk":"^1.18.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","vitest":"^3.2.4","typescript":"^5.9.2","@types/jest":"^29.0.0","@types/node":"^18.19.127","@types/uuid":"^10.0.0","@types/express":"^5.0.3"},"_npmOperationalInternal":{"tmp":"tmp/agnost_0.1.3_1759142837729_0.9904141478582027","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"agnost","version":"0.1.4","keywords":["analytics","mcp","model context protocol","ai","tools"],"author":{"name":"Agnost AI","email":"founders@agnost.ai"},"_id":"agnost@0.1.4","maintainers":[{"name":"prrthh132","email":"ajmeraparth132@gmail.com"}],"homepage":"https://agnost.ai","bugs":{"url":"https://docs.agnost.ai"},"dist":{"shasum":"d4bb17d0c41dbfd951ea590c39410a64a04c7243","tarball":"https://registry.npmjs.org/agnost/-/agnost-0.1.4.tgz","fileCount":34,"integrity":"sha512-XtUdxj7lGgM+jLlLl9kbOvdWLzAxSlRGfxm4rsdemdqonQ422Q3W8dADVh3t5FXUxiPGElaOA0N6wFdAOIMn9A==","signatures":[{"sig":"MEUCIGEMoT21zU6AzCOtQ45D90QOJy6jrMlxQpMgBFKT18NxAiEA+RBo237vsWi8NDlI7BOEdJarQKFr2m0A8FeORTwGLAE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":71299},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"62bc9e64f28e04c521df74fbc2b184e8a8c856df","scripts":{"test":"jest","build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"prrthh132","email":"ajmeraparth132@gmail.com"},"_npmVersion":"10.9.2","description":"Analytics SDK for Model Context Protocol Servers","directories":{},"_nodeVersion":"23.11.1","dependencies":{"zod":"^3.25.76","uuid":"^9.0.0","axios":"^1.4.0","dotenv":"^17.2.2","@modelcontextprotocol/sdk":"^1.18.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","vitest":"^3.2.4","typescript":"^5.9.2","@types/jest":"^29.0.0","@types/node":"^18.19.127","@types/uuid":"^10.0.0","@types/express":"^5.0.3"},"_npmOperationalInternal":{"tmp":"tmp/agnost_0.1.4_1762512597892_0.9811035532282981","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"agnost","version":"0.1.5","keywords":["analytics","mcp","model context protocol","ai","tools"],"author":{"name":"Agnost AI","email":"founders@agnost.ai"},"_id":"agnost@0.1.5","maintainers":[{"name":"prrthh132","email":"ajmeraparth132@gmail.com"}],"homepage":"https://agnost.ai","bugs":{"url":"https://docs.agnost.ai"},"dist":{"shasum":"edcb44a357d1993ace6be7770dae25c260d1b0c2","tarball":"https://registry.npmjs.org/agnost/-/agnost-0.1.5.tgz","fileCount":34,"integrity":"sha512-aDDgP96uKi3D6+6feFOlWL8oXvRZL3VUrtnv7fnUmOIoQTV7Z8t1FJo5KvhsRw/CjMUIE96JixprcHGIb6AJPw==","signatures":[{"sig":"MEUCIQC7NEF5zqvwPpnY+KBYfA89LUTn+p4cr5t2MPyr7cI91QIgFpZ6U1rtP6RNZkK1fvIl/UCGTEiuL5t3RnP1pb//dVw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":71754},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"0e9220a9e9ef1dd20d3975fe0847065dddd92ac5","scripts":{"test":"jest","build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"prrthh132","email":"ajmeraparth132@gmail.com"},"_npmVersion":"10.9.2","description":"Analytics SDK for Model Context Protocol Servers","directories":{},"_nodeVersion":"23.11.1","dependencies":{"zod":"^3.25.76","uuid":"^9.0.0","axios":"^1.4.0","dotenv":"^17.2.2","@modelcontextprotocol/sdk":"^1.18.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","vitest":"^3.2.4","typescript":"^5.9.2","@types/jest":"^29.0.0","@types/node":"^18.19.127","@types/uuid":"^10.0.0","@types/express":"^5.0.3"},"_npmOperationalInternal":{"tmp":"tmp/agnost_0.1.5_1762518828491_0.5616717790243695","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"agnost","version":"0.1.6","keywords":["analytics","mcp","model context protocol","ai","tools"],"author":{"name":"Agnost AI","email":"founders@agnost.ai"},"_id":"agnost@0.1.6","maintainers":[{"name":"prrthh132","email":"ajmeraparth132@gmail.com"}],"homepage":"https://agnost.ai","bugs":{"url":"https://docs.agnost.ai"},"dist":{"shasum":"952f3992fc225384bd868163769a1b05197f32bb","tarball":"https://registry.npmjs.org/agnost/-/agnost-0.1.6.tgz","fileCount":34,"integrity":"sha512-4u1oZiESXHJjhZ265okglykKdcLlzW91fXnLP4WxzlEDaQ7x4ZtILwXvmXj4qbZeuP1fbL5ulaGK3OQ7IU/CkQ==","signatures":[{"sig":"MEUCIGV+XWKYf6IUb86Psg2/kCVUOaNtOFrLsCynTXQjrIjUAiEAh0qsoTGdxNUAbsB9hfg0th5m5ZNWIVRq2H8DBT/jOOs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":78806},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"acd908d19b5383dfea147b752f1ad360b6467db1","scripts":{"test":"jest","build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"prrthh132","email":"ajmeraparth132@gmail.com"},"_npmVersion":"10.9.2","description":"Analytics SDK for Model Context Protocol Servers","directories":{},"_nodeVersion":"23.11.1","dependencies":{"zod":"^3.25.76","uuid":"^9.0.0","axios":"^1.4.0","dotenv":"^17.2.2","@modelcontextprotocol/sdk":"^1.18.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","vitest":"^3.2.4","typescript":"^5.9.2","@types/jest":"^29.0.0","@types/node":"^18.19.127","@types/uuid":"^10.0.0","@types/express":"^5.0.3"},"_npmOperationalInternal":{"tmp":"tmp/agnost_0.1.6_1764879400400_0.4351260407186981","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"agnost","version":"0.1.7","keywords":["analytics","mcp","model context protocol","ai","tools"],"author":{"name":"Agnost AI","email":"founders@agnost.ai"},"_id":"agnost@0.1.7","maintainers":[{"name":"prrthh132","email":"ajmeraparth132@gmail.com"}],"homepage":"https://agnost.ai","bugs":{"url":"https://docs.agnost.ai"},"dist":{"shasum":"b9774501c36f483d5f72b4300998790da554b3a0","tarball":"https://registry.npmjs.org/agnost/-/agnost-0.1.7.tgz","fileCount":34,"integrity":"sha512-djIpQxgcbLbpGPbnKaGGBYopXBVT6vmu2V2isl4vgbPqTLSf6t+CKDSZGfAIT4VDe5vuZOlEQ6CD7W8vbpmacA==","signatures":[{"sig":"MEQCIBXAxwlhQUt4d8gVtb7/8wR0xB1MCT0XxiL+pOZCPw+qAiAKXvEAWFHx48Y3x2/5UBY7ptN6kzURWViKZHgZm7uSqQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":84830},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"7117ae1d5ad0ba19ddfaef20f0822e4e6866d573","scripts":{"test":"jest","build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"prrthh132","email":"ajmeraparth132@gmail.com"},"_npmVersion":"10.9.2","description":"Analytics SDK for Model Context Protocol Servers","directories":{},"_nodeVersion":"23.11.1","dependencies":{"zod":"^3.25.76","uuid":"^9.0.0","axios":"^1.4.0","dotenv":"^17.2.2","@modelcontextprotocol/sdk":"^1.18.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","vitest":"^3.2.4","typescript":"^5.9.2","@types/jest":"^29.0.0","@types/node":"^18.19.127","@types/uuid":"^10.0.0","@types/express":"^5.0.3"},"_npmOperationalInternal":{"tmp":"tmp/agnost_0.1.7_1764942579161_0.11061659193853357","host":"s3://npm-registry-packages-npm-production"}},"0.1.8":{"name":"agnost","version":"0.1.8","keywords":["analytics","mcp","model context protocol","ai","tools"],"author":{"name":"Agnost AI","email":"founders@agnost.ai"},"_id":"agnost@0.1.8","maintainers":[{"name":"prrthh132","email":"ajmeraparth132@gmail.com"}],"homepage":"https://agnost.ai","bugs":{"url":"https://docs.agnost.ai"},"dist":{"shasum":"b696a9cfb5f0445fab7efc8c057f647d212c8041","tarball":"https://registry.npmjs.org/agnost/-/agnost-0.1.8.tgz","fileCount":34,"integrity":"sha512-0558xURK3LQtD58vk8SrLOhJ5/mFylJ5AKbnOR6nAInJTItpZT2kWsMWoEPmBpiNkB6CAAhewK8RDnhv6omqvQ==","signatures":[{"sig":"MEQCIGMmOV6wBTRimjSgwMJDeXf93AOAcBKvyrLQzh+NjO+FAiBbj3z+3kxuULKArPGECXrKfgTck8o/7tCJSvJqEzTTfg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":99025},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"5dffc15e51013fcaf4681ea5210b160aeec3d637","scripts":{"test":"jest","build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"prrthh132","email":"ajmeraparth132@gmail.com"},"_npmVersion":"10.9.2","description":"Analytics SDK for Model Context Protocol Servers","directories":{},"_nodeVersion":"23.11.1","dependencies":{"zod":"^3.25.76","uuid":"^9.0.0","axios":"^1.4.0","dotenv":"^17.2.2","@modelcontextprotocol/sdk":"^1.18.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","vitest":"^3.2.4","typescript":"^5.9.2","@types/jest":"^29.0.0","@types/node":"^18.19.127","@types/uuid":"^10.0.0","@types/express":"^5.0.3"},"_npmOperationalInternal":{"tmp":"tmp/agnost_0.1.8_1770222997992_0.4666825642753676","host":"s3://npm-registry-packages-npm-production"}},"0.1.9":{"name":"agnost","version":"0.1.9","keywords":["analytics","mcp","model context protocol","ai","tools"],"author":{"name":"Agnost AI","email":"founders@agnost.ai"},"_id":"agnost@0.1.9","maintainers":[{"name":"prrthh132","email":"ajmeraparth132@gmail.com"}],"homepage":"https://agnost.ai","bugs":{"url":"https://docs.agnost.ai"},"dist":{"shasum":"2f5b2c81b766ce8c0ee5a834c321bf4081fb1283","tarball":"https://registry.npmjs.org/agnost/-/agnost-0.1.9.tgz","fileCount":34,"integrity":"sha512-02SUym2eis6RCVOFBhcPUCd9eU+pzQKqSCM5/gyf1fP7qoCYQAGWSi8Atw2vq0wpB2cFl2YjK357pVkVAy65lA==","signatures":[{"sig":"MEYCIQDlNSn8AUx2Ae5fHjkJ1+E87smxpylGoCLd5WdxrvoNhwIhALhC5GfbMwqJJTimb7BQZ3qI+rv+nGhIfjMTqSwhB4G9","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":101330},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"5aaa761cad33e3acfb1bc894ed48d212de8ca891","scripts":{"test":"jest","build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"prrthh132","email":"ajmeraparth132@gmail.com"},"_npmVersion":"10.9.2","description":"Analytics SDK for Model Context Protocol Servers","directories":{},"_nodeVersion":"23.11.1","dependencies":{"zod":"^3.25.76","uuid":"^9.0.0","axios":"^1.4.0","dotenv":"^17.2.2","@modelcontextprotocol/sdk":"^1.18.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","vitest":"^3.2.4","typescript":"^5.9.2","@types/jest":"^29.0.0","@types/node":"^18.19.127","@types/uuid":"^10.0.0","@types/express":"^5.0.3"},"_npmOperationalInternal":{"tmp":"tmp/agnost_0.1.9_1770332824564_0.4955440253874268","host":"s3://npm-registry-packages-npm-production"}},"0.1.10":{"name":"agnost","version":"0.1.10","keywords":["analytics","mcp","model context protocol","ai","tools"],"author":{"name":"Agnost AI","email":"founders@agnost.ai"},"_id":"agnost@0.1.10","maintainers":[{"name":"prrthh132","email":"ajmeraparth132@gmail.com"}],"homepage":"https://agnost.ai","bugs":{"url":"https://docs.agnost.ai"},"dist":{"shasum":"ceddca9cb7226adef2ad84e5fc62aa58dba082ee","tarball":"https://registry.npmjs.org/agnost/-/agnost-0.1.10.tgz","fileCount":34,"integrity":"sha512-zXMsVGeD0KuWcQ6OhpL5wHkF+6eawun1T1wx2tlCheQoGUtclRz/UKdsY9x9LE6gqczxzylmlIiUTN5gaQnPmg==","signatures":[{"sig":"MEUCIEAzi6X09j6EbkQfrxTpS5GMR3wr+M20uE7kIe1wbq/PAiEA2Z86BgpGa/FJSlyStCCko2OGlMAGnF93bEBMxA+jMqo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":108687},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"a1e6f27b83073065eef133fcf8b2f251aa54935a","scripts":{"test":"jest","build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"prrthh132","email":"ajmeraparth132@gmail.com"},"_npmVersion":"10.9.2","description":"Analytics SDK for Model Context Protocol Servers","directories":{},"_nodeVersion":"23.11.1","dependencies":{"zod":"^3.25.76","uuid":"^9.0.0","axios":"^1.4.0","dotenv":"^17.2.2","@modelcontextprotocol/sdk":"^1.18.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","vitest":"^3.2.4","typescript":"^5.9.2","@types/jest":"^29.0.0","@types/node":"^18.19.127","@types/uuid":"^10.0.0","@types/express":"^5.0.3"},"_npmOperationalInternal":{"tmp":"tmp/agnost_0.1.10_1770415652405_0.31765777662266603","host":"s3://npm-registry-packages-npm-production"}},"0.1.11":{"name":"agnost","version":"0.1.11","keywords":["analytics","mcp","model context protocol","ai","tools"],"author":{"name":"Agnost AI","email":"founders@agnost.ai"},"_id":"agnost@0.1.11","maintainers":[{"name":"prrthh132","email":"ajmeraparth132@gmail.com"}],"homepage":"https://agnost.ai","bugs":{"url":"https://docs.agnost.ai"},"dist":{"shasum":"a66c6f7b3223a47cfbc3c9a0ad84217af379b08b","tarball":"https://registry.npmjs.org/agnost/-/agnost-0.1.11.tgz","fileCount":34,"integrity":"sha512-xVwexk2R7SKmApDojVgH+gpmy4wYLF+rwzXZH81THMIJQgk5KId99MDbapUnYEDd3dHI70l14HtHmtvT8pFFiw==","signatures":[{"sig":"MEUCICjqD5SrOr9ryEhi2EHF7KlhREGlk8d4RXaA0pUD6Lv3AiEA8YLWIdi1FpWCYg+0kYsA94cGpoYbNANfwiGOrPuT4eM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110513},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"7ebfb1621acbefe8e71a839e101dfa4979d1bd45","scripts":{"test":"jest","build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"prrthh132","email":"ajmeraparth132@gmail.com"},"overrides":{"vite":">=7.1.11"},"_npmVersion":"10.9.2","description":"Analytics SDK for Model Context Protocol Servers","directories":{},"_nodeVersion":"23.11.1","dependencies":{"zod":"^3.25.76","uuid":"^9.0.0","axios":"^1.4.0","dotenv":"^17.2.2","@modelcontextprotocol/sdk":"^1.18.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","vitest":"^3.2.4","typescript":"^5.9.2","@types/jest":"^29.0.0","@types/node":"^18.19.127","@types/uuid":"^10.0.0","@types/express":"^5.0.3"},"_npmOperationalInternal":{"tmp":"tmp/agnost_0.1.11_1777406579813_0.333836076165968","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"agnost","version":"0.2.0","keywords":["analytics","mcp","model context protocol","ai","tools"],"author":{"name":"Agnost AI","email":"founders@agnost.ai"},"_id":"agnost@0.2.0","maintainers":[{"name":"prrthh132","email":"ajmeraparth132@gmail.com"}],"homepage":"https://agnost.ai","bugs":{"url":"https://docs.agnost.ai"},"dist":{"shasum":"6df39e4ae422d93b9fae48d2344a797d21361843","tarball":"https://registry.npmjs.org/agnost/-/agnost-0.2.0.tgz","fileCount":6,"integrity":"sha512-n00vpupTB8G6OSe33mQgeBbYmR+BfnnAZHuTJQY/YtxzHDJdWGdLFulzOzYa/wxHSiak5LG7183RU8uQoggMlQ==","signatures":[{"sig":"MEYCIQCjkqpVByS6UgAlYOMZX1uMT+OzMIKu190repKs//XQrwIhAPvbqQc+2tvycZ1y03l/0BqSYGKwZu4+uCFv5vB5MzCG","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":84383},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"cab26d29876d709e00ecdaecd747c43188e346fb","scripts":{"test":"NODE_OPTIONS=--expose-gc vitest run","build":"tsup","prepublishOnly":"npm run build"},"_npmUser":{"name":"prrthh132","email":"ajmeraparth132@gmail.com"},"overrides":{"vite":">=7.1.11"},"_npmVersion":"10.9.2","description":"Analytics SDK for Model Context Protocol Servers","directories":{},"_nodeVersion":"23.11.1","dependencies":{"zod":"^3.25.76","uuid":"^14.0.0","axios":"^1.4.0","dotenv":"^17.2.2","@modelcontextprotocol/sdk":"^1.18.2"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^4.1.10","typescript":"^5.9.2","@types/node":"^22.0.0","@types/uuid":"^10.0.0","@types/express":"^5.0.3"},"_npmOperationalInternal":{"tmp":"tmp/agnost_0.2.0_1783797169217_0.50406704356014","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"agnost","version":"0.2.1","description":"Analytics SDK for Model Context Protocol Servers","main":"dist/index.js","types":"dist/index.d.ts","type":"module","scripts":{"build":"tsup","prepublishOnly":"npm run build","test":"NODE_OPTIONS=--expose-gc vitest run"},"keywords":["analytics","mcp","model context protocol","ai","tools"],"author":{"name":"Agnost AI","email":"founders@agnost.ai"},"homepage":"https://agnost.ai","bugs":{"url":"https://docs.agnost.ai"},"overrides":{"vite":">=7.1.11"},"devDependencies":{"@types/express":"^5.0.3","@types/node":"^22.0.0","@types/uuid":"^10.0.0","tsup":"^8.0.0","typescript":"^5.9.2","vitest":"^4.1.10"},"dependencies":{"@modelcontextprotocol/sdk":"^1.18.2","axios":"^1.4.0","dotenv":"^17.2.2","uuid":"^14.0.0","zod":"^3.25.76"},"_id":"agnost@0.2.1","gitHead":"edf2715bcfe80245a1f7ecc5a9a26991b2d65860","_nodeVersion":"23.11.1","_npmVersion":"10.9.2","dist":{"integrity":"sha512-1sHj4sDC/MAHE48QgBgi0umQ2b0xvJrMg+SZyKM213fKkSXEHWPmUe76HM1Gyv3/ynGIk7tSjzOBgZKEeFggwg==","shasum":"d908ec2b277f8b7cc071ca4caf62ff94f7476fcc","tarball":"https://registry.npmjs.org/agnost/-/agnost-0.2.1.tgz","fileCount":6,"unpackedSize":87455,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIDJirzmjjwcjxcVG3L2woAYjomCT9tFzihTCHDSGayetAiBqgRMZUvJoCPHzb5FieryZCLUGtU/PLrewbKBrrWtXig=="}]},"_npmUser":{"name":"prrthh132","email":"ajmeraparth132@gmail.com"},"directories":{},"maintainers":[{"name":"prrthh132","email":"ajmeraparth132@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/agnost_0.2.1_1784322599792_0.1626611849766093"},"_hasShrinkwrap":false}},"time":{"created":"2025-09-25T15:00:44.529Z","modified":"2026-07-17T21:10:00.078Z","0.1.0":"2025-09-25T15:00:44.945Z","0.1.1":"2025-09-25T21:55:21.492Z","0.1.2":"2025-09-29T07:29:24.892Z","0.1.3":"2025-09-29T10:47:18.000Z","0.1.4":"2025-11-07T10:49:58.080Z","0.1.5":"2025-11-07T12:33:48.728Z","0.1.6":"2025-12-04T20:16:40.568Z","0.1.7":"2025-12-05T13:49:39.310Z","0.1.8":"2026-02-04T16:36:38.132Z","0.1.9":"2026-02-05T23:07:04.724Z","0.1.10":"2026-02-06T22:07:32.535Z","0.1.11":"2026-04-28T20:02:59.943Z","0.2.0":"2026-07-11T19:12:49.363Z","0.2.1":"2026-07-17T21:09:59.942Z"},"bugs":{"url":"https://docs.agnost.ai"},"author":{"name":"Agnost AI","email":"founders@agnost.ai"},"homepage":"https://agnost.ai","keywords":["analytics","mcp","model context protocol","ai","tools"],"description":"Analytics SDK for Model Context Protocol Servers","maintainers":[{"name":"prrthh132","email":"ajmeraparth132@gmail.com"}],"readme":"# Agnost Analytics SDK (TypeScript)\n\n[![npm version](https://badge.fury.io/js/agnost.svg)](https://badge.fury.io/js/agnost)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\nAnalytics SDK for tracking and analyzing Model Context Protocol (MCP) server interactions.\n\n## Installation\n\n```bash\nnpm install agnost\n```\n\n## Setup Example\n\n```typescript\nimport { trackMCP, createConfig } from 'agnost';\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\n\n// Create your MCP server instance\nconst server = new Server(\n  {\n    name: \"my-server\",\n    version: \"1.0.0\"\n  },\n  {\n    capabilities: {\n      tools: {}\n    }\n  }\n);\n\n// Configure analytics\nconst config = createConfig({\n  endpoint: \"https://api.agnost.ai\",\n  disableInput: false,\n  disableOutput: false\n});\n\n// Enable analytics tracking\nconst trackedServer = trackMCP(server, \"your-organization-id\", config);\n```\n\n## Configuration Example\n\n```typescript\nimport { trackMCP, createConfig } from 'agnost';\n\n// Create a custom configuration\nconst config = createConfig({\n  endpoint: \"https://api.agnost.ai\",\n  disableInput: false,   // Set to true to disable input tracking\n  disableOutput: false,  // Set to true to disable output tracking\n  disableError: false,   // When disableOutput is true, errors are still recorded\n                         // unless this is also set to true\n  disableLogs: false     // Set to true to completely disable all SDK logs\n});\n\n// Apply the configuration\ntrackMCP(\n  server,\n  \"your-organization-id\",\n  config\n);\n```\n\n### Disabling All Logs\n\nTo completely disable all SDK logs (including error logs), you can use the `disableLogs` option:\n\n```typescript\nimport { trackMCP, createConfig } from 'agnost';\n\n// Configuration with all logs disabled\nconst config = createConfig({\n  endpoint: \"https://api.agnost.ai\",\n  disableLogs: true  // This will disable ALL SDK logs\n});\n\ntrackMCP(server, \"your-organization-id\", config);\n```\n\nAlternatively, you can use environment variables:\n\n```bash\n# Disable all logs via environment variable\nexport AGNOST_DISABLE_LOGS=true\n\n# Or control log level (debug, info, warning, error)\nexport AGNOST_LOG_LEVEL=error\n```\n\n## User Identification\n\nThe SDK supports user identification to track analytics per user. This is especially useful for understanding usage patterns across different users and roles.\n\n### Basic User Identification\n\n```typescript\nimport { trackMCP, createConfig } from 'agnost';\n\n// Enable user identification\ntrackMCP(server, 'your-org-id', {\n  // .. other config like disableInput, disableOutput\n  identify: (request, env) => ({\n    userId: request?.headers?.['x-user-id'] || env?.USER_ID || 'anonymous',\n    email: request?.headers?.['x-user-email'] || env?.USER_EMAIL,\n    role: request?.headers?.['x-user-role'] || env?.USER_ROLE || 'user'\n  })\n});\n```\n\n### Advanced User Identification\n\n```typescript\nimport { trackMCP, createConfig } from 'agnost';\n\n// Complex identification logic with async operations\ntrackMCP(server, 'your-org-id', {\n  identify: async (request, env) => {\n    try {\n      // Extract token from headers\n      const token = request?.headers?.['authorization']?.replace('Bearer ', '');\n      if (!token) {\n        return { userId: 'anonymous' };\n      }\n\n      // You could validate token and fetch user info\n      // const userInfo = await validateTokenAndGetUser(token);\n\n      // Return user identity with custom fields\n      return {\n        userId: 'user-123',\n        email: 'user@example.com',\n        role: 'admin',\n        organization: 'acme-corp',\n        subscription: 'premium'\n      };\n    } catch (error) {\n      console.warn('User identification failed:', error);\n      return { userId: 'anonymous' };\n    }\n  }\n});\n```\n\n### User Identity Interface\n\nThe identify function should return a `UserIdentity` object or `null`:\n\n```typescript\ninterface UserIdentity {\n  userId: string;        // Required: Unique user identifier\n  [key: string]: any;   // Optional: Any additional user properties\n}\n\ntype IdentifyFunction = (\n  request?: any,                              // MCP request object with headers, params, etc.\n  env?: Record<string, string | undefined>    // Environment variables (process.env)\n) => UserIdentity | null | Promise<UserIdentity | null>;\n```\n\n### Identify Function Parameters\n\n- **`request`**: The incoming MCP request object containing:\n  - `headers`: HTTP-style headers (e.g., `x-user-id`, `authorization`)\n  - `params`: Request parameters including tool name and arguments\n  - Other request metadata from the MCP protocol\n\n- **`env`**: Environment variables from `process.env`, useful for:\n  - Reading user info from environment variables\n  - Accessing configuration secrets\n  - Getting deployment-specific user context\n\n### Common Usage Patterns\n\n#### 1. Header-based Identification\n```typescript\nidentify: (request, env) => ({\n  userId: request?.headers?.['x-user-id'] || 'anonymous',\n  role: request?.headers?.['x-user-role'] || 'user'\n})\n```\n\n#### 2. Environment Variable Identification\n```typescript\nidentify: (request, env) => ({\n  userId: env?.USER_ID || env?.LOGGED_IN_USER || 'anonymous',\n  workspace: env?.WORKSPACE_ID\n})\n```\n\n#### 3. Token-based Identification\n```typescript\nidentify: async (request, env) => {\n  const authHeader = request?.headers?.['authorization'];\n  if (authHeader?.startsWith('Bearer ')) {\n    const token = authHeader.replace('Bearer ', '');\n    const decoded = await decodeJWT(token);\n    return {\n      userId: decoded.sub,\n      email: decoded.email,\n      role: decoded.role\n    };\n  }\n  return { userId: 'anonymous' };\n}\n```\n\n### Important Notes\n\n- The `userId` field is **required** in the returned `UserIdentity` object\n- If identification fails, return `null` or `{ userId: 'anonymous' }`\n- User identification runs **per request** — safe for concurrent, multi-user servers\n- Any errors in the identify function are logged and fallback to anonymous tracking\n- Additional fields beyond `userId` are included in analytics for segmentation\n- The raw `Authorization` header value is never sent to Agnost; only the fields your identify function (or the built-in fallback) returns\n\n### Built-in bearer identification (zero config)\n\nIf you do NOT provide an `identify` function, the SDK derives the user id from the\nrequest's `Authorization: Bearer <token>` header automatically. If the MCP auth\nmiddleware exposes a validated token as `extra.authInfo.token` but\n`extra.requestInfo.headers` is empty, the SDK uses that token as a fallback.\n\n1. **Decode**: if the token is a JWT (3 parts) with a decodable payload, the first\n   present identifier claim becomes the `userId` — in order: `sub`, `user_id`,\n   `userId`, `email`, `preferred_username`, `username`. (No signature verification —\n   your own auth middleware has already validated the token.)\n2. **Hash**: any other token — opaque API keys, 2-part shapes, JWEs, undecodable or\n   claimless JWTs — becomes `tok_<sha256(token)[:16]>`, a stable pseudonymous\n   per-token id. The raw token is never used as an id and never leaves the process.\n   Note: tokens that rotate (JWE/refresh-style) mint a new pseudo-user per rotation.\n3. **`x-api-key` fallback**: when there is no `Authorization` header, an `x-api-key`\n   header (de facto standard for API-key auth) is hashed the same way.\n4. **OAuth `authInfo` fallback**: when headers are unavailable, the SDK also\n   reads identity from `authInfo.sub`, `authInfo.claims`, `authInfo.tokenPayload`,\n   `authInfo.extra`, `authInfo.token`, `authInfo.accessToken`, or\n   `authInfo.access_token`. If your OAuth verifier sets `authInfo.extra.userId`\n   and `authInfo.extra.tokenId`, Agnost uses `userId` for user attribution and\n   `tokenId` to create a durable OAuth conversation id\n   (`oauth:{orgId}:{tokenId}`) for stateless HTTP servers.\n\nFor OAuth MCP servers, keep the official transport path so headers reach MCP\nhandlers:\n\n```typescript\nawait transport.handleRequest(req, res, req.body);\n```\n\nIf you use a custom transport or manual message dispatch, pass the MCP extra\nobject yourself:\n\n```typescript\nawait transport.handleMessage(req.body, {\n  requestInfo: { headers: req.headers },\n  authInfo: req.auth,\n});\n```\n\nDo not log raw bearer tokens. If your OAuth middleware validates the token, attach\nstable non-secret identity on `authInfo.extra`:\n\n```typescript\nreq.auth = {\n  token,\n  clientId,\n  scopes,\n  extra: { userId, tokenId },\n};\n```\n\n### Conversations on stateless servers\n\nSession (conversation) grouping precedence, per request:\n\n1. **MCP session id** (`Mcp-Session-Id` / `extra.sessionId`) — stateful servers keep\n   today's grouping.\n2. **OAuth token id** (`authInfo.extra.tokenId`) — stateless OAuth servers group\n   calls by the durable authorization record: `oauth:{orgId}:{tokenId}`.\n3. **User id** — stateless servers (new server per request, no session id) group all\n   of a user's tool calls into one conversation: `user:{orgId}:{userId}`.\n4. **Anonymous stateless HTTP** requests merge into one shared conversation per\n   SDK process (`anon:{orgId}`) — unattributable traffic is aggregated rather\n   than flooding your dashboard with single-call conversations.\n\n### Known limitation\n\nOne org per process: the first `trackMCP` call pins the `orgId` and endpoint for the\nprocess lifetime. A later call with a different `orgId` logs an error and records\nunder the pinned org.\n\n### Configuration Options\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `endpoint` | `string` | `\"https://api.agnost.ai\"` | API endpoint URL |\n| `disableInput` | `boolean` | `false` | Disable tracking of input arguments |\n| `disableOutput` | `boolean` | `false` | Disable tracking of output results |\n| `disableError` | `boolean` | `false` | When `disableOutput` is `true`, errors take precedence and the error message is still captured. Set this to `true` to drop errors as well. |\n| `disableLogs` | `boolean` | `false` | Completely disable all SDK logs |\n| `identify` | `IdentifyFunction` | `undefined` | Function to identify users from request context |\n\n## Performance Monitoring with Checkpoints\n\nThe TypeScript SDK provides a powerful `checkpoint()` function for detailed latency breakup of tool calls. Checkpoints allow you to track specific points in your tool's execution, providing granular observability into where time is being spent.\n\n### Overview\n\nWhen analyzing tool performance, knowing the total execution time is often not enough. The `checkpoint()` function lets you mark specific points in your execution flow to understand:\n\n- Which operations are slow\n- Where bottlenecks occur\n- How time is distributed across different phases\n- Performance impact of external API calls, database queries, or processing steps\n\nAll checkpoint data is automatically captured and visualized in the Agnost AI dashboard with interactive timeline charts.\n\n### Function Signature\n\n```typescript\nimport { checkpoint } from 'agnost';\n\ncheckpoint(name: string, metadata?: any): void\n```\n\n**Parameters:**\n- `name` (string): A descriptive name for the checkpoint (e.g., \"database_query_start\", \"api_call_complete\")\n- `metadata` (optional): Any additional context to attach to this checkpoint (e.g., row counts, response sizes, status codes)\n\n### Basic Usage\n\n```typescript\nimport { checkpoint } from 'agnost';\nimport { z } from 'zod';\n\n// Define your tool\nserver.tool(\n  'get_user_data',\n  'Fetches and processes user data from the database',\n  {\n    userId: z.string().describe('The user ID to fetch')\n  },\n  async ({ userId }) => {\n    // Mark the start of input validation\n    checkpoint('input_validation_start');\n\n    if (!userId || userId.length === 0) {\n      throw new Error('Invalid user ID');\n    }\n\n    checkpoint('input_validation_complete');\n\n    // Mark the start of database query\n    checkpoint('database_query_start');\n\n    const userData = await db.query('SELECT * FROM users WHERE id = ?', [userId]);\n\n    checkpoint('database_query_complete', {\n      rowCount: userData.length\n    });\n\n    // Mark the start of data processing\n    checkpoint('data_processing_start');\n\n    const processed = await processUserData(userData);\n\n    checkpoint('data_processing_complete', {\n      recordsProcessed: processed.length\n    });\n\n    return {\n      content: [\n        {\n          type: 'text',\n          text: JSON.stringify(processed)\n        }\n      ]\n    };\n  }\n);\n```\n\n### Advanced Example: API Call Monitoring\n\n```typescript\nimport { checkpoint } from 'agnost';\n\nserver.tool(\n  'fetch_weather',\n  'Fetches weather data from external API',\n  {\n    city: z.string()\n  },\n  async ({ city }) => {\n    // Track input normalization\n    checkpoint('input_normalization_start');\n    const normalizedCity = city.trim().toLowerCase();\n    checkpoint('input_normalization_complete');\n\n    // Track cache lookup\n    checkpoint('cache_lookup_start');\n    const cached = await cache.get(`weather:${normalizedCity}`);\n    checkpoint('cache_lookup_complete', { cacheHit: !!cached });\n\n    if (cached) {\n      checkpoint('returning_cached_data');\n      return cached;\n    }\n\n    // Track external API call\n    checkpoint('api_call_start');\n    const response = await fetch(`https://api.weather.com/v1/${normalizedCity}`);\n    checkpoint('api_call_complete', {\n      statusCode: response.status,\n      responseSize: response.headers.get('content-length')\n    });\n\n    // Track response parsing\n    checkpoint('response_parsing_start');\n    const data = await response.json();\n    checkpoint('response_parsing_complete');\n\n    // Track cache update\n    checkpoint('cache_update_start');\n    await cache.set(`weather:${normalizedCity}`, data, 3600);\n    checkpoint('cache_update_complete');\n\n    return {\n      content: [\n        {\n          type: 'text',\n          text: JSON.stringify(data)\n        }\n      ]\n    };\n  }\n);\n```\n\n### How Checkpoints Work\n\n1. **Automatic Context Tracking**: When a tool is called, the SDK automatically creates an execution context using AsyncLocalStorage\n2. **Relative Timestamps**: Each checkpoint records the time elapsed since the tool execution started (in milliseconds)\n3. **Metadata Capture**: Optional metadata is stored with each checkpoint for additional context\n4. **Safe Operation**: Checkpoints called outside of tool execution are safely ignored (no errors thrown)\n5. **Zero Performance Impact**: Checkpoints are optimized for minimal overhead and won't affect your tool's performance\n\n### Checkpoint Data Structure\n\nEach checkpoint is recorded with the following structure:\n\n```typescript\ninterface Checkpoint {\n  name: string;           // The checkpoint name\n  timestamp: number;      // Milliseconds since execution start\n  metadata?: any;         // Optional metadata object\n}\n```\n\n### Dashboard Visualization\n\nCheckpoints are automatically visualized in the Agnost AI dashboard with:\n\n- **Timeline Bar Chart**: Visual representation of time spent between checkpoints\n- **Detailed Breakdown**: List of all checkpoints with:\n  - Absolute timestamp (ms from start)\n  - Duration since previous checkpoint\n  - Percentage of total latency\n  - Metadata display\n- **Remaining Time Analysis**: Shows overhead/time not covered by explicit checkpoints\n\nExample timeline visualization:\n```\n[0ms--------50ms][50ms---------200ms][200ms----250ms]\n  Input Valid    DB Query           Processing\n```\n\n### Best Practices\n\n1. **Use Descriptive Names**: Make checkpoint names clear and specific\n   ```typescript\n   // Good\n   checkpoint('database_query_complete');\n   checkpoint('external_api_call_start');\n\n   // Avoid\n   checkpoint('step1');\n   checkpoint('done');\n   ```\n\n2. **Track Start and End**: For operations you want to measure, add both start and end checkpoints\n   ```typescript\n   checkpoint('operation_start');\n   await expensiveOperation();\n   checkpoint('operation_complete');\n   ```\n\n3. **Add Useful Metadata**: Include context that helps debug performance issues\n   ```typescript\n   checkpoint('query_complete', {\n     rowCount: results.length,\n     queryTime: Date.now() - startTime,\n     cacheHit: false\n   });\n   ```\n\n4. **Focus on Expensive Operations**: Add checkpoints around:\n   - Database queries\n   - External API calls\n   - File I/O operations\n   - Heavy computation\n   - Network requests\n\n5. **Don't Over-checkpoint**: Too many checkpoints can make analysis harder. Focus on meaningful boundaries\n   ```typescript\n   // Good: Major operation boundaries\n   checkpoint('fetch_data_start');\n   checkpoint('fetch_data_complete');\n   checkpoint('process_data_complete');\n\n   // Avoid: Too granular\n   checkpoint('variable_declared');\n   checkpoint('loop_iteration_1');\n   checkpoint('loop_iteration_2');\n   ```\n\n### Common Patterns\n\n#### Pattern 1: Database Operations\n```typescript\ncheckpoint('db_connection_start');\nconst connection = await pool.getConnection();\ncheckpoint('db_connection_acquired');\n\ncheckpoint('db_query_start');\nconst results = await connection.query(sql);\ncheckpoint('db_query_complete', { rowCount: results.length });\n```\n\n#### Pattern 2: Multi-Step Processing Pipeline\n```typescript\ncheckpoint('fetch_raw_data');\nconst raw = await fetchData();\n\ncheckpoint('transform_data');\nconst transformed = transform(raw);\n\ncheckpoint('validate_data');\nconst validated = validate(transformed);\n\ncheckpoint('store_data');\nawait store(validated);\ncheckpoint('pipeline_complete');\n```\n\n#### Pattern 3: Parallel Operations\n```typescript\ncheckpoint('parallel_operations_start');\n\nconst [result1, result2, result3] = await Promise.all([\n  operation1(),\n  operation2(),\n  operation3()\n]);\n\ncheckpoint('parallel_operations_complete', {\n  operation1Time: result1.duration,\n  operation2Time: result2.duration,\n  operation3Time: result3.duration\n});\n```\n\n### Troubleshooting\n\n**Checkpoints not appearing in dashboard:**\n- Ensure you're calling `checkpoint()` inside a tracked tool handler\n- Verify analytics tracking is enabled with `trackMCP()`\n- Check that your organization ID is correct\n\n**Timestamps seem incorrect:**\n- Timestamps are relative to tool execution start (not absolute time)\n- Ensure you're not calling `checkpoint()` outside of tool execution context\n\n**Performance concerns:**\n- Checkpoints have minimal overhead (< 1ms per checkpoint)\n- They use object pooling and efficient timestamp recording\n- Safe to use even in high-frequency tools\n","readmeFilename":"README.md"}