{"_id":"contextplus","_rev":"9-efe89b3212ae6f181f967efe4fdd15f1","name":"contextplus","dist-tags":{"latest":"1.0.8"},"versions":{"1.0.0":{"name":"contextplus","version":"1.0.0","_id":"contextplus@1.0.0","maintainers":[{"name":"forloopcodes","email":"meetnp1706@gmail.com"}],"bin":{"contextplus":"build/index.js"},"dist":{"shasum":"43df1fa69fc090a968684f21b1dc8d41ed7187a6","tarball":"https://registry.npmjs.org/contextplus/-/contextplus-1.0.0.tgz","fileCount":104,"integrity":"sha512-Qu9I9R1LfDKelzo6d+PCsCTU0Ck5GcGCzXFVlbRzyAJKtYSz9uYU7QAwYBTMYgE/gIOFyUyTWY/jJe2NE+ZVtQ==","signatures":[{"sig":"MEUCIHSb06ZC4kuwRB5cPVf/Ckb+dVIXHGaQzXqibkwbYwouAiEA8GSykQmOYi5K9GB0rQXJtzCwraw2SsRh6AqAbAMnjYw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1055933},"type":"module","gitHead":"bf6339cb54eec200b67fe8b498e022dffb49c378","scripts":{"dev":"tsc --watch","test":"node --test test/main/*.test.mjs","build":"tsc","start":"node build/index.js","test:all":"node --test test/main/*.test.mjs test/demo/*.demo.mjs","test:demo":"node --test test/demo/*.demo.mjs"},"_npmUser":{"name":"forloopcodes","email":"meetnp1706@gmail.com"},"_npmVersion":"11.3.0","description":"Semantic Intelligence for Large-Scale Engineering.","directories":{},"_nodeVersion":"24.0.1","dependencies":{"zod":"^3.25.23","ignore":"^7.0.4","ollama":"^0.6.3","ml-matrix":"^6.12.1","simple-git":"^3.27.0","web-tree-sitter":"^0.20.8","tree-sitter-wasms":"^0.1.13","@modelcontextprotocol/sdk":"^1.12.1"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.3","@types/node":"^22.15.0","tailwindcss":"^4.2.1","@tailwindcss/postcss":"^4.2.1"},"_npmOperationalInternal":{"tmp":"tmp/contextplus_1.0.0_1772271311061_0.3419751220624989","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"contextplus","version":"1.0.1","_id":"contextplus@1.0.1","maintainers":[{"name":"forloopcodes","email":"meetnp1706@gmail.com"}],"bin":{"contextplus":"build/index.js"},"dist":{"shasum":"7e903cc29a955a8be08f6bdf3726b64c67f983b8","tarball":"https://registry.npmjs.org/contextplus/-/contextplus-1.0.1.tgz","fileCount":104,"integrity":"sha512-SpRH23P8WvnDk1PYuyUfAq9d9M7rALfXJDg8JNa/juftWm6scgGWus9gaL5dOemVfx/5rr9sHCgxsPOjxDOqQw==","signatures":[{"sig":"MEUCIBZwgROYE/cIrxUfDQOWECGToQj8+TNp0QkvsrgkNhLvAiEA22yPvusX0IgHrmTkaOhTLHTfOhsBmwA9wTQT1uDaZxs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":646124},"type":"module","gitHead":"0e77fbb502469784ff8a5f45c5cc1e0cb760c401","scripts":{"dev":"tsc --watch","test":"node --test test/main/*.test.mjs","build":"tsc","start":"node build/index.js","test:all":"node --test test/main/*.test.mjs test/demo/*.demo.mjs","test:demo":"node --test test/demo/*.demo.mjs"},"_npmUser":{"name":"forloopcodes","email":"meetnp1706@gmail.com"},"_npmVersion":"11.3.0","description":"Semantic Intelligence for Large-Scale Engineering.","directories":{},"_nodeVersion":"24.0.1","dependencies":{"zod":"^3.25.23","ignore":"^7.0.4","ollama":"^0.6.3","ml-matrix":"^6.12.1","simple-git":"^3.27.0","web-tree-sitter":"^0.20.8","tree-sitter-wasms":"^0.1.13","@modelcontextprotocol/sdk":"^1.12.1"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.3","@types/node":"^22.15.0","tailwindcss":"^4.2.1","@tailwindcss/postcss":"^4.2.1"},"_npmOperationalInternal":{"tmp":"tmp/contextplus_1.0.1_1772281059282_0.8926910788424336","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"contextplus","version":"1.0.2","_id":"contextplus@1.0.2","maintainers":[{"name":"forloopcodes","email":"meetnp1706@gmail.com"}],"bin":{"contextplus":"build/index.js"},"dist":{"shasum":"622ef41dde00708a4dc11152e527677167036227","tarball":"https://registry.npmjs.org/contextplus/-/contextplus-1.0.2.tgz","fileCount":112,"integrity":"sha512-XdIv1jwOOT/MPKWfpoKcMC4eWfTWzhQREAcqunrRqFAl9Y/4M8zblSkUs026O2h3OWTcNGIkomZ2qo3x5cZw3Q==","signatures":[{"sig":"MEQCIAmvQHfAeHYq7LHD5w5YYmuaKzqK/yOMqIRlRhatG4MNAiBZOO4xgBLSxHlPFmmMLOkBMZlgLUTUfaHEOCgquxqQfg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":714691},"type":"module","gitHead":"47c5999ba57692852ab6b4111ac02176a0e3167c","scripts":{"dev":"tsc --watch","test":"node --test test/main/*.test.mjs","build":"tsc","start":"node build/index.js","test:all":"node --test test/main/*.test.mjs test/demo/*.demo.mjs","test:demo":"node --test test/demo/*.demo.mjs"},"_npmUser":{"name":"forloopcodes","email":"meetnp1706@gmail.com"},"_npmVersion":"11.3.0","description":"Semantic Intelligence for Large-Scale Engineering.","directories":{},"_nodeVersion":"24.0.1","dependencies":{"zod":"^3.25.23","ignore":"^7.0.4","ollama":"^0.6.3","ml-matrix":"^6.12.1","simple-git":"^3.27.0","web-tree-sitter":"^0.20.8","tree-sitter-wasms":"^0.1.13","@modelcontextprotocol/sdk":"^1.12.1"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.3","@types/node":"^22.15.0","tailwindcss":"^4.2.1","@tailwindcss/postcss":"^4.2.1"},"_npmOperationalInternal":{"tmp":"tmp/contextplus_1.0.2_1772297676256_0.1468665166292289","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"contextplus","version":"1.0.3","_id":"contextplus@1.0.3","maintainers":[{"name":"forloopcodes","email":"meetnp1706@gmail.com"}],"bin":{"contextplus":"build/index.js"},"dist":{"shasum":"ba5fdc498f41b8450e934a38345ed0f677d0f981","tarball":"https://registry.npmjs.org/contextplus/-/contextplus-1.0.3.tgz","fileCount":113,"integrity":"sha512-vwXxFLu9L/67ynNgkQAh9ZjPXwz1mbzIpJI5NY/50dh7xTRqpEJDCvnnRYHyHzhCeNU4j7w4blk3eh5ZvAxKoQ==","signatures":[{"sig":"MEQCIF8kvWzhUMiQcHzQl3lxzLo5hadrULZlNsyh22D+V+xcAiBBuSlXnk6ESiuJNPPr0GVBGDoAUfsKyFJNlKv5/GT5rg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":722828},"type":"module","gitHead":"02580c0ec3595d56186b36ed62731fc445471ef8","scripts":{"dev":"tsc --watch","test":"node --test test/main/*.test.mjs","build":"tsc","start":"node build/index.js","test:all":"node --test test/main/*.test.mjs test/demo/*.demo.mjs","test:demo":"node --test test/demo/*.demo.mjs"},"_npmUser":{"name":"forloopcodes","email":"meetnp1706@gmail.com"},"_npmVersion":"11.3.0","description":"Semantic Intelligence for Large-Scale Engineering.","directories":{},"_nodeVersion":"24.0.1","dependencies":{"zod":"^3.25.23","ignore":"^7.0.4","ollama":"^0.6.3","ml-matrix":"^6.12.1","simple-git":"^3.27.0","web-tree-sitter":"^0.20.8","tree-sitter-wasms":"^0.1.13","@modelcontextprotocol/sdk":"^1.12.1"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.3","@types/node":"^22.15.0","tailwindcss":"^4.2.1","@tailwindcss/postcss":"^4.2.1"},"_npmOperationalInternal":{"tmp":"tmp/contextplus_1.0.3_1772352462001_0.6876072213158335","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"contextplus","version":"1.0.4","_id":"contextplus@1.0.4","maintainers":[{"name":"forloopcodes","email":"meetnp1706@gmail.com"}],"bin":{"contextplus":"build/index.js"},"dist":{"shasum":"d2baf10c445584806dd9108a4fa051ef000d9cd3","tarball":"https://registry.npmjs.org/contextplus/-/contextplus-1.0.4.tgz","fileCount":122,"integrity":"sha512-h8BzCWp3KSRHjPK4rf0I/F9AiBk7FWf7QPfsnOKOn6M73NgiObFxAjAYVqQxzNKhL7EOixTce5Efs+bKQPeJPA==","signatures":[{"sig":"MEUCIQCMZRm5RVPrWKdnl+8FmnYj5h9mdd2vkOOwYCpYcMZ3wwIgYJeTr+OsUyN/If6YD3zOVyOhUwmjN/a0xQW5Ei5e3L8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":744790},"type":"module","gitHead":"6b9a33dab54ac6469946617b1b86223f8deaa006","scripts":{"dev":"tsc --watch","test":"node --test test/main/*.test.mjs","build":"tsc","start":"node build/index.js","test:all":"node --test test/main/*.test.mjs test/demo/*.demo.mjs","test:demo":"node --test test/demo/*.demo.mjs"},"_npmUser":{"name":"forloopcodes","email":"meetnp1706@gmail.com"},"_npmVersion":"11.3.0","description":"Semantic Intelligence for Large-Scale Engineering.","directories":{},"_nodeVersion":"24.0.1","dependencies":{"zod":"^3.25.23","ignore":"^7.0.4","ollama":"^0.6.3","ml-matrix":"^6.12.1","simple-git":"^3.27.0","web-tree-sitter":"^0.20.8","tree-sitter-wasms":"^0.1.13","@modelcontextprotocol/sdk":"^1.12.1"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.3","@types/node":"^22.15.0","tailwindcss":"^4.2.1","@tailwindcss/postcss":"^4.2.1"},"_npmOperationalInternal":{"tmp":"tmp/contextplus_1.0.4_1772455032163_0.24543838008431385","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"contextplus","version":"1.0.5","license":"MIT","_id":"contextplus@1.0.5","maintainers":[{"name":"forloopcodes","email":"meetnp1706@gmail.com"}],"bin":{"contextplus":"build/index.js"},"dist":{"shasum":"8a43970efd739412a7710925e283800c4b4bce45","tarball":"https://registry.npmjs.org/contextplus/-/contextplus-1.0.5.tgz","fileCount":123,"integrity":"sha512-w2ZZ8O6TeJr6h2iHbhgem4YwZAzuRRKhFK50BeS61gsNn9wHcDYoJXjWPCmoIx6XdNj0dFhqopzdrhaA7mojRw==","signatures":[{"sig":"MEYCIQCpfHE8kPbPDWUnTOBGAtV+cgEtuSxnPmJN/tofuvgHEQIhAPFJBgh7f2YSwcmluHP7qMWDkSTKR91ITpgJmej0lTmO","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":756165},"type":"module","gitHead":"29b6422761000ad3381515127258810c03fa14e8","scripts":{"dev":"tsc --watch","test":"node --test test/main/*.test.mjs","build":"tsc","start":"node build/index.js","test:all":"node --test test/main/*.test.mjs test/demo/*.demo.mjs","test:demo":"node --test test/demo/*.demo.mjs"},"_npmUser":{"name":"forloopcodes","email":"meetnp1706@gmail.com"},"_npmVersion":"11.3.0","description":"Semantic Intelligence for Large-Scale Engineering.","directories":{},"_nodeVersion":"24.0.1","dependencies":{"zod":"^3.25.23","ignore":"^7.0.4","ollama":"^0.6.3","ml-matrix":"^6.12.1","simple-git":"^3.27.0","web-tree-sitter":"^0.20.8","tree-sitter-wasms":"^0.1.13","@modelcontextprotocol/sdk":"^1.12.1"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.3","@types/node":"^22.15.0","tailwindcss":"^4.2.1","@tailwindcss/postcss":"^4.2.1"},"_npmOperationalInternal":{"tmp":"tmp/contextplus_1.0.5_1772570906854_0.2811823025543354","host":"s3://npm-registry-packages-npm-production"}},"1.0.6":{"name":"contextplus","version":"1.0.6","license":"MIT","_id":"contextplus@1.0.6","maintainers":[{"name":"forloopcodes","email":"meetnp1706@gmail.com"}],"bin":{"contextplus":"build/index.js"},"dist":{"shasum":"0601b254fe52c9d7856e8200a93a2ecd545e7f48","tarball":"https://registry.npmjs.org/contextplus/-/contextplus-1.0.6.tgz","fileCount":130,"integrity":"sha512-ZTqcz49a51T/VwA1dS96SyVbco/9p5kek9SMzcTPhYORJnQ+bt9ZGdEzMEgUn+Qjz1qQs3M90eJxN8BzO4TFVg==","signatures":[{"sig":"MEUCIHb+62i3OzaUyU6HToN6bif7BA0dTPY9HhQFn1ZXN/6xAiEAlYXBlnSvkI24fQMODSg1iw83cW/vccrhiptXiS7HCHI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":829582},"type":"module","gitHead":"ccdf8b75085c35c2007e28a6cd81861090f53483","scripts":{"dev":"tsc --watch","test":"node --test test/main/*.test.mjs","build":"tsc","start":"node build/index.js","test:all":"node --test test/main/*.test.mjs test/demo/*.demo.mjs","test:demo":"node --test test/demo/*.demo.mjs"},"_npmUser":{"name":"forloopcodes","email":"meetnp1706@gmail.com"},"_npmVersion":"11.3.0","description":"Semantic Intelligence for Large-Scale Engineering.","directories":{},"_nodeVersion":"24.0.1","dependencies":{"zod":"^3.25.23","ignore":"^7.0.4","ollama":"^0.6.3","ml-matrix":"^6.12.1","simple-git":"^3.27.0","web-tree-sitter":"^0.20.8","tree-sitter-wasms":"^0.1.13","@modelcontextprotocol/sdk":"^1.12.1"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.3","@types/node":"^22.15.0","tailwindcss":"^4.2.1","@tailwindcss/postcss":"^4.2.1"},"_npmOperationalInternal":{"tmp":"tmp/contextplus_1.0.6_1772577912743_0.7444602884848335","host":"s3://npm-registry-packages-npm-production"}},"1.0.7":{"name":"contextplus","version":"1.0.7","license":"MIT","_id":"contextplus@1.0.7","maintainers":[{"name":"forloopcodes","email":"meetnp1706@gmail.com"}],"bin":{"contextplus":"build/index.js"},"dist":{"shasum":"4b07bd503f3eeb0da0ad19f7bf3e37d6876ea417","tarball":"https://registry.npmjs.org/contextplus/-/contextplus-1.0.7.tgz","fileCount":130,"integrity":"sha512-u0IAuLwe9+xzpFub8w9tcd0Zn7c+698FioZdIO+ga1o+QBg3QSddZxoJDAc/E+PXtZ3ypITNrto7FRWwbwrDJQ==","signatures":[{"sig":"MEUCIGr++g5av80U5xFQiQvAJy7z2HvQOqUdecjjU/reqXuvAiEA0rK+ThuzaGjcvaYCWcH8Z7/U/9GfYvZh4MU7bcoot7E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":854375},"type":"module","gitHead":"dec1e74daaa773a6ceabd4855945b977344e51e2","scripts":{"dev":"tsc --watch","test":"node --test test/main/*.test.mjs","build":"tsc","start":"node build/index.js","test:all":"node --test test/main/*.test.mjs test/demo/*.demo.mjs","test:demo":"node --test test/demo/*.demo.mjs"},"_npmUser":{"name":"forloopcodes","email":"meetnp1706@gmail.com"},"_npmVersion":"11.3.0","description":"Semantic Intelligence for Large-Scale Engineering.","directories":{},"_nodeVersion":"24.0.1","dependencies":{"zod":"^3.25.23","ignore":"^7.0.4","ollama":"^0.6.3","ml-matrix":"^6.12.1","simple-git":"^3.27.0","web-tree-sitter":"^0.20.8","tree-sitter-wasms":"^0.1.13","@modelcontextprotocol/sdk":"^1.12.1"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.3","@types/node":"^22.15.0","tailwindcss":"^4.2.1","@tailwindcss/postcss":"^4.2.1"},"_npmOperationalInternal":{"tmp":"tmp/contextplus_1.0.7_1772781888106_0.7011802547627348","host":"s3://npm-registry-packages-npm-production"}},"1.0.8":{"name":"contextplus","version":"1.0.8","type":"module","license":"MIT","bin":{"contextplus":"build/index.js"},"scripts":{"build":"tsc","dev":"tsc --watch","start":"node build/index.js","test":"node --test test/main/*.test.mjs","test:demo":"node --test test/demo/*.demo.mjs","test:all":"node --test test/main/*.test.mjs test/demo/*.demo.mjs"},"dependencies":{"@modelcontextprotocol/sdk":"^1.12.1","ignore":"^7.0.4","ml-matrix":"^6.12.1","ollama":"^0.6.3","simple-git":"^3.27.0","tree-sitter-wasms":"^0.1.13","web-tree-sitter":"^0.20.8","zod":"^3.25.23"},"devDependencies":{"@tailwindcss/postcss":"^4.2.1","@types/node":"^22.15.0","tailwindcss":"^4.2.1","typescript":"^5.8.3"},"_id":"contextplus@1.0.8","gitHead":"d2f44d32cf14fbd258bd1f012be6bd626ae20361","description":"Semantic Intelligence for Large-Scale Engineering.","_nodeVersion":"24.0.1","_npmVersion":"11.3.0","dist":{"integrity":"sha512-fWfWd3QG3pWXDhwQqvENpeZ6IHo8dJutcyqCXWQvPvtOL7C4jDQBdZbAchSErjc/YD/C7G4H0V79+rru/mvnfQ==","shasum":"68267a14d323a69b3a8af9ca9c0e8888758dd009","tarball":"https://registry.npmjs.org/contextplus/-/contextplus-1.0.8.tgz","fileCount":130,"unpackedSize":872636,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCAnJzMhX3OfMWOnJP0gpXxrdNtJXAsUGlHQG2QDXlPrwIhAP0bsDURI/MnWYE+mOev3nDJPdHaTYkdFr+GuRB4jKuy"}]},"_npmUser":{"name":"forloopcodes","email":"meetnp1706@gmail.com"},"directories":{},"maintainers":[{"name":"forloopcodes","email":"meetnp1706@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/contextplus_1.0.8_1773164900019_0.7774078889505769"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-28T09:35:11.059Z","modified":"2026-03-10T17:48:20.321Z","1.0.0":"2026-02-28T09:35:11.247Z","1.0.1":"2026-02-28T12:17:39.497Z","1.0.2":"2026-02-28T16:54:36.461Z","1.0.3":"2026-03-01T08:07:42.364Z","1.0.4":"2026-03-02T12:37:12.470Z","1.0.5":"2026-03-03T20:48:27.052Z","1.0.6":"2026-03-03T22:45:13.019Z","1.0.7":"2026-03-06T07:24:48.308Z","1.0.8":"2026-03-10T17:48:20.218Z"},"license":"MIT","description":"Semantic Intelligence for Large-Scale Engineering.","maintainers":[{"name":"forloopcodes","email":"meetnp1706@gmail.com"}],"readme":"# Context+\r\n\r\nSemantic Intelligence for Large-Scale Engineering.\r\n\r\nContext+ is an MCP server designed for developers who demand 99% accuracy. By combining RAG, Tree-sitter AST, Spectral Clustering, and Obsidian-style linking, Context+ turns a massive codebase into a searchable, hierarchical feature graph.\r\n\r\nhttps://github.com/user-attachments/assets/a97a451f-c9b4-468d-b036-15b65fc13e79\r\n\r\n## Tools\r\n\r\n### Discovery\r\n\r\n| Tool                         | Description                                                                                                                                                      |\r\n| ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |\r\n| `get_context_tree`           | Structural AST tree of a project with file headers and symbol ranges (line numbers for functions/classes/methods). Dynamic pruning shrinks output automatically. |\r\n| `get_file_skeleton`          | Function signatures, class methods, and type definitions with line ranges, without reading full bodies. Shows the API surface.                                   |\r\n| `semantic_code_search`       | Search by meaning, not exact text. Uses embeddings over file headers/symbols and returns matched symbol definition lines.                                        |\r\n| `semantic_identifier_search` | Identifier-level semantic retrieval for functions/classes/variables with ranked call sites and line numbers.                                                     |\r\n| `semantic_navigate`          | Browse codebase by meaning using spectral clustering. Groups semantically related files into labeled clusters.                                                   |\r\n\r\n### Analysis\r\n\r\n| Tool                  | Description                                                                                                                   |\r\n| --------------------- | ----------------------------------------------------------------------------------------------------------------------------- |\r\n| `get_blast_radius`    | Trace every file and line where a symbol is imported or used. Prevents orphaned references.                                   |\r\n| `run_static_analysis` | Run native linters and compilers to find unused variables, dead code, and type errors. Supports TypeScript, Python, Rust, Go. |\r\n\r\n### Code Ops\r\n\r\n| Tool              | Description                                                                                                              |\r\n| ----------------- | ------------------------------------------------------------------------------------------------------------------------ |\r\n| `propose_commit`  | The only way to write code. Validates against strict rules before saving. Creates a shadow restore point before writing. |\r\n| `get_feature_hub` | Obsidian-style feature hub navigator. Hubs are `.md` files with `[[wikilinks]]` that map features to code files.         |\r\n\r\n### Version Control\r\n\r\n| Tool                  | Description                                                                                                |\r\n| --------------------- | ---------------------------------------------------------------------------------------------------------- |\r\n| `list_restore_points` | List all shadow restore points created by `propose_commit`. Each captures file state before AI changes.    |\r\n| `undo_change`         | Restore files to their state before a specific AI change. Uses shadow restore points. Does not affect git. |\r\n\r\n### Memory & RAG\r\n\r\n| Tool                      | Description                                                                                              |\r\n| ------------------------- | -------------------------------------------------------------------------------------------------------- |\r\n| `upsert_memory_node`      | Create or update a memory node (concept, file, symbol, note) with auto-generated embeddings.             |\r\n| `create_relation`         | Create typed edges between nodes (relates_to, depends_on, implements, references, similar_to, contains). |\r\n| `search_memory_graph`     | Semantic search with graph traversal — finds direct matches then walks 1st/2nd-degree neighbors.         |\r\n| `prune_stale_links`       | Remove decayed edges (e^(-λt) below threshold) and orphan nodes with low access counts.                  |\r\n| `add_interlinked_context` | Bulk-add nodes with auto-similarity linking (cosine ≥ 0.72 creates edges automatically).                 |\r\n| `retrieve_with_traversal` | Start from a node and walk outward — returns all reachable neighbors scored by decay and depth.          |\r\n\r\n## Setup\r\n\r\n### Quick Start (npx / bunx)\r\n\r\nNo installation needed. Add Context+ to your IDE MCP config.\r\n\r\nFor Claude Code, Cursor, and Windsurf, use `mcpServers`:\r\n\r\n```json\r\n{\r\n  \"mcpServers\": {\r\n    \"contextplus\": {\r\n      \"command\": \"bunx\",\r\n      \"args\": [\"contextplus\"],\r\n      \"env\": {\r\n        \"OLLAMA_EMBED_MODEL\": \"nomic-embed-text\",\r\n        \"OLLAMA_CHAT_MODEL\": \"gemma2:27b\",\r\n        \"OLLAMA_API_KEY\": \"YOUR_OLLAMA_API_KEY\"\r\n      }\r\n    }\r\n  }\r\n}\r\n```\r\n\r\nFor VS Code (`.vscode/mcp.json`), use `servers` and `inputs`:\r\n\r\n```json\r\n{\r\n  \"servers\": {\r\n    \"contextplus\": {\r\n      \"type\": \"stdio\",\r\n      \"command\": \"bunx\",\r\n      \"args\": [\"contextplus\"],\r\n      \"env\": {\r\n        \"OLLAMA_EMBED_MODEL\": \"nomic-embed-text\",\r\n        \"OLLAMA_CHAT_MODEL\": \"gemma2:27b\",\r\n        \"OLLAMA_API_KEY\": \"YOUR_OLLAMA_API_KEY\"\r\n      }\r\n    }\r\n  },\r\n  \"inputs\": []\r\n}\r\n```\r\n\r\nIf you prefer `npx`, use:\r\n\r\n- `\"command\": \"npx\"`\r\n- `\"args\": [\"-y\", \"contextplus\"]`\r\n\r\nOr generate the MCP config file directly in your current directory:\r\n\r\n```bash\r\nnpx -y contextplus init claude\r\nbunx contextplus init cursor\r\nnpx -y contextplus init opencode\r\n```\r\n\r\nSupported coding agent names: `claude`, `cursor`, `vscode`, `windsurf`, `opencode`.\r\n\r\nConfig file locations:\r\n\r\n| IDE         | Config File          |\r\n| ----------- | -------------------- |\r\n| Claude Code | `.mcp.json`          |\r\n| Cursor      | `.cursor/mcp.json`   |\r\n| VS Code     | `.vscode/mcp.json`   |\r\n| Windsurf    | `.windsurf/mcp.json` |\r\n| OpenCode    | `opencode.json`      |\r\n\r\n### CLI Subcommands\r\n\r\n- `init [target]` - Generate MCP configuration (targets: `claude`, `cursor`, `vscode`, `windsurf`, `opencode`).\r\n- `skeleton [path]` or `tree [path]` - **(New)** View the structural tree of a project with file headers and symbol definitions directly in your terminal.\r\n- `[path]` - Start the MCP server (stdio) for the specified path (defaults to current directory).\r\n\r\n### From Source\r\n\r\n```bash\r\nnpm install\r\nnpm run build\r\n```\r\n\r\n## Architecture\r\n\r\nThree layers built with TypeScript over stdio using the Model Context Protocol SDK:\r\n\r\n**Core** (`src/core/`) - Multi-language AST parsing (tree-sitter, 43 extensions), gitignore-aware traversal, Ollama vector embeddings with disk cache, wikilink hub graph, in-memory property graph with decay scoring.\r\n\r\n**Tools** (`src/tools/`) - 17 MCP tools exposing structural, semantic, operational, and memory graph capabilities.\r\n\r\n**Git** (`src/git/`) - Shadow restore point system for undo without touching git history.\r\n\r\n**Runtime Cache** (`.mcp_data/`) - created on server startup; stores reusable file, identifier, and call-site embeddings to avoid repeated GPU/CPU embedding work. A realtime tracker refreshes changed files/functions incrementally.\r\n\r\n## Config\r\n\r\n| Variable                                | Type                      | Default            | Description                                                   |\r\n| --------------------------------------- | ------------------------- | ------------------ | ------------------------------------------------------------- |\r\n| `OLLAMA_EMBED_MODEL`                    | string                    | `nomic-embed-text` | Embedding model                                               |\r\n| `OLLAMA_API_KEY`                        | string                    | -                  | Ollama Cloud API key                                          |\r\n| `OLLAMA_CHAT_MODEL`                     | string                    | `llama3.2`         | Chat model for cluster labeling                               |\r\n| `CONTEXTPLUS_EMBED_BATCH_SIZE`          | string (parsed as number) | `8`                | Embedding batch size per GPU call, clamped to 5-10            |\r\n| `CONTEXTPLUS_EMBED_CHUNK_CHARS`         | string (parsed as number) | `2000`             | Per-chunk chars before merge, clamped to 256-8000             |\r\n| `CONTEXTPLUS_MAX_EMBED_FILE_SIZE`       | string (parsed as number) | `51200`            | Skip non-code text files larger than this many bytes          |\r\n| `CONTEXTPLUS_EMBED_NUM_GPU`             | string (parsed as number) | -                  | Optional Ollama embed runtime `num_gpu` override              |\r\n| `CONTEXTPLUS_EMBED_MAIN_GPU`            | string (parsed as number) | -                  | Optional Ollama embed runtime `main_gpu` override             |\r\n| `CONTEXTPLUS_EMBED_NUM_THREAD`          | string (parsed as number) | -                  | Optional Ollama embed runtime `num_thread` override           |\r\n| `CONTEXTPLUS_EMBED_NUM_BATCH`           | string (parsed as number) | -                  | Optional Ollama embed runtime `num_batch` override            |\r\n| `CONTEXTPLUS_EMBED_NUM_CTX`             | string (parsed as number) | -                  | Optional Ollama embed runtime `num_ctx` override              |\r\n| `CONTEXTPLUS_EMBED_LOW_VRAM`            | string (parsed as boolean)| -                  | Optional Ollama embed runtime `low_vram` override             |\r\n| `CONTEXTPLUS_EMBED_TRACKER`             | string (parsed as boolean)| `true`             | Enable realtime embedding refresh on file changes             |\r\n| `CONTEXTPLUS_EMBED_TRACKER_MAX_FILES`   | string (parsed as number) | `8`                | Max changed files processed per tracker tick, clamped to 5-10 |\r\n| `CONTEXTPLUS_EMBED_TRACKER_DEBOUNCE_MS` | string (parsed as number) | `700`              | Debounce window before tracker refresh                        |\r\n\r\n## Test\r\n\r\n```bash\r\nnpm test\r\nnpm run test:demo\r\nnpm run test:all\r\n```\r\n","readmeFilename":"README.md"}