{"_id":"@auggieteo/dsh-mcp-adapter","_rev":"11-e7bb574cb364ce9345bffa394c3353e4","name":"@auggieteo/dsh-mcp-adapter","dist-tags":{"latest":"0.5.0"},"versions":{"0.1.0":{"name":"@auggieteo/dsh-mcp-adapter","version":"0.1.0","license":"MIT","_id":"@auggieteo/dsh-mcp-adapter@0.1.0","maintainers":[{"name":"auggieteo","email":"auggie.teo@gmail.com"}],"homepage":"https://github.com/auggie246/dsh-mcp-adapter#readme","bugs":{"url":"https://github.com/auggie246/dsh-mcp-adapter/issues"},"dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-client-runtime","@deepseek-ai/dsh-client-ui-settings"],"platform":"web","immediately":true}},"dist":{"shasum":"06647fcb03c1199854fd792bb7dacdc2b727a68a","tarball":"https://registry.npmjs.org/@auggieteo/dsh-mcp-adapter/-/dsh-mcp-adapter-0.1.0.tgz","fileCount":17,"integrity":"sha512-n99xEueL7BoF+BsF1XIzvXoJcM2DRQ6UKWeIBodiX7/sRlM5bWwQE3NdLtcQkSA+0b8RizP712Aw0FNgD96W+Q==","signatures":[{"sig":"MEYCIQDaV0+XrXZrsoQBSYi/dt95pEP+FaCk/rvQNghXj+mD4gIhAK256fCP/CStVYsT+g++I1iAcikSaHeFfUKykJKCA5Rq","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":201573},"main":"src/host/index.js","type":"module","exports":{".":{"default":"./src/host/index.js"},"./client":{"default":"./lib/client.js"},"./package.json":"./package.json"},"gitHead":"1c9cf34476a9e78fbc5f71693a4d97e345f55da7","scripts":{"dev":"node build.mjs --watch","test":"node --test test/*.test.js","build":"node build.mjs","prepack":"npm run build"},"_npmUser":{"name":"auggieteo","email":"auggie.teo@gmail.com"},"repository":{"url":"git+https://github.com/auggie246/dsh-mcp-adapter.git","type":"git"},"_npmVersion":"10.9.7","description":"DSH plugin connecting the agent to MCP servers through one mcp proxy tool and a Settings > MCP page. Mirrors pi-mcp-adapter's major features.","directories":{},"_nodeVersion":"22.22.2","dependencies":{"@modelcontextprotocol/sdk":"1.30.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.0","@deepseek-ai/cordis":"^4.0.1","@deepseek-ai/schemastery":"^3.18.1","@deepseek-ai/dsh-settings":"0.1.1-rc.2"},"peerDependencies":{"@deepseek-ai/schemastery":"^3.18.1","@deepseek-ai/dsh-settings":"^0.1.1-rc.2"},"_npmOperationalInternal":{"tmp":"tmp/dsh-mcp-adapter_0.1.0_1788083769404_0.5067117608941942","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@auggieteo/dsh-mcp-adapter","version":"0.1.1","license":"MIT","_id":"@auggieteo/dsh-mcp-adapter@0.1.1","maintainers":[{"name":"auggieteo","email":"auggie.teo@gmail.com"}],"homepage":"https://github.com/auggie246/dsh-mcp-adapter#readme","bugs":{"url":"https://github.com/auggie246/dsh-mcp-adapter/issues"},"dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-client-runtime","@deepseek-ai/dsh-client-ui-settings"],"platform":"web","immediately":true}},"dist":{"shasum":"54ec6dd457f15b4d33097ce76995c58539201eb4","tarball":"https://registry.npmjs.org/@auggieteo/dsh-mcp-adapter/-/dsh-mcp-adapter-0.1.1.tgz","fileCount":17,"integrity":"sha512-VgQJhtryHS2adhjMNeJW6bwbjMtjFPA9ni7SgvCmZA+QMwk3dCu33ErK9lkmriCD9U0Ce9EfRi7/e98isjHBOQ==","signatures":[{"sig":"MEQCIHfDmpqvBkDt5ANTAVyM+Hsy46WsyrCiYJ/fLZcNVAxAAiADOrLKgRb3IdeIDS/ajnmo4ZO8tVDlCFI2gUDWydlWQQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@auggieteo%2fdsh-mcp-adapter@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":201573},"main":"src/host/index.js","type":"module","exports":{".":{"default":"./src/host/index.js"},"./client":{"default":"./lib/client.js"},"./package.json":"./package.json"},"gitHead":"188b9eb0581aa04ba870790f01617ef7abe3080d","scripts":{"dev":"node build.mjs --watch","test":"node --test test/*.test.js","build":"node build.mjs","prepack":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2b4eac83-39d2-4ab6-9ecc-7de3b6c4003a"}},"repository":{"url":"git+https://github.com/auggie246/dsh-mcp-adapter.git","type":"git"},"_npmVersion":"11.17.0","description":"DSH plugin connecting the agent to MCP servers through one mcp proxy tool and a Settings > MCP page. Mirrors pi-mcp-adapter's major features.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"@modelcontextprotocol/sdk":"1.30.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.0","@deepseek-ai/cordis":"^4.0.1","@deepseek-ai/schemastery":"^3.18.1","@deepseek-ai/dsh-settings":"0.1.1-rc.2"},"peerDependencies":{"@deepseek-ai/schemastery":"^3.18.1","@deepseek-ai/dsh-settings":"^0.1.1-rc.2"},"_npmOperationalInternal":{"tmp":"tmp/dsh-mcp-adapter_0.1.1_1788089154951_0.5743657352721878","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@auggieteo/dsh-mcp-adapter","version":"0.1.2","license":"MIT","_id":"@auggieteo/dsh-mcp-adapter@0.1.2","maintainers":[{"name":"auggieteo","email":"auggie.teo@gmail.com"}],"homepage":"https://github.com/auggie246/dsh-mcp-adapter#readme","bugs":{"url":"https://github.com/auggie246/dsh-mcp-adapter/issues"},"dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-client-runtime","@deepseek-ai/dsh-client-ui-settings"],"platform":"web","immediately":true}},"dist":{"shasum":"365610aa64fa5fe385e75a44d0b76babc886d1f9","tarball":"https://registry.npmjs.org/@auggieteo/dsh-mcp-adapter/-/dsh-mcp-adapter-0.1.2.tgz","fileCount":17,"integrity":"sha512-nLqRvj+EMAScvLJULan/TEqZASJLOlfPfGe0/RtB6jxWarF3Cs2nLg5GcoNj0DdCrgaVJ+6slBnfqhg1GJDEeQ==","signatures":[{"sig":"MEUCIB7MRNcg96o7CmDNW+lmVxVne/ZBDvPh1co+SDLRVl+pAiEA76TMJYmnK4fEkldzAva5N6spbP4a0M8rnmxYwtx5nSQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@auggieteo%2fdsh-mcp-adapter@0.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":208477},"main":"src/host/index.js","type":"module","exports":{".":{"default":"./src/host/index.js"},"./client":{"default":"./lib/client.js"},"./package.json":"./package.json"},"gitHead":"c0e9ffc63a43de85566a4a7a405fe4a025faef3d","scripts":{"dev":"node build.mjs --watch","test":"node --test test/*.test.js","build":"node build.mjs","prepack":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2b4eac83-39d2-4ab6-9ecc-7de3b6c4003a"}},"repository":{"url":"git+https://github.com/auggie246/dsh-mcp-adapter.git","type":"git"},"_npmVersion":"11.17.0","description":"DSH plugin connecting the agent to MCP servers through one mcp proxy tool and a Settings > MCP page. Mirrors pi-mcp-adapter's major features.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"@modelcontextprotocol/sdk":"1.30.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.0","@deepseek-ai/cordis":"^4.0.1","@deepseek-ai/schemastery":"^3.18.1","@deepseek-ai/dsh-settings":"0.1.1-rc.2"},"peerDependencies":{"@deepseek-ai/schemastery":"^3.18.1","@deepseek-ai/dsh-settings":"^0.1.1-rc.2"},"_npmOperationalInternal":{"tmp":"tmp/dsh-mcp-adapter_0.1.2_1788145969933_0.4103415163368138","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@auggieteo/dsh-mcp-adapter","version":"0.2.0","license":"MIT","_id":"@auggieteo/dsh-mcp-adapter@0.2.0","maintainers":[{"name":"auggieteo","email":"auggie.teo@gmail.com"}],"homepage":"https://github.com/auggie246/dsh-mcp-adapter#readme","bugs":{"url":"https://github.com/auggie246/dsh-mcp-adapter/issues"},"dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-client-runtime","@deepseek-ai/dsh-client-ui-settings"],"platform":"web","immediately":true}},"dist":{"shasum":"e5cc292e1e27f9da123a38a1005f641a20788c31","tarball":"https://registry.npmjs.org/@auggieteo/dsh-mcp-adapter/-/dsh-mcp-adapter-0.2.0.tgz","fileCount":34,"integrity":"sha512-V65rnY4Lo+GoLI1Ixc419gy+eU2IHAtYnxzqjK3o20wcnnGQMaQV70l74uQ1eatcRhdGEQkkaCDFVbwcfoKpKQ==","signatures":[{"sig":"MEQCIDFOdH+fvkMR7qbZYlq0e2vae3SVxKWu1j9X7K2NttTKAiBQ3+BvOXcMS08MITFhsyS9VCFcFpSct+Q1ncRAgLIRsA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@auggieteo%2fdsh-mcp-adapter@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":357843},"main":"src/host/index.js","type":"module","exports":{".":{"default":"./src/host/index.js"},"./client":{"default":"./lib/client.js"},"./package.json":"./package.json"},"gitHead":"8a93f0144082df8900af655b0d316ae6d666b6a2","scripts":{"dev":"node build.mjs --watch","test":"node --test test/*.test.js","build":"node build.mjs","prepack":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2b4eac83-39d2-4ab6-9ecc-7de3b6c4003a"}},"repository":{"url":"git+https://github.com/auggie246/dsh-mcp-adapter.git","type":"git"},"_npmVersion":"11.19.0","description":"DSH plugin connecting the agent to MCP servers through one mcp proxy tool and a Settings > MCP page.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"@modelcontextprotocol/sdk":"1.30.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.0","@deepseek-ai/cordis":"^4.0.1","@deepseek-ai/schemastery":"^3.18.1","@deepseek-ai/dsh-settings":"0.1.1-rc.2"},"peerDependencies":{"@deepseek-ai/schemastery":"^3.18.1","@deepseek-ai/dsh-settings":"^0.1.1-rc.2 || ^0.1.2-rc.1"},"_npmOperationalInternal":{"tmp":"tmp/dsh-mcp-adapter_0.2.0_1788624570889_0.9801319625309999","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@auggieteo/dsh-mcp-adapter","version":"0.2.1","license":"MIT","_id":"@auggieteo/dsh-mcp-adapter@0.2.1","maintainers":[{"name":"auggieteo","email":"auggie.teo@gmail.com"}],"homepage":"https://github.com/auggie246/dsh-mcp-adapter#readme","bugs":{"url":"https://github.com/auggie246/dsh-mcp-adapter/issues"},"dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-client-runtime","@deepseek-ai/dsh-client-ui-settings"],"platform":"web","immediately":true}},"dist":{"shasum":"5837f14ea1059d219122abe0cb3f1fa31f93f862","tarball":"https://registry.npmjs.org/@auggieteo/dsh-mcp-adapter/-/dsh-mcp-adapter-0.2.1.tgz","fileCount":34,"integrity":"sha512-6qZ07qrZ1pkcNZkQp/8dkBU9VoStzNwTson6zU6v6aavZGApUuFRqEkZny8fI4jtFktAq8VW1hXJNp+wEPRL/A==","signatures":[{"sig":"MEYCIQD7LGEsCw9FswCdHBgM/BwE37Eixi8058geff/ZmULwNwIhAKE8taxwspd6H7x2BaC0O3Wcnsa8o99fwjK69w09H7Rd","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@auggieteo%2fdsh-mcp-adapter@0.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":362758},"main":"src/host/index.js","type":"module","exports":{".":{"default":"./src/host/index.js"},"./client":{"default":"./lib/client.js"},"./package.json":"./package.json"},"gitHead":"b98b84674ca35aeab90913a8c65e3e126081eb2f","scripts":{"dev":"node build.mjs --watch","test":"node --test test/*.test.js","build":"node build.mjs","prepack":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2b4eac83-39d2-4ab6-9ecc-7de3b6c4003a"}},"repository":{"url":"git+https://github.com/auggie246/dsh-mcp-adapter.git","type":"git"},"_npmVersion":"11.19.0","description":"DSH plugin connecting the agent to MCP servers through one mcp proxy tool and a Settings > MCP page.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"@modelcontextprotocol/sdk":"1.30.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.0","@deepseek-ai/cordis":"^4.0.1","@deepseek-ai/schemastery":"^3.18.1","@deepseek-ai/dsh-settings":"0.1.1-rc.2"},"peerDependencies":{"@deepseek-ai/schemastery":"^3.18.1","@deepseek-ai/dsh-settings":"^0.1.1-rc.2 || ^0.1.2-rc.1"},"_npmOperationalInternal":{"tmp":"tmp/dsh-mcp-adapter_0.2.1_1788664233844_0.29800963912221334","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@auggieteo/dsh-mcp-adapter","version":"0.2.2","license":"MIT","_id":"@auggieteo/dsh-mcp-adapter@0.2.2","maintainers":[{"name":"auggieteo","email":"auggie.teo@gmail.com"}],"homepage":"https://github.com/auggie246/dsh-mcp-adapter#readme","bugs":{"url":"https://github.com/auggie246/dsh-mcp-adapter/issues"},"dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-client-runtime","@deepseek-ai/dsh-client-ui-settings"],"platform":"web","immediately":true}},"dist":{"shasum":"53ee8b8efa0db42e84321a7e9bca1961a36bb1ce","tarball":"https://registry.npmjs.org/@auggieteo/dsh-mcp-adapter/-/dsh-mcp-adapter-0.2.2.tgz","fileCount":34,"integrity":"sha512-ToVLsVnyVbfBAPYxQiYzTnGbVoEpZpebaoeurmQsTVWKGIpKaUOl8hxl6lki8Ov0MNDkAzZuQTVEy5GPP2Bi/w==","signatures":[{"sig":"MEUCIQCkXMorgCqDzxS5pslGLVz+YMdvEZaPcL0SG+/DGJg+OgIgQ8NCwMF9n03Mw27zwknwxEkRXIsbWAeGCPCS8hKYXJU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@auggieteo%2fdsh-mcp-adapter@0.2.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":370023},"main":"src/host/index.js","type":"module","exports":{".":{"default":"./src/host/index.js"},"./client":{"default":"./lib/client.js"},"./package.json":"./package.json"},"gitHead":"29e7954bb30523ffc5b8f78974916911b36d9cd2","scripts":{"dev":"node build.mjs --watch","test":"node --test test/*.test.js","build":"node build.mjs","prepack":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2b4eac83-39d2-4ab6-9ecc-7de3b6c4003a"}},"repository":{"url":"git+https://github.com/auggie246/dsh-mcp-adapter.git","type":"git"},"_npmVersion":"11.19.0","description":"DSH plugin connecting the agent to MCP servers through one mcp proxy tool and a Settings > MCP page.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"@modelcontextprotocol/sdk":"1.30.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.0","@deepseek-ai/cordis":"^4.0.1","@deepseek-ai/schemastery":"^3.18.1","@deepseek-ai/dsh-settings":"0.1.1-rc.2"},"peerDependencies":{"@deepseek-ai/schemastery":"^3.18.1","@deepseek-ai/dsh-settings":"^0.1.1-rc.2 || ^0.1.2-rc.1"},"_npmOperationalInternal":{"tmp":"tmp/dsh-mcp-adapter_0.2.2_1788679415725_0.7578413532169808","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@auggieteo/dsh-mcp-adapter","version":"0.3.0","license":"MIT","_id":"@auggieteo/dsh-mcp-adapter@0.3.0","maintainers":[{"name":"auggieteo","email":"auggie.teo@gmail.com"}],"homepage":"https://github.com/auggie246/dsh-mcp-adapter#readme","bugs":{"url":"https://github.com/auggie246/dsh-mcp-adapter/issues"},"dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-client-runtime","@deepseek-ai/dsh-client-ui-settings"],"platform":"web","immediately":true}},"dist":{"shasum":"e65b1b744108cb2313c196723d1169af3befbc58","tarball":"https://registry.npmjs.org/@auggieteo/dsh-mcp-adapter/-/dsh-mcp-adapter-0.3.0.tgz","fileCount":34,"integrity":"sha512-e4U1qIp6wFxclrp7718J79JFLPL31AVC0KDvJvkGAH9Zo9NJSWIaIbOz8aj9DLKXhtz92kyCcbacwa6wQXJFZg==","signatures":[{"sig":"MEYCIQDKBKiTrh7+NX1O3JF0w5x2gIbIynNsvmFpPqSAHuzJCgIhAKwJnnS2F8dx4yEkuXhEraqRw91GfN3qyJFAMSeU3/fQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@auggieteo%2fdsh-mcp-adapter@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":371341},"main":"src/host/index.js","type":"module","exports":{".":{"default":"./src/host/index.js"},"./client":{"default":"./lib/client.js"},"./package.json":"./package.json"},"gitHead":"4c05d6059b627c57c6e72b40f9ad59c883187fab","scripts":{"dev":"node build.mjs --watch","test":"node --test test/*.test.js","build":"node build.mjs","prepack":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2b4eac83-39d2-4ab6-9ecc-7de3b6c4003a"}},"repository":{"url":"git+https://github.com/auggie246/dsh-mcp-adapter.git","type":"git"},"_npmVersion":"11.19.0","description":"DSH plugin connecting the agent to MCP servers through one mcp proxy tool and a Settings > MCP page.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"@modelcontextprotocol/sdk":"1.30.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.0","@deepseek-ai/cordis":"^4.0.1","@deepseek-ai/schemastery":"^3.18.1","@deepseek-ai/dsh-settings":"0.1.1-rc.2"},"peerDependencies":{"@deepseek-ai/schemastery":"^3.18.1","@deepseek-ai/dsh-settings":"^0.1.1-rc.2 || ^0.1.2-rc.1 || ^0.1.5-rc.1"},"_npmOperationalInternal":{"tmp":"tmp/dsh-mcp-adapter_0.3.0_1789280191148_0.6766542356484442","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@auggieteo/dsh-mcp-adapter","version":"0.4.0","license":"MIT","_id":"@auggieteo/dsh-mcp-adapter@0.4.0","maintainers":[{"name":"auggieteo","email":"auggie.teo@gmail.com"}],"homepage":"https://github.com/auggie246/dsh-mcp-adapter#readme","bugs":{"url":"https://github.com/auggie246/dsh-mcp-adapter/issues"},"dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-client-ui-settings"],"platform":"web","immediately":true}},"dist":{"shasum":"0266df87c937307a9935cb52ad2bdfe7aa08f029","tarball":"https://registry.npmjs.org/@auggieteo/dsh-mcp-adapter/-/dsh-mcp-adapter-0.4.0.tgz","fileCount":36,"integrity":"sha512-nCKBW1SYd7HmijGB+KFjkdcCKGvELY7LqagwRvJ0f1GPxEtKpA96ilP+DtOQuml3P7NasZAlYz6GMYmlO75MEQ==","signatures":[{"sig":"MEUCIAGY5vwinX8ZxDIBaLSLu3bqMxGJhD9ysnuunnafEPk2AiEA8b3fJP5Pcrj4wsp6ZTVaSxJxSyq4ohgnyPFHdB2tfTc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIBxtq+GHW2Z0nQ3mPYwfc0B5idJ8qsSbNL1c6yOXNNO8AiEA1FuI/rqdE6ampgXPiFjzRNWpHsIpYLXzogRj4ZaS7SA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@auggieteo%2fdsh-mcp-adapter@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":392156},"main":"src/host/index.js","type":"module","exports":{".":{"default":"./src/host/index.js"},"./client":{"default":"./lib/client.js"},"./package.json":"./package.json"},"gitHead":"1d00aff014a01f19325a1781f0177b4c0880df97","scripts":{"dev":"node build.mjs --watch","test":"node --test test/*.test.js","build":"node build.mjs","prepack":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2b4eac83-39d2-4ab6-9ecc-7de3b6c4003a"}},"repository":{"url":"git+https://github.com/auggie246/dsh-mcp-adapter.git","type":"git"},"_npmVersion":"11.19.0","description":"DSH plugin connecting the agent to MCP servers through one mcp proxy tool and a Settings > MCP page.","directories":{},"_nodeVersion":"24.21.0","dependencies":{"yaml":"^2.8.1","@modelcontextprotocol/sdk":"1.30.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.0","@deepseek-ai/cordis":"^4.0.4","@deepseek-ai/schemastery":"^3.18.4","@deepseek-ai/dsh-settings":"0.1.7-rc.2"},"peerDependencies":{"@deepseek-ai/schemastery":"^3.18.4","@deepseek-ai/dsh-settings":"^0.1.7-rc.1"},"_npmOperationalInternal":{"tmp":"tmp/dsh-mcp-adapter_0.4.0_1790524430706_0.9799768319541409","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@auggieteo/dsh-mcp-adapter","version":"0.4.1","license":"MIT","_id":"@auggieteo/dsh-mcp-adapter@0.4.1","maintainers":[{"name":"auggieteo","email":"auggie.teo@gmail.com"}],"homepage":"https://github.com/auggie246/dsh-mcp-adapter#readme","bugs":{"url":"https://github.com/auggie246/dsh-mcp-adapter/issues"},"dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-client-ui-settings"],"platform":"web","immediately":true}},"dist":{"shasum":"3bb9d650ad6abe01282e7a8a7ca1960264a4e5cf","tarball":"https://registry.npmjs.org/@auggieteo/dsh-mcp-adapter/-/dsh-mcp-adapter-0.4.1.tgz","fileCount":36,"integrity":"sha512-+k1Fspdr8yuobBDse5NgfGRWExWF7i1Db/TU/EEulfQt2pojgApiIdtP09srhEQS8g3bz7pqAE6HhbXWSn7Hcg==","signatures":[{"sig":"MEYCIQDZXHH3sDn2H/Ev7onthPK1qKTLOS+HkVR45gi/cdDAHwIhAM+D5g+8J2uvtNoaRgn/0G8xGS3VHnj1kJo03ibU9QcA","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIFR3AtGFSQQRX78RCoZxeW9br7ZFQmDUhF3LvLlNz8jOAiAjdrnpdSy7lB613Kq85SkIbdZgwStS0NrFg3mocPC10w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@auggieteo%2fdsh-mcp-adapter@0.4.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":395431},"main":"src/host/index.js","type":"module","exports":{".":{"default":"./src/host/index.js"},"./client":{"default":"./lib/client.js"},"./package.json":"./package.json"},"gitHead":"1e6c8292b25953e4c0af7ddf191406f46ef2c0e5","scripts":{"dev":"node build.mjs --watch","test":"node --test test/*.test.js","build":"node build.mjs","prepack":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2b4eac83-39d2-4ab6-9ecc-7de3b6c4003a"}},"repository":{"url":"git+https://github.com/auggie246/dsh-mcp-adapter.git","type":"git"},"_npmVersion":"11.19.0","description":"DSH plugin connecting the agent to MCP servers through one mcp proxy tool and a Settings > MCP page.","directories":{},"_nodeVersion":"24.21.0","dependencies":{"yaml":"^2.8.1","@modelcontextprotocol/sdk":"1.30.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.0","@deepseek-ai/cordis":"^4.0.4","@deepseek-ai/schemastery":"^3.18.4","@deepseek-ai/dsh-settings":"0.1.7-rc.2"},"peerDependencies":{"@deepseek-ai/schemastery":"^3.18.4","@deepseek-ai/dsh-settings":"^0.1.7-rc.1"},"_npmOperationalInternal":{"tmp":"tmp/dsh-mcp-adapter_0.4.1_1790583608476_0.28819590156798336","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"name":"@auggieteo/dsh-mcp-adapter","version":"0.4.2","license":"MIT","_id":"@auggieteo/dsh-mcp-adapter@0.4.2","maintainers":[{"name":"auggieteo","email":"auggie.teo@gmail.com"}],"homepage":"https://github.com/auggie246/dsh-mcp-adapter#readme","bugs":{"url":"https://github.com/auggie246/dsh-mcp-adapter/issues"},"dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-client-ui-settings"],"platform":"web","immediately":true}},"dist":{"shasum":"83aa2b5722b2ece1630a63a31a57d30958eb1eb4","tarball":"https://registry.npmjs.org/@auggieteo/dsh-mcp-adapter/-/dsh-mcp-adapter-0.4.2.tgz","fileCount":41,"integrity":"sha512-g2c5g7rOuCaxOFDVEKvPBdj4wafSUeo2rKBgFM8iBZVPEMx3dXYW3H9IX89I5WWeEK7iA1E8N6obhFeCCiYcQA==","signatures":[{"sig":"MEUCIE92E6wFSYGkOVyyBx/VAUqvUEE/vs5YRBjgG7qxt4jOAiEAvljA3sx1Nytyadj9a/x0yNGVmf8laFsuOpw4BRPdp2M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCmO4JIBz8TdZmW5COmtiehjd43GsRtaytqQfJygH+BnwIhAN6pVt32M1jGF701N6QD7abbVpW66z2vjdQFUx4JWw0L","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@auggieteo%2fdsh-mcp-adapter@0.4.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":418603},"main":"src/host/index.js","type":"module","exports":{".":{"default":"./src/host/index.js"},"./client":{"default":"./lib/client.js"},"./package.json":"./package.json"},"gitHead":"37d7e4913e443eeca0abc393d123c1286ee45a5e","scripts":{"dev":"node build.mjs --watch","test":"node --test test/*.test.js","build":"node build.mjs","prepack":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2b4eac83-39d2-4ab6-9ecc-7de3b6c4003a"}},"repository":{"url":"git+https://github.com/auggie246/dsh-mcp-adapter.git","type":"git"},"_npmVersion":"11.19.0","description":"DSH plugin connecting the agent to MCP servers through one mcp proxy tool and a Settings > MCP page.","directories":{},"_nodeVersion":"24.21.0","dependencies":{"yaml":"^2.8.1","@modelcontextprotocol/sdk":"1.30.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.0","@deepseek-ai/cordis":"^4.0.4","@deepseek-ai/schemastery":"^3.18.4","@deepseek-ai/dsh-settings":"0.1.7-rc.2"},"peerDependencies":{"@deepseek-ai/schemastery":"^3.18.4","@deepseek-ai/dsh-settings":"^0.1.7-rc.1"},"_npmOperationalInternal":{"tmp":"tmp/dsh-mcp-adapter_0.4.2_1790587901938_0.6189443635714169","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"_id":"@auggieteo/dsh-mcp-adapter@0.5.0","dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-client-ui-settings"],"platform":"web","immediately":true}},"bugs":{"url":"https://github.com/auggie246/dsh-mcp-adapter/issues"},"dist":{"shasum":"57798123fa85c07e5b22d982ded5ee08668a9878","tarball":"https://registry.npmjs.org/@auggieteo/dsh-mcp-adapter/-/dsh-mcp-adapter-0.5.0.tgz","fileCount":41,"integrity":"sha512-ZIC3un/fthn95/L97Syux56vmAQK7hxDXLBeTxQqKUaVbiHoRqLvUSmNmvhJrAi2cXDeK1rxvZqWdlMdf5arsQ==","signatures":[{"sig":"MEUCIH2MjPDp3JigJfdO/IitRuDb2JGM6Q+Ief/b/RJ0mXl1AiEAxZYKWGjv6a5Uy85PZbdis54FaghvdDcpyAhhMmrNFZw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIHfHLwXhHtuW6HRd9sxK7EYnU9DnpDSiOLBM4lpXTMnrAiAaDHWepgnt4TZgLWO3NHxAN8WTjSe6jGVyqJ4OXXJfcQ=="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@auggieteo%2fdsh-mcp-adapter@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":423150},"main":"src/host/index.js","name":"@auggieteo/dsh-mcp-adapter","type":"module","exports":{".":{"default":"./src/host/index.js"},"./client":{"default":"./lib/client.js"},"./package.json":"./package.json"},"gitHead":"235135a113235eb193cbba750847ea472396b4c5","license":"MIT","scripts":{"dev":"node build.mjs --watch","test":"node --test test/*.test.js","build":"node build.mjs","prepack":"npm run build"},"version":"0.5.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"2b4eac83-39d2-4ab6-9ecc-7de3b6c4003a"}},"homepage":"https://github.com/auggie246/dsh-mcp-adapter#readme","repository":{"url":"git+https://github.com/auggie246/dsh-mcp-adapter.git","type":"git"},"_npmVersion":"11.19.0","description":"DSH plugin connecting the agent to MCP servers through one mcp proxy tool and a Settings > MCP page.","directories":{},"maintainers":[{"name":"auggieteo","email":"auggie.teo@gmail.com"}],"_nodeVersion":"24.21.0","dependencies":{"yaml":"^2.8.1","@modelcontextprotocol/sdk":"1.30.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.0","@deepseek-ai/cordis":"^4.0.4","@deepseek-ai/schemastery":"^3.18.4","@deepseek-ai/dsh-settings":"0.1.7-rc.2"},"peerDependencies":{"@deepseek-ai/schemastery":"^3.18.4","@deepseek-ai/dsh-settings":"^0.1.7-rc.1 || ^0.2.0-rc.1"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/dsh-mcp-adapter_0.5.0_1790728803988_0.20369908881173004"}}},"time":{"created":"2026-08-30T09:56:09.239Z","modified":"2026-09-30T00:40:04.512Z","0.1.0":"2026-08-30T09:56:09.543Z","0.1.1":"2026-08-30T11:25:55.110Z","0.1.2":"2026-08-31T03:12:50.065Z","0.2.0":"2026-09-05T16:09:31.016Z","0.2.1":"2026-09-06T03:10:34.047Z","0.2.2":"2026-09-06T07:23:35.886Z","0.3.0":"2026-09-13T06:16:31.280Z","0.4.0":"2026-09-27T15:53:50.803Z","0.4.1":"2026-09-28T08:20:08.573Z","0.4.2":"2026-09-28T09:31:42.054Z","0.5.0":"2026-09-30T00:40:04.090Z"},"bugs":{"url":"https://github.com/auggie246/dsh-mcp-adapter/issues"},"license":"MIT","homepage":"https://github.com/auggie246/dsh-mcp-adapter#readme","repository":{"url":"git+https://github.com/auggie246/dsh-mcp-adapter.git","type":"git"},"description":"DSH plugin connecting the agent to MCP servers through one mcp proxy tool and a Settings > MCP page.","maintainers":[{"name":"auggieteo","email":"auggie.teo@gmail.com"}],"readme":"# dsh-mcp-adapter\n\n[![npm version](https://img.shields.io/npm/v/@auggieteo/dsh-mcp-adapter)](https://www.npmjs.com/package/@auggieteo/dsh-mcp-adapter)\n[![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](./LICENSE)\n[![standard-readme compliant](https://img.shields.io/badge/readme%20style-standard-brightgreen.svg?style=flat-square)](https://github.com/RichardLitt/standard-readme)\n\nDSH plugin connecting the agent to MCP servers through one mcp proxy tool and a Settings > MCP page.\n\nA [Deepseek Harness](https://github.com/deepseek-ai/deepseek-harness) (DSH) plugin that mirrors the major features of [pi-mcp-adapter](https://github.com/nicobailon/pi-mcp-adapter): one token-efficient `mcp` proxy tool over every configured server, optional per-tool promotion to native DSH tools, and configurable Server lifecycles (`lazy` by default). Servers are added and configured in the DSH web UI under **Settings > MCP**; configuration persists as the Adapter's DSH profile entry config (entry `mcp-adapter`).\n\nVocabulary lives in [CONTEXT.md](./CONTEXT.md). Design decisions live in [docs/adr/](./docs/adr/). Work is tracked as [GitHub issues](https://github.com/auggie246/dsh-mcp-adapter/issues), and released changes are listed in [CHANGELOG.md](./CHANGELOG.md).\n\n## Table of Contents\n\n- [Security](#security)\n- [Background](#background)\n- [Install](#install)\n  - [Compatibility](#compatibility)\n  - [Local development](#local-development)\n  - [Uninstall](#uninstall)\n- [Usage](#usage)\n  - [CLI](#cli)\n  - [Config](#config)\n    - [Workspace Config layer](#workspace-config-layer)\n  - [Settings page](#settings-page)\n  - [Server lifecycle](#server-lifecycle)\n  - [Proxy Tool](#proxy-tool)\n  - [Resources and prompts](#resources-and-prompts)\n  - [Promotion](#promotion)\n  - [OAuth](#oauth)\n  - [Agent skill](#agent-skill)\n- [Architecture](#architecture)\n- [Release](#release)\n- [Layout](#layout)\n- [Maintainers](#maintainers)\n- [Thanks](#thanks)\n- [Contributing](#contributing)\n- [License](#license)\n\n## Security\n\n- Secret values — every `env` and `headers` entry carries the DSH `secret` schema role — are redacted in every wire view: the Settings page and the `/mcp-adapter` RPC channel see keys and `set` state, never values. Existing secret values stay saved when their value inputs are left blank.\n- The `/mcp-adapter` RPC endpoints never expose Config secrets or SDK objects.\n- OAuth tokens live in `${DSH_HOME:-~/.dsh}/mcp-auth/tokens.json` (directory `0700`, file `0600`, atomic writes), one record per Server, bound to the Server URL they were issued for. The callback listener runs on a local loopback address and validates the OAuth `state` parameter; token material never travels through the RPC channel.\n- Proxy tool output is limited to 50 KiB and 2,000 lines; larger text uses `spillStore` for a full-result reference, and raw structured details over 16 KiB become a compact summary with their own spill reference.\n- Binary resource content is never inlined as base64. It is base64-decoded and written to a sanitized `mcp-resource-` path under the system temp folder.\n- Tool calls ask for DSH approval unless the Server sets `autoAllow: true`.\n\n## Background\n\n[pi-mcp-adapter](https://github.com/nicobailon/pi-mcp-adapter) established a workflow for driving many MCP servers from one agent: a single token-efficient proxy tool, lazy connections, and per-tool promotion. This plugin brings that workflow to [Deepseek Harness](https://github.com/deepseek-ai/deepseek-harness) natively.\n\nServer Config is stored as the Adapter's DSH Loader-entry Config (the `Config` schema the host module exports, persisted in the active profile composition, hot-reloaded through volatile updates, revision-fenced) rather than pi-mcp-adapter's layered `.mcp.json` files, while still adopting the standard `mcpServers`-shaped JSON so configs paste over from pi, Claude Desktop, Cursor, or VS Code. See [ADR 0010](./docs/adr/0010-loader-entry-config-model.md) for the reasoning. The v1 end-to-end verification lives in [docs/verification/v1-e2e.md](./docs/verification/v1-e2e.md).\n\n## Install\n\nRequires the `dsh` CLI and a web profile (the browser GUI you run DSH with).\n\n```sh\ndsh plugin --profile web add @auggieteo/dsh-mcp-adapter\n```\n\nThen restart DSH. The Settings panel (`⌘,` / sidebar foot) gains an **MCP** section.\n\n### Compatibility\n\n| DSH release | Support |\n| --- | --- |\n| 0.1.7-rc.1 and newer 0.1.x | Supported. Configuration is the plugin's Loader-entry Config: the Host reads the validated Config cordis passes to `apply` (there is no `ctx.config`) plus its live-committed volatile updates, writes go through the settings service, and the page reads the `configForms` service and writes through the `remote.settings` face mounted by the `@deepseek-ai/dsh-api-remotes` client bundle. |\n| 0.2.0-rc.1 and newer 0.2.x | Supported. Same Loader-entry Config model: every surface the Adapter uses — `configForms`, the `remote.settings` wire face, the `connection.fetch` exact-route seam, `tools`/`commands` registration, the `settings.section` slot, and the `loader/volatile-update` commit path — is unchanged from 0.1.7, so the support is declaration-only (peer `@deepseek-ai/dsh-settings` `^0.1.7-rc.1 \\|\\| ^0.2.0-rc.1`). `test/client-apply.test.js` pins the 0.2.0-rc.2 wire shape by execution. |\n| Older 0.1.x | Unsupported. Those releases require the registered-namespace settings model this plugin used through v0.3.x; upgrade DSH or stay on that release line. |\n\nUpgrading from v0.3.x on DSH 0.1.7: at the first start after the upgrade, the Adapter imports the legacy `mcp:` section of the profile's `settings.yaml` into the `mcp-adapter` entry once. A `mcp-adapter.legacy-imported` marker records the import; anything the import refuses to accept (for example an invalid section) stays in `settings.yaml.imported` and a Host warning names the manual copy path. See [ADR 0010](./docs/adr/0010-loader-entry-config-model.md).\n\n### Local development\n\n```sh\npnpm install\npnpm build          # produces lib/client.js (required before install)\ndsh plugin --profile web add /absolute/path/to/dsh-mcp-adapter\n```\n\nDuring client development, run `pnpm dev` alongside DSH. `dsh-client-hmr` reloads each rebuilt client bundle without a manual refresh.\n\nHost changes need a DSH restart. The web profile disables host HMR for plugin rows.\n\n### Uninstall\n\n```sh\ndsh plugin --profile web remove @auggieteo/dsh-mcp-adapter\n```\n\n## Usage\n\n### CLI\n\nThe Host registers three human commands. A bare `/mcp` or `/mcp status` prints one line per Server: name, live state, cached tool count, and the last message when one is present.\n\n```text\n/mcp                        # status of every Server\n/mcp status filesystem      # status of one Server\n/mcp reconnect filesystem   # close and relist one Server now\n/mcp disable hosted         # keep the Config, stop the Server\n/mcp enable hosted          # restore the lazy lifecycle\n/mcp-auth                   # list every OAuth Server\n/mcp-auth hosted login      # start (or print) one OAuth sign-in flow\n/mcp-prompt docs review {\"path\": \"src/index.js\"}\n```\n\n`/mcp reconnect` mirrors the `/mcp-adapter` RPC endpoint: it closes the Server's current connection and lists tools so it reconnects. `enable` and `disable` write the global Config's `disabled` flag — the same write as **Settings > MCP** — say so in their answer, and leave the Server entry otherwise untouched. A Server defined by the workspace `.dsh/mcp.json` is refused, because the workspace entry would shadow a global write ([ADR 0005](./docs/adr/0005-per-workspace-config.md)). An unknown subcommand or wrong argument count answers with `Usage: /mcp [status|reconnect|enable|disable] [server]`; an unknown Server answers with its unknown-server error.\n\n`/mcp-auth [server] [login|logout|status]` drives the OAuth flow described in [OAuth](#oauth). `/mcp-prompt <server> <prompt> [json-args]` fetches one MCP prompt as described in [Resources and prompts](#resources-and-prompts); empty input, invalid JSON arguments, unknown Servers, and failed fetches answer with error text.\n\n### Config\n\nThe Adapter's global Config is its DSH Loader-entry Config: the `Config` schema the host module exports, persisted in the active profile composition and validated when the entry loads. The Settings > MCP page owns normal edits; for manual edits the entry looks like this in the profile's patch layer:\n\n```yaml\n# cordis.patch.yml — the mcp-adapter entry's config\n- id: mcp-adapter\n  name: \"@auggieteo/dsh-mcp-adapter\"\n  config:\n    mcpServers:\n      filesystem:\n        command: npx\n        args: [-y, \"@modelcontextprotocol/server-filesystem\", /workspace]\n        autoAllow: false\n      hosted:\n        url: https://mcp.example.com/api\n        headers:\n          Authorization: Bearer example-token\n      github:\n        url: https://mcp.example.com/other\n        auth: oauth\n        scopes: [repo, read:org]\n    skillInstall: file\n```\n\nEach Server configures exactly one Transport: `command` for stdio, or `url` for streamable HTTP with SSE fallback. Adapter extension fields are `auth` (`headers` by default, or `oauth` for HTTP Servers), `scopes` (OAuth scopes, requires `auth: oauth`), `disabled`, `autoAllow`, `lifecycle` (`lazy`, `eager`, `keep-alive`, or `lazy-keep-alive`; default `lazy`), `idleTimeoutMinutes` (default `10`), and `promotedTools`.\n\nThe one top-level Adapter field is `skillInstall` (`file` by default, `runtime`, or `off`); see [Agent skill](#agent-skill).\n\nSchemastery validates the shape when the entry loads, and the Adapter enforces the full rule set — unknown fields, transport exclusivity, scope and lifecycle sanity — every time it serves the Config: a section that fails validation serves no Servers with one Host warning, never a partially applied or bricked configuration. Each `env` and `headers` value has the DSH `secret` schema role. Wire views retain each key and redact its value.\n\n#### Workspace Config layer\n\nThe Host also reads `.dsh/mcp.json` under its workspace root and merges it over the global entry Config at resolve time. A workspace Server entry with the same name replaces the global entry wholesale; workspace-only names are added; global-only names pass through. Disable or override a Server from the workspace by defining it there with `disabled: true`.\n\nThe workspace file uses the same `mcpServers` shape and validation as the global Config. Unknown top-level keys (only `mcpServers` is allowed) or an invalid Server entry reject the whole layer, which fails closed to the global-only Config with a Host warning; a missing file is an empty layer. Values are never environment-variable-interpolated. The Adapter never writes the workspace file: page edits, imports, and API writes all stay on the global entry Config, which the workspace file overrides. See [ADR 0005](./docs/adr/0005-per-workspace-config.md).\n\n### Settings page\n\nOpen **Settings > MCP** to add, import, edit, reconnect, disable, or delete a Server. The Server list shows live connection state and cached tool counts. The detail panel manages Transport fields, secret values, Auto-allow, the idle timeout, and Promotions. HTTP Servers pick their HTTP authentication mode (static headers or OAuth 2.0 with PKCE) and, for OAuth, enter the scopes to request.\n\nServers whose Config comes from the workspace `.dsh/mcp.json` show a `workspace` badge in the Server list. Their detail panel explains that the workspace file defines or overrides the Server and disables the save control: edits there write the global layer, which the workspace file overrides. A Server defined only in the workspace file gets a read-only detail panel showing its non-secret Config; for an OAuth Server it offers Sign in / Sign out, because sign-in needs no global Config entry.\n\nJSON import accepts the standard `{ \"mcpServers\": { ... } }` shape. Import replaces matching Server entries and preserves Servers absent from the import.\n\nEvery page write carries the latest entry revision. Field edits use path mutations.\n\nThe status surface talks to the Host through exact Fetch routes on the shared `/api` channel (`POST /api/mcp-adapter/<endpoint>`), authenticated by the platform like every other `/api` request ([ADR 0011](./docs/adr/0011-rpc-on-shared-api-fetch-routes.md)). If the page instead shows `Could not load MCP status: … HTTP 405`, the installed Adapter predates v0.4.2: its dedicated RPC channel cannot mount on DSH 0.1.7. Upgrade and restart DSH.\n\nThe sidebar's MCP row shows a link icon. The icon map lives in the DSH settings shell and the `settings.section` slot carries no icon option, so the Adapter patches one marked branch into the installed shell bundle at every start — after a DSH upgrade the icon returns by itself, and if it does not, restart `dsh web` and refresh the page. `scripts/patch-dsh-settings-nav-icon.mjs` wraps the same patch for manual runs (`--icon <Name>`, `--revert`). See [ADR 0012](./docs/adr/0012-automatic-nav-icon-patch.md).\n\n### Server lifecycle\n\nEach Server's `lifecycle` setting controls when it connects and whether it idles out. `lazy` remains the default.\n\n- `lazy` (default): connects on the first tool-list or tool-call request and disconnects after the idle timeout; the next request reconnects it.\n- `eager`: connects when the Adapter starts, when the Server is added or re-enabled, or when its connection Config changes, and still disconnects after the idle timeout.\n- `keep-alive`: connects like `eager` but never idles out. When the connection closes unexpectedly, it reconnects after 30 seconds and keeps retrying every 30 seconds until it succeeds.\n- `lazy-keep-alive`: connects on first use like `lazy`, but never idles out and auto-reconnects like `keep-alive`.\n\nA `lazy` or `lazy-keep-alive` Server creates no connection at startup. The first tool-list or tool-call request connects the Server and fills an in-memory metadata cache. Promotion discovery is the single documented exception to this startup laziness ([ADR 0003](./docs/adr/0003-promotion-discovery-lazy-exception.md)): when the Adapter starts up or re-enables a Server whose Config lists Promotions, the registry performs exactly one connect to rebuild the native input schema, then the connection follows the normal idle behavior. MCP `tools/list_changed` notifications refresh the cache. The default idle timeout closes the connection after 10 minutes without a request; the next request reconnects it.\n\nChanging, disabling, or removing a Server closes its connection, clears its cache, and cancels any pending keep-alive reconnect; a disabled Server never reconnects. Re-enabling a Server restores the configured lifecycle, so `eager` and `keep-alive` Servers connect again.\n\n### Proxy Tool\n\nThe Host registers one global `mcp` tool with seven actions:\n\n```text\nmcp({ action: \"search\", query: \"screenshot\" })\nmcp({ action: \"describe\", server: \"browser\", tool: \"take_screenshot\" })\nmcp({ action: \"call\", server: \"browser\", tool: \"take_screenshot\", args: {} })\nmcp({ action: \"resources\", server: \"browser\" })\nmcp({ action: \"read\", server: \"browser\", uri: \"file:///docs/readme.md\" })\nmcp({ action: \"prompts\", server: \"browser\" })\nmcp({ action: \"prompt\", server: \"browser\", name: \"review\", args: { path: \"src/index.js\" } })\n```\n\nSearch results use `<server>__<tool>` names to avoid collisions. The first search fills empty metadata caches; later search and describe operations use the cache. Call requests ask for DSH approval unless that Server has `autoAllow: true`.\n\n### Resources and prompts\n\nServers that expose MCP resources and prompts surface through the `mcp` Proxy Tool. There are no per-resource native tools and no browse UI.\n\n`mcp({ action: \"resources\", server: \"docs\" })` lists one Server's resources as `uri`, `name`, `description`, and `mimeType`, plus its resource templates when the Server exposes them. `mcp({ action: \"read\", server: \"docs\", uri: \"...\" })` reads one resource. Text content flows inline through the same output guard as tool calls.\n\nBinary (`blob`) resource content is never inlined as base64; see [Security](#security).\n\n`mcp({ action: \"prompts\", server: \"docs\" })` lists one Server's prompts as `name`, `description`, and `arguments`. `mcp({ action: \"prompt\", server: \"docs\", name: \"review\", args: {} })` fetches one prompt and formats its messages as `role: text` lines. The same prompts surface to humans through `/mcp-prompt`.\n\nResource and prompt metadata is never cached: every action connects lazily and hits the live Server, so results reflect the Server's current state and an offline Server fails with a setup hint.\n\n### Promotion\n\nAdd a raw MCP tool name to a Server's `promotedTools` list to register `<server>__<tool>` as a native DSH tool. The native tool uses the MCP input schema and the same approval, call, and output-guard path as `mcp({ action: \"call\" })`.\n\nPromotion changes apply through `settings/updated`. They do not restart a connected Server. Removing a Promotion unregisters its native tool. Non-promoted tools remain available only through the `mcp` Proxy Tool.\n\nDSH native tool names must match `[A-Za-z0-9_-]` and contain at most 64 characters. The Adapter logs a warning and skips an invalid or colliding Promotion name.\n\n### OAuth\n\nRemote HTTP Servers can authenticate with OAuth 2.0 authorization code flow and PKCE instead of static headers. Set `auth: oauth` on the Server (and optionally `scopes`), then sign in from **Settings > MCP** — the detail panel shows the sign-in state and Sign in / Sign out buttons — or with `/mcp-auth [server] [login|logout|status]`. Selecting `auth: oauth` does not connect by itself: until you sign in, a connect attempt fails fast with a sign-in hint instead of sending an unauthenticated request. Scopes are optional; a provider that defines none accepts an empty list — Context7, for example, serves OAuth at `https://mcp.context7.com/mcp/oauth` and works with no scope requested.\n\nSign in opens the provider's authorization page in your browser through the DSH web session. The Adapter listens on a local loopback callback, validates the state parameter, exchanges the code, and finishes the flow in the background; the Server then reconnects with the fresh tokens. If the browser blocks the pop-up tab, allow pop-ups for the DSH page, or run `/mcp-auth <server> login`, which prints the authorization URL to open by hand.\n\nThe SDK transports refresh expired access tokens through the stored refresh token on the next 401; when no refresh token remains, the Server reports that it needs re-authorization instead of starting a browser flow on its own. Sign out deletes the record and disconnects the Server. Exactly one sign-in flow may run per Server at a time. Token storage and transport details are covered under [Security](#security). See [ADR 0008](./docs/adr/0008-oauth-for-http-servers.md).\n\n### Agent skill\n\nThe package bundles a model-facing skill in `skills/mcp-adapter/SKILL.md`, so agents learn the search → describe → call workflow, how to read failure messages (including the OAuth sign-in hint), and which commands belong to the human. The top-level `skillInstall` Config field controls how the Adapter installs it; the mode is read once at Adapter startup, so a change takes effect on the next DSH restart.\n\n- `file` (default): on startup the Adapter copies the bundled `SKILL.md` verbatim to `$DSH_HOME/skills/mcp-adapter/SKILL.md` (an atomic temp-file-then-rename write, never a symlink). The DSH filesystem skill provider discovers the file, so the skill shows under **Settings > Skills > DSH skills** and joins the session catalog without a restart of an already-running session. When the file install fails, the Adapter falls back to the runtime registration below and logs one warning.\n- `runtime`: the Adapter registers the skill in memory on the DSH `skills` service only. It reaches agents but never appears on the Settings > Skills page.\n- `off`: the Adapter installs no skill.\n\nThe installed file is never overwritten. If `$DSH_HOME/skills/mcp-adapter/SKILL.md` already exists, your edit wins: an identical file is left untouched, and a differing file gets one Host warning naming the installed path and the package version. To refresh the installed copy from the package, delete `$DSH_HOME/skills/mcp-adapter/` and restart DSH. Editing the installed file changes what the session catalog serves; the edit survives plugin restarts.\n\n## Architecture\n\nThe package ships two faces. The host half (`src/host/`) is plain ESM with no build step; it exports the Loader-entry `Config` schema and installs the manager, the proxy tool, promotions, commands, OAuth services, and the bundled skill. The client half (`src/client/`) is JSX bundled by esbuild (`build.mjs`) into `lib/client.js`, a loader-compatible bundle shaped for `window.__ModuleLoader__.load`. The client declares its service dependencies through `package.json`'s `dsh.client.inject`; `cordis.patch.yml` inserts the host composition row on install.\n\nThe host exposes one Connection RPC channel, `/mcp-adapter`, with endpoints `status`, `catalog`, `overview`, `layers`, `reconnect`, `oauth-status`, `oauth-login`, and `oauth-logout`. The Settings page polls `overview` and `layers` for detached snapshots (a `layers` refresh also re-reads the workspace layer); `reconnect` restarts one named Server; the OAuth endpoints drive and report the per-Server sign-in state.\n\n## Release\n\nThe package uses Semantic Versioning. Update `package.json` before each release, and list user-facing changes in [CHANGELOG.md](./CHANGELOG.md).\n\n```sh\npnpm version patch --no-git-tag-version  # or minor, major, or an explicit version\npnpm test\n```\n\nMerge the version change. Then publish a GitHub Release whose tag is exactly `v<package version>`.\n\nThe `Publish to npm` workflow rejects any different tag. It tests and builds the package before publishing with npm provenance.\n\nA prerelease GitHub Release publishes with the npm `next` tag. A regular GitHub Release publishes with the npm `latest` tag.\n\n## Layout\n\n```\ncordis.patch.yml   bundle patch: inserts the host composition row on install\nsrc/host/          host half: plain ESM, no build step\nsrc/client/        client half: JSX, bundled to lib/client.js\nbuild.mjs          esbuild wrapper producing the loader-compatible bundle\nlib/client.js      build artifact (gitignored), required at runtime\nscripts/           CLI over the Settings nav-icon patch core\ndocs/adr/          architecture decisions\ndocs/verification/ end-to-end verification records\nCONTEXT.md         project vocabulary\nCHANGELOG.md       released changes\n```\n\n## Maintainers\n\n[@auggieteo](https://github.com/auggie246).\n\n## Thanks\n\n[pi-mcp-adapter](https://github.com/nicobailon/pi-mcp-adapter) by [@nicobailon](https://github.com/nicobailon) — the workflow this project mirrors. The [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) team for the plugin surface this builds on.\n\n## Contributing\n\nFeel free to dive in! [Open an issue](https://github.com/auggie246/dsh-mcp-adapter/issues/new) or submit PRs; questions go through the issue tracker.\n\n- Run `pnpm test` before submitting. The suite covers the host, the client settings controller, the 0.1.7 entry-config wire (`test/client-apply.test.js`), and the legacy `settings.yaml` import (`test/legacy-import.test.js`).\n- New project vocabulary belongs in [CONTEXT.md](./CONTEXT.md); design decisions get an [ADR](./docs/adr/) before or with the change.\n\n## License\n\n[MIT](./LICENSE) © The dsh-mcp-adapter authors\n","readmeFilename":"README.md"}