npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@qian-dsh/dsh-mcp-bridge

v0.1.1

Published

Exposes DSH as an MCP server over Streamable HTTP: streaming thinking/tool/file notifications, shared intent, a floor lock that physically denies DSH writes while held, mid-turn alert injection, and review delegation.

Readme

dsh-mcp-bridge

Exposes DSH as an MCP server, so any MCP client can watch what the agent is doing and steer it mid-flight.

Two agents on one workspace normally means two agents overwriting each other. This bridge gives them a shared protocol instead: what the other side is thinking, what it's touching, who owns the floor, and a way to interrupt.

What the other client gets

| Capability | Mechanism | |---|---| | See the agent think | LLM stream deltas → notifications/dsh/thinking (200 ms throttle) | | See what it touches | tool calls → notifications/dsh/tool; write/edit targets → notifications/dsh/file | | Share intent | dsh_set_intent / dsh_get_intent, auto-injected into DSH's system prompt every turn | | One writer at a time | dsh_lock_acquire / dsh_lock_release floor lock — while held, DSH's write/edit/git are physically denied | | Interrupt the current turn | dsh_inject_alert → injected through agent/pre-step into the running step | | Delegate a review | dsh_review_request → inbox on disk (inbox/<id>.json), result written back to inbox/done/ |

The 8 MCP tools

dsh_get_status · dsh_get_intent · dsh_set_intent · dsh_lock_acquire · dsh_lock_release · dsh_lock_status · dsh_inject_alert · dsh_review_request

Notifications (server → client, SSE)

notifications/dsh/status · thinking · tool · file · intent · lock · alert-queued · review

Install

dsh plugin --profile web add @qian-dsh/dsh-mcp-bridge

Then add the bridge to your MCP client — any client speaking Streamable HTTP works (WorkBuddy, Claude Desktop with an MCP-HTTP adapter, Cursor, Cline, …):

{
  "mcpServers": {
    "dsh-bridge": {
      "type": "streamableHttp",
      "url": "http://127.0.0.1:51630/mcp",
      "timeout": 60000
    }
  }
}

Restart DSH. The log should show [dsh-mcp-bridge] MCP server 就绪: http://127.0.0.1:51630/mcp.

Self-test without installing

# terminal A — start a demo server on 51999
node dsh/mcp.js 51999

# terminal B — handshake, all 8 tools, floor lock, SSE stream
node dsh/mcp-test.js http://127.0.0.1:51999/mcp

Expected: 13 checks pass, ending with 全部通过 ✅.

There is also a unit-level regression suite that runs with no server:

node dsh/bridge-regression.test.mjs   # 13 pass / 0 fail

Configuration

~/.dsh-mcp-bridge/config.json (all optional):

{
  "port": 51630,
  "host": "127.0.0.1",
  "token": "",
  "lockTtlMs": 300000,
  "denyTools": ["write", "edit", "git"],
  "alertInjection": true,
  "inboxRoot": ""
}

inboxRoot defaults to ~/.dsh-mcp-bridge/inbox.

Honest boundaries

  • Loopback only by default. Binds 127.0.0.1; a token is supported but empty by default. Do not expose the port.
  • The lock is enforced on the DSH side only. While held, DSH's write/edit/git are denied at tools/pre-execute. The remote client is trusted to honour the lock by convention — this is a coordination primitive, not a security boundary between mutually hostile parties.
  • Alert injection is best-effort. It goes through agent/pre-step. If the current step cannot be injected, the alert stays queued and lands on the next step.
  • One Server + transport per client. That is an MCP SDK constraint; multiple clients (a recorder and an agent, say) each get their own. A reconnecting client must use a new sessionId.
  • The thinking stream forwards text deltas only, and tool arguments are truncated to their first 120 characters — this is a visibility channel, not a full transcript tap.

License

MIT