[{"data":1,"prerenderedAt":715},["ShallowReactive",2],{"navigation_docs":3,"trending-repo-homeassistant-ai\u002Fha-mcp":249,"page-views-\u002Ftrending\u002Fhomeassistant-ai\u002Fha-mcp":713},[4,29,104,124,194],{"title":5,"icon":6,"path":7,"stem":8,"children":9},"Start",false,"\u002Fstart","1.start",[10,14,19,24],{"title":11,"path":7,"stem":12,"icon":13},"What jscpd finds","1.start\u002Findex","i-lucide-house",{"title":15,"path":16,"stem":17,"icon":18},"Installation","\u002Fstart\u002Finstallation","1.start\u002F2.installation","i-lucide-download",{"title":20,"path":21,"stem":22,"icon":23},"Quickstart","\u002Fstart\u002Fquickstart","1.start\u002F3.quickstart","i-lucide-rocket",{"title":25,"path":26,"stem":27,"icon":28},"Configuration basics","\u002Fstart\u002Fconfiguration","1.start\u002F4.configuration","i-lucide-settings-2",{"title":30,"icon":6,"path":31,"stem":32,"children":33,"page":6},"Guides","\u002Fguides","2.guides",[34,39,44,49,54,59,64,69,74,79,84,89,94,99],{"title":35,"path":36,"stem":37,"icon":38},"Use jscpd in CI","\u002Fguides\u002Fci","2.guides\u002F01.ci","i-lucide-github",{"title":40,"path":41,"stem":42,"icon":43},"Pre-commit hooks","\u002Fguides\u002Fpre-commit","2.guides\u002F02.pre-commit","i-lucide-git-commit",{"title":45,"path":46,"stem":47,"icon":48},"Fail only on new duplication","\u002Fguides\u002Fbaseline","2.guides\u002F03.baseline","i-lucide-git-compare",{"title":50,"path":51,"stem":52,"icon":53},"Monorepos","\u002Fguides\u002Fmonorepos","2.guides\u002F04.monorepos","i-lucide-folder-tree",{"title":55,"path":56,"stem":57,"icon":58},"Cross-format detection","\u002Fguides\u002Fcross-format","2.guides\u002F05.cross-format","i-lucide-layers",{"title":60,"path":61,"stem":62,"icon":63},"Agents","\u002Fguides\u002Fagents","2.guides\u002F06.agents","i-lucide-cpu",{"title":65,"path":66,"stem":67,"icon":68},"Editors","\u002Fguides\u002Feditors","2.guides\u002F07.editors","i-lucide-code",{"title":70,"path":71,"stem":72,"icon":73},"Duplication over git history","\u002Fguides\u002Fhistory","2.guides\u002F08.history","i-lucide-chart-no-axes-combined",{"title":75,"path":76,"stem":77,"icon":78},"Dashboard and health score","\u002Fguides\u002Fdashboard","2.guides\u002F09.dashboard","i-lucide-layout-dashboard",{"title":80,"path":81,"stem":82,"icon":83},"Dead code","\u002Fguides\u002Fdead-code","2.guides\u002F10.dead-code","i-lucide-ghost",{"title":85,"path":86,"stem":87,"icon":88},"Comparing two codebases","\u002Fguides\u002Fcompare","2.guides\u002F11.compare","i-lucide-git-compare-arrows",{"title":90,"path":91,"stem":92,"icon":93},"Semantic clones","\u002Fguides\u002Fsemantic-clones","2.guides\u002F12.semantic-clones","i-lucide-brain-circuit",{"title":95,"path":96,"stem":97,"icon":98},"Similar functions","\u002Fguides\u002Fsimilarity","2.guides\u002F13.similarity","i-lucide-list-tree",{"title":100,"path":101,"stem":102,"icon":103},"Boundaries","\u002Fguides\u002Fboundaries","2.guides\u002F14.boundaries","i-lucide-fence",{"title":105,"icon":6,"path":106,"stem":107,"children":108,"page":6},"Concepts","\u002Fconcepts","3.concepts",[109,114,119],{"title":110,"path":111,"stem":112,"icon":113},"Types of code clones","\u002Fconcepts\u002Fclone-types","3.concepts\u002F1.clone-types","i-lucide-copy",{"title":115,"path":116,"stem":117,"icon":118},"How detection works","\u002Fconcepts\u002Fhow-detection-works","3.concepts\u002F2.how-detection-works","i-lucide-scan-search",{"title":120,"path":121,"stem":122,"icon":123},"The health score","\u002Fconcepts\u002Fhealth-score","3.concepts\u002F3.health-score","i-lucide-heart-pulse",{"title":125,"icon":6,"path":126,"stem":127,"children":128,"page":6},"Reference","\u002Freference","4.reference",[129,134,139,144,181,186,190],{"title":130,"path":131,"stem":132,"icon":133},"CLI options","\u002Freference\u002Fcli","4.reference\u002F1.cli","i-lucide-terminal",{"title":135,"path":136,"stem":137,"icon":138},"The config file","\u002Freference\u002Fconfig-file","4.reference\u002F2.config-file","i-lucide-settings",{"title":140,"path":141,"stem":142,"icon":143},"Exit codes","\u002Freference\u002Fexit-codes","4.reference\u002F3.exit-codes","i-lucide-log-out",{"title":145,"icon":6,"path":146,"stem":147,"children":148},"Reporters","\u002Freference\u002Freporters","4.reference\u002F4.reporters\u002Findex",[149,151,156,161,166,171,176],{"title":145,"path":146,"stem":147,"icon":150},"i-lucide-file-chart-column",{"title":152,"path":153,"stem":154,"icon":155},"HTML reporter","\u002Freference\u002Freporters\u002Fhtml","4.reference\u002F4.reporters\u002F2.html","i-lucide-file-code",{"title":157,"path":158,"stem":159,"icon":160},"JSON reporter","\u002Freference\u002Freporters\u002Fjson","4.reference\u002F4.reporters\u002F3.json","i-lucide-braces",{"title":162,"path":163,"stem":164,"icon":165},"Badge reporter","\u002Freference\u002Freporters\u002Fbadge","4.reference\u002F4.reporters\u002F4.badge","i-lucide-award",{"title":167,"path":168,"stem":169,"icon":170},"SARIF reporter","\u002Freference\u002Freporters\u002Fsarif","4.reference\u002F4.reporters\u002F5.sarif","i-lucide-shield-check",{"title":172,"path":173,"stem":174,"icon":175},"CodeClimate reporter","\u002Freference\u002Freporters\u002Fcodeclimate","4.reference\u002F4.reporters\u002F6.codeclimate","i-lucide-flag-triangle-right",{"title":177,"path":178,"stem":179,"icon":180},"OpenMetrics reporter","\u002Freference\u002Freporters\u002Fopenmetrics","4.reference\u002F4.reporters\u002F7.openmetrics","i-lucide-activity",{"title":182,"path":183,"stem":184,"icon":185},"Supported formats","\u002Freference\u002Fsupported-formats","4.reference\u002F5.supported-formats","i-lucide-languages",{"title":187,"path":188,"stem":189,"icon":38},"GitHub Action","\u002Freference\u002Fgithub-action","4.reference\u002F6.github-action",{"title":191,"path":192,"stem":193,"icon":68},"Rust crates","\u002Freference\u002Frust-crates","4.reference\u002F7.rust-crates",{"title":195,"icon":6,"path":196,"stem":197,"children":198,"page":6},"Project","\u002Fproject","5.project",[199,204,209,214,239,244],{"title":200,"path":201,"stem":202,"icon":203},"Changelog","\u002Fproject\u002Fchangelog","5.project\u002F1.changelog","i-lucide-scroll-text",{"title":205,"path":206,"stem":207,"icon":208},"Migrating from v4 to v5","\u002Fproject\u002Fmigration","5.project\u002F2.migration","i-lucide-arrow-right-left",{"title":210,"path":211,"stem":212,"icon":213},"jscpd v4 (TypeScript)","\u002Fproject\u002Fv4","5.project\u002F3.v4","i-simple-icons-typescript",{"title":215,"icon":6,"path":216,"stem":217,"children":218},"Benchmarks","\u002Fproject\u002Fbenchmarks","5.project\u002F4.benchmarks\u002Findex",[219,221,226,230,235],{"title":215,"path":216,"stem":217,"icon":220},"i-lucide-gauge",{"title":222,"path":223,"stem":224,"icon":225},"Detection Speed","\u002Fproject\u002Fbenchmarks\u002Fdetection-speed","5.project\u002F4.benchmarks\u002F2.detection-speed","i-lucide-zap",{"title":227,"path":228,"stem":229,"icon":58},"Multi-Format Detection","\u002Fproject\u002Fbenchmarks\u002Fcross-format","5.project\u002F4.benchmarks\u002F3.cross-format",{"title":231,"path":232,"stem":233,"icon":234},"AI Token Efficiency","\u002Fproject\u002Fbenchmarks\u002Fai-token-efficiency","5.project\u002F4.benchmarks\u002F4.ai-token-efficiency","i-lucide-sparkles",{"title":236,"path":237,"stem":238,"icon":93},"Embedding Models","\u002Fproject\u002Fbenchmarks\u002Fembedding-models","5.project\u002F4.benchmarks\u002F5.embedding-models",{"title":240,"path":241,"stem":242,"icon":243},"Research","\u002Fproject\u002Fresearch","5.project\u002F5.research","i-lucide-graduation-cap",{"title":245,"path":246,"stem":247,"icon":248},"Articles","\u002Fproject\u002Farticles","5.project\u002F6.articles","i-lucide-newspaper",{"name":250,"url":251,"appearances":252,"latest":268},"homeassistant-ai\u002Fha-mcp","https:\u002F\u002Fgithub.com\u002Fhomeassistant-ai\u002Fha-mcp",[253],{"date":254,"rank":255,"stars":256,"starsToday":257,"headSha":258,"sources":259,"lines":260,"clones":261,"duplicatedLines":262,"percentage":263,"codePercentage":264,"codeSources":265,"healthScore":266,"healthGrade":267},"2026-11-10",7,6124,31,"ceb8bed203b1af9f7f70280d60b32f040802e215",2269,888327,3199,59700,6.72,5.52,907,48.6,"D",{"date":254,"generatedAt":269,"name":250,"url":251,"description":270,"language":271,"stars":256,"starsToday":257,"defaultBranch":272,"headSha":258,"durationMs":273,"total":274,"formats":278,"topClones":343,"code":461,"health":581,"complexity":612,"deadCode":666},"2026-11-10T05:21:45.471Z","Configure and automate Home Assistant with Claude, ChatGPT, and other AI assistants.","Python","master",5591,{"sources":259,"lines":260,"tokens":275,"clones":261,"duplicatedLines":262,"duplicatedTokens":276,"percentage":263,"percentageTokens":277},4979279,405065,8.14,[279,286,293,300,307,314,320,326,331,338],{"format":280,"sources":281,"lines":282,"clones":283,"duplicatedLines":284,"percentage":285},"python",1840,779432,2874,44820,5.75,{"format":287,"sources":288,"lines":289,"clones":290,"duplicatedLines":291,"percentage":292},"yaml",148,23689,204,6019,25.41,{"format":294,"sources":295,"lines":296,"clones":297,"duplicatedLines":298,"percentage":299},"html",12,2933,37,439,14.97,{"format":301,"sources":302,"lines":303,"clones":304,"duplicatedLines":305,"percentage":306},"markdown",76,27747,32,7312,26.35,{"format":308,"sources":309,"lines":310,"clones":311,"duplicatedLines":312,"percentage":313},"javascript",45,16347,30,423,2.59,{"format":315,"sources":316,"lines":317,"clones":318,"duplicatedLines":298,"percentage":319},"json",58,28398,5,1.55,{"format":321,"sources":255,"lines":322,"clones":323,"duplicatedLines":324,"percentage":325},"css",1719,4,42,2.44,{"format":327,"sources":328,"lines":329,"clones":323,"duplicatedLines":304,"percentage":330},"typescript",11,414,7.73,{"format":332,"sources":333,"lines":334,"clones":335,"duplicatedLines":336,"percentage":337},"docker",6,286,3,60,20.98,{"format":339,"sources":257,"lines":340,"clones":341,"duplicatedLines":295,"percentage":342},"bash",1466,2,0.82,[344,362,381,402,412,422,431,440,446,454],{"format":301,"lines":345,"tokens":346,"first":347,"others":350,"copies":341,"excerpt":353,"kind":361},6608,88409,{"name":348,"start":349,"end":345},"CHANGELOG.md",1,[351],{"name":352,"start":349,"end":345},"homeassistant-addon\u002FCHANGELOG.md",{"lines":354,"total":345},[355,356,357,356,356,358,356,359,356,360],"# CHANGELOG","","\u003C!-- version list -->","## v9.1.2 (2026-11-08)","### Fixed","- **hacs**: Keep HA-MCP on one store listing and repair installs that got two","docs",{"format":280,"lines":363,"tokens":364,"first":365,"others":367,"copies":341,"excerpt":370,"kind":380},714,4040,{"name":366,"start":349,"end":363},"homeassistant-addon-webhook-proxy-dev\u002Fmcp_proxy_dev\u002Foauth_indirect.py",[368],{"name":369,"start":349,"end":363},"homeassistant-addon-webhook-proxy\u002Fmcp_proxy\u002Foauth_indirect.py",{"lines":371,"total":363},[372,356,373,374,375,376,356,377,378,379],"\"\"\"ha_auth-mode OAuth indirection in front of Home Assistant core.","The proxy-owned authorize and token routes keep client endpoint caches stable","while Home Assistant core remains the authorization server. This module also","validates cross-origin Client ID Metadata Documents before translating their","client identities into the same-origin form accepted by core.","MIRROR: this module is the near-verbatim twin of","``custom_components\u002Fha_mcp_tools\u002Foauth_ha_auth.py``. Keep behavioural changes","on the two sides in step. This pair has exactly TWO intended deltas. The","code",{"format":301,"lines":382,"tokens":383,"first":384,"others":388,"copies":341,"excerpt":393,"kind":361},171,3118,{"name":385,"start":386,"end":387},"homeassistant-addon-webhook-proxy-dev\u002FDOCS.md",21,191,[389],{"name":390,"start":391,"end":392},"homeassistant-addon-webhook-proxy\u002FDOCS.md",20,190,{"lines":394,"total":382},[395,396,356,397,356,398,399,400,356,401],"Assistant notification). Stop the stable app first; the notification clears","automatically on the next clean start.","## Prerequisites","- **Home Assistant MCP Server** app must be installed and running (stable or dev channel)","- For Nabu Casa auto-detection: active Nabu Casa subscription with remote UI enabled","- For other setups: a working reverse proxy pointing at your HA instance","## Setup",{"format":280,"lines":403,"tokens":404,"first":405,"others":409,"copies":341,"kind":380},361,2058,{"name":406,"start":407,"end":408},"homeassistant-addon-webhook-proxy-dev\u002Fmcp_proxy_dev\u002Foauth.py",396,756,[410],{"name":411,"start":407,"end":408},"homeassistant-addon-webhook-proxy\u002Fmcp_proxy\u002Foauth.py",{"format":280,"lines":413,"tokens":414,"first":415,"others":419,"copies":341,"kind":380},333,2050,{"name":416,"start":417,"end":418},"homeassistant-addon-webhook-proxy-dev\u002Fmcp_proxy_dev\u002Foauth_autoapprove.py",269,601,[420],{"name":421,"start":417,"end":418},"homeassistant-addon-webhook-proxy\u002Fmcp_proxy\u002Foauth_autoapprove.py",{"format":280,"lines":407,"tokens":423,"first":424,"others":428,"copies":341,"kind":380},2010,{"name":425,"start":426,"end":427},"homeassistant-addon-webhook-proxy-dev\u002Fstart.py",330,725,[429],{"name":430,"start":426,"end":427},"homeassistant-addon-webhook-proxy\u002Fstart.py",{"format":432,"lines":433,"tokens":434,"first":435,"others":437,"copies":341,"kind":432},"markup",75,1789,{"name":436,"start":349,"end":433},"site\u002Fpublic\u002Ffavicon.svg",[438],{"name":439,"start":349,"end":433},"site\u002Fpublic\u002Ficon.svg",{"format":280,"lines":441,"tokens":442,"first":443,"others":444,"copies":341,"kind":380},267,1724,{"name":416,"start":349,"end":441},[445],{"name":421,"start":349,"end":441},{"format":280,"lines":447,"tokens":448,"first":449,"others":452,"copies":341,"kind":380},241,1671,{"name":406,"start":450,"end":451},901,1141,[453],{"name":411,"start":450,"end":451},{"format":280,"lines":455,"tokens":456,"first":457,"others":459,"copies":341,"kind":380},326,1590,{"name":406,"start":458,"end":407},71,[460],{"name":411,"start":458,"end":407},{"sources":265,"lines":462,"tokens":463,"clones":464,"duplicatedLines":465,"duplicatedTokens":466,"percentage":264,"percentageTokens":467,"formats":468,"topClones":495,"generated":576},353877,1906674,948,19525,118680,6.22,[469,475,476,481,482,486,490,492],{"format":280,"sources":470,"lines":471,"clones":472,"duplicatedLines":473,"percentage":474},834,335132,892,18762,5.6,{"format":294,"sources":295,"lines":296,"clones":297,"duplicatedLines":298,"percentage":299},{"format":308,"sources":477,"lines":478,"clones":295,"duplicatedLines":479,"percentage":480},27,10431,258,2.47,{"format":327,"sources":328,"lines":329,"clones":323,"duplicatedLines":304,"percentage":330},{"format":321,"sources":318,"lines":483,"clones":335,"duplicatedLines":484,"percentage":485},277,34,12.27,{"format":487,"sources":295,"lines":488,"clones":489,"duplicatedLines":489,"percentage":489},"astro",3917,0,{"format":339,"sources":318,"lines":491,"clones":489,"duplicatedLines":489,"percentage":489},603,{"format":493,"sources":349,"lines":494,"clones":489,"duplicatedLines":489,"percentage":489},"powershell",170,[496,502,518,533,537,541,545,549,559,569],{"format":280,"lines":363,"tokens":364,"first":497,"others":498,"copies":341,"excerpt":500,"kind":380},{"name":366,"start":349,"end":363},[499],{"name":369,"start":349,"end":363},{"lines":501,"total":363},[372,356,373,374,375,376,356,377,378,379],{"format":280,"lines":403,"tokens":404,"first":503,"others":504,"copies":341,"excerpt":506,"kind":380},{"name":406,"start":407,"end":408},[505],{"name":411,"start":407,"end":408},{"lines":507,"total":403},[508,509,510,511,512,513,514,515,516,517],"HEARTBEAT_FILE = Path(\"\u002Fconfig\u002F.mcp_proxy_dev_heartbeat\")","_HEARTBEAT_MAX_AGE = 90.0  # three missed 30-second touches","# Only the NEGATIVE verdict is cached (#2218 review): a clean shutdown deletes","# the heartbeat file but cannot clear a cache in the integration process, so a","# cached True would keep the surface serving after the stop. A fresh stat per","# request while alive is microseconds in the executor; the cache exists so an","# anonymous flood against a STOPPED install does not stat per request.","#","# The lease MUST stay shorter than start.py's `_probe_oauth_active` delay","# (2 s between 3 attempts): that probe drives a DESTRUCTIVE path — it tears",{"format":280,"lines":413,"tokens":414,"first":519,"others":520,"copies":341,"excerpt":522,"kind":380},{"name":416,"start":417,"end":418},[521],{"name":421,"start":417,"end":418},{"lines":523,"total":413},[524,525,526,356,527,528,529,530,531,532],"def __init__(self, hass: HomeAssistant) -> None:","    \"\"\"Bind the view to the HA instance; liveness is resolved per request.\"\"\"","    self._hass = hass","async def get(self, request: web.Request) -> web.Response:","    \"\"\"Dispatch an authorization request to the currently active mode.\"\"\"","    if not await _addon_alive(self._hass):","        return _json_not_found()","    data = _domain_data(self._hass)","    if data is None:",{"format":280,"lines":407,"tokens":423,"first":534,"others":535,"copies":341,"kind":380},{"name":425,"start":426,"end":427},[536],{"name":430,"start":426,"end":427},{"format":280,"lines":441,"tokens":442,"first":538,"others":539,"copies":341,"kind":380},{"name":416,"start":349,"end":441},[540],{"name":421,"start":349,"end":441},{"format":280,"lines":447,"tokens":448,"first":542,"others":543,"copies":341,"kind":380},{"name":406,"start":450,"end":451},[544],{"name":411,"start":450,"end":451},{"format":280,"lines":455,"tokens":456,"first":546,"others":547,"copies":341,"kind":380},{"name":406,"start":458,"end":407},[548],{"name":411,"start":458,"end":407},{"format":280,"lines":550,"tokens":551,"first":552,"others":554,"copies":335,"kind":380},127,770,{"name":553,"start":349,"end":550},"custom_components\u002Fha_mcp_tools\u002Freadonly_webhook.py",[555,557],{"name":556,"start":349,"end":550},"homeassistant-addon-webhook-proxy-dev\u002Fmcp_proxy_dev\u002Freadonly_webhook.py",{"name":558,"start":349,"end":550},"homeassistant-addon-webhook-proxy\u002Fmcp_proxy\u002Freadonly_webhook.py",{"format":280,"lines":560,"tokens":561,"first":562,"others":566,"copies":341,"kind":380},291,1365,{"name":563,"start":564,"end":565},"homeassistant-addon-webhook-proxy-dev\u002Fmcp_proxy_dev\u002F__init__.py",856,1146,[567],{"name":568,"start":564,"end":565},"homeassistant-addon-webhook-proxy\u002Fmcp_proxy\u002F__init__.py",{"format":280,"lines":570,"tokens":571,"first":572,"others":574,"copies":341,"kind":380},202,1288,{"name":416,"start":491,"end":573},804,[575],{"name":421,"start":491,"end":573},{"files":335,"minified":489,"sample":577},[578,579,580],"src\u002Fha_mcp\u002F_vendor\u002Fmcp_types\u002F_v2025_11_25\u002F__init__.py","src\u002Fha_mcp\u002F_vendor\u002Fmcp_types\u002F_v2026_07_28\u002F__init__.py","src\u002Fha_mcp\u002Fsettings_ui\u002Fsettings_js\u002F05_feature_flags.js",{"score":266,"grade":267,"size":582,"dimensions":586},{"lines":583,"files":584,"class":585},800353,1900,"L",[587,598,605],{"id":588,"source":589,"value":590,"adjusted":590,"lines":591,"halfLife":592,"formats":593,"excluded":594,"weight":349,"score":597},"duplication","jscpd",5.7,45335,8.5,[280,308,487,339,332,327,493],[432,595,596],"text","data",63,{"id":599,"source":589,"value":600,"adjusted":600,"lines":601,"halfLife":602,"coverage":603,"weight":349,"score":604},"dead-code",9.2,73731,7.5,100,42.7,{"id":606,"source":589,"value":607,"adjusted":608,"lines":609,"halfLife":610,"weight":349,"score":611},"complexity",61.6,61.5,493179,50,42.6,{"total":613,"mean":614,"files":615},81339,42.8,[616,621,626,631,636,641,646,651,656,661],{"path":617,"complexity":618,"lines":619,"bytes":620},"src\u002Fha_mcp\u002Fbackup_manager.py",625,3567,150437,{"path":622,"complexity":623,"lines":624,"bytes":625},"tests\u002Faddon\u002Ftest_webhook_proxy.py",570,7197,316784,{"path":627,"complexity":628,"lines":629,"bytes":630},"src\u002Fha_mcp\u002Ftools\u002Ftools_addons.py",504,4038,158555,{"path":632,"complexity":633,"lines":634,"bytes":635},"custom_components\u002Fha_mcp_tools\u002F__init__.py",488,3564,144724,{"path":637,"complexity":638,"lines":639,"bytes":640},"src\u002Fha_mcp\u002Ftools\u002Ftools_config_dashboards.py",415,3755,157087,{"path":642,"complexity":643,"lines":644,"bytes":645},"tests\u002Fsrc\u002Funit\u002Ftest_tools_addons.py",382,6904,266973,{"path":647,"complexity":648,"lines":649,"bytes":650},"tests\u002Finitial_test_state\u002Fcustom_components\u002Fhacs\u002Frepositories\u002Fbase.py",337,1453,54662,{"path":652,"complexity":653,"lines":654,"bytes":655},"src\u002Fha_mcp\u002F_vendor\u002Ffastmcp\u002Fserver\u002Fserver.py",317,2595,108208,{"path":657,"complexity":658,"lines":659,"bytes":660},"src\u002Fha_mcp\u002Fclient\u002Frest_client.py",306,2556,113374,{"path":662,"complexity":663,"lines":664,"bytes":665},"tests\u002Fsrc\u002Funit\u002Ftest_backup_manager.py",292,3547,145860,{"percentage":667,"findings":668,"files":669,"byCategory":670,"largest":682},9.22,309,2007,[671,674,676,679],{"category":672,"count":673},"unused-file",168,{"category":675,"count":304},"unused-export",{"category":677,"count":678},"unused-symbol",96,{"category":680,"count":681},"unused-import",13,[683,686,689,692,695,698,701,704,707,710],{"category":672,"path":684,"name":356,"line":349,"lines":685},"src\u002Fha_mcp\u002Ftools\u002Ftools_entities.py",2158,{"category":672,"path":687,"name":356,"line":349,"lines":688},"src\u002Fha_mcp\u002Ftools\u002Ftools_system.py",1933,{"category":672,"path":690,"name":356,"line":349,"lines":691},"src\u002Fha_mcp\u002Ftools\u002Ftools_config_automations.py",1668,{"category":672,"path":693,"name":356,"line":349,"lines":694},"src\u002Fha_mcp\u002Ftools\u002Ftools_config_scenes.py",1456,{"category":672,"path":696,"name":356,"line":349,"lines":697},"src\u002Fha_mcp\u002Ftools\u002Ftools_config_scripts.py",1154,{"category":672,"path":699,"name":356,"line":349,"lines":700},"src\u002Fha_mcp\u002Ftools\u002Ftools_registry.py",1117,{"category":672,"path":702,"name":356,"line":349,"lines":703},"src\u002Fha_mcp\u002F_vendor\u002Fwebsockets\u002Fsync\u002Fclient.py",1116,{"category":672,"path":705,"name":356,"line":349,"lines":706},"src\u002Fha_mcp\u002Ftools\u002Ftools_history.py",1100,{"category":672,"path":708,"name":356,"line":349,"lines":709},"src\u002Fha_mcp\u002Ftools\u002Ftools_updates.py",1083,{"category":672,"path":711,"name":356,"line":349,"lines":712},"src\u002Fha_mcp\u002Ftools\u002Ftools_hacs.py",999,{"\u002Ftrending\u002Fhomeassistant-ai\u002Fha-mcp":714},{"views":489,"visits":489},1794293458028]