Repository navigation
Releases: NeoXider/neoxider-mcp-hub
Release list
v0.10.3
Fixed
- A hub call written as text now runs in DeepSeek Harness. A local server such as
Strata or llama-server turns<tool_call>text into a tool call only when the name
matches a declared tool, and a model that had seen the hub as
mcp__capability_hub__capability_hubkept writing variants of it
(mcp__capability_hub,mcp__capability-hub__…) after the native tool became
capability_hub. Each such call came back as message text and the turn ended. The
Harness plugin now watches the model stream (llm/stream) of every request that
offers the hub. When a reply has no structured tool call and its text ends in written
calls to the hub, under any of those spellings, they become realcapability_hub
calls, and the text keeps only what came before them. Qwen's XML format and the JSON
form are read, with values typed by the tool schema. Text that only quotes a call (in
a code fence, or followed by more prose), a call cut off mid-way, a truncated reply,
and calls to other tools are left as they are. No alias tool is registered, so the
prompt does not grow.
v0.10.2
Fixed
- The tool schema uses only keywords every client accepts. It advertised
maxLengthon five strings, andpropertyNameswith an empty-schema
additionalPropertiesonarguments. DeepSeek Harness checks tool schemas against
a smaller subset, so itsrun_codesignatures typed the whole hub input as
unknown; strict validators and constrained decoders trip on the same keywords.
The limits are now checked on input instead of advertised,argumentsis a bare
object withadditionalProperties: true, and the schema is 27 tokens shorter. An
e2e test holds the advertised schema to that subset. - The Harness plugin loads from a checkout. It imported
@deepseek-ai/dsh-tools
and@deepseek-ai/schemasteryat runtime, and from a linked or path-loaded checkout
those resolve against the repository's ownnode_modules, not the Harness, so the
plugin ran against whatever old dsh-tools was installed there. It now registers a
raw tool definition, the form the in-box MCP client registers, and its Config is a
zod schema, which cordis validates through Standard Schema. Both Harness packages are
gone from the peer dependencies. - The native tool's parameters are the stdio server's. The plugin had its own
hand-written copy of the schema; it now projectshubInputShapethe way the MCP SDK
does, so the two routes put the same tool in the prompt, and a test holds them equal. - Bad arguments to the native tool get a readable error. Nothing checked them, so
an unknown action reached the hub and failed with a TypeError. They are now
validated as on the stdio route, and the error lists what was expected.
Added
toolCallTimeoutMsConfig for the native tool, defaulting to the previous
300,000 ms, so a setup that raised the MCP client's timeout keeps it after switching.
Documentation
- README: loading a built checkout by path, and why a local model is better off with
the nativecapability_hubthan withmcp__capability_hub__capability_hub. - README: every client example names the server
capability_hub. The Claude Code and
mcpServersexamples saidcapability-hub, so the same tool appeared under two
spellings across clients.
v0.10.1
Added
- The package is on npm as
@neoxider/mcp-hub.npx -y @neoxider/mcp-hub --catalog … --state …starts the server with nothing to clone or build. The package has four
executables, sonpxcould not tell which to run;mcp-hub(the package's own name)
now points at the server.
Changed
- The Harness peer dependencies are optional.
@deepseek-ai/dsh-toolsand
@deepseek-ai/schemasteryare needed only by the Harness plugin entry, which Harness
itself supplies; npm 7+ installs peers by default, so everyone running the plain
server was pulling them in. publishConfig.accessispublic, which a scoped package needs.
Documentation
- README: client setup uses
npx, with the persistent-catalog advice that goes with it
(undernpxthe package's owndata/is in a clearable cache), and approval through
npx -p @neoxider/mcp-hub capability-hub-admin.
v0.10.0
Fixed
- Skills and long results reached OpenCode as a stub. OpenCode renders a tool
result'sstructuredContentand ignores its text, while DeepSeek Harness does the
opposite.skill.loadreturned the body only as text, so OpenCode showed
{"name":…,"source":…}and nothing else; a pagedcallresult and everypage
showed only{"paged":true,"cursor":…}. The body now travels in both fields:
instructionsforskill.load,textfor page 1 and forpage. Harness reads the
text and is unchanged. disableno longer fails when the child dies while closing. The capability was
already off the live map, so the error told the model to retry something that had
worked.- A failed
tools/list_changedrefresh no longer escapes. The previous tool list is
kept and the failure is logged to stderr. - Pages and truncated results no longer cut an emoji in half. A cut between the two
halves of a surrogate pair left a replacement character on each side. - The client's own quick-start command failed in Windows PowerShell 5.1. It strips
the double quotes from--json '{"action":"search"}', so node received
{action:search}. The client now takes--action,--query,--kind,--name,
--tooland--cursoras plain flags, and a request that is not valid JSON says to
use--input request.jsonor those flags instead of printing a stack trace. capability-hub-admin approvedefaulted to the working directory. Run from any
other folder it looked fordata/there, not where the server reads, so an approval
could not land in the server's state. Its defaults are now the server's: the package's
data/catalog.jsonanddata/state.- A flag followed by another flag took it as its value.
--catalog --state dirread
--stateas a catalog path. - A bad
--page-charsorCAPABILITY_HUB_PAGE_CHARSsays what is wrong. It used to
exit with a stack trace from the constructor. An empty value is ignored instead of
silently turning paging off.
Security
zod4.1.12 -> 4.6.7 (memory exhaustion on oversized constrained collections, fixed
in 4.6.6) and the transitivebody-parser2.3.0 -> 2.4.0 (denial of service through
trailing bytes after a compressed request body, fixed in 2.4.0; it comes with the MCP
SDK's HTTP server, which this hub does not run).pnpm audit --prodhad started to
fail CI again; it is clean.
Changed
toolswith aquerymatches words, not the whole phrase."browser click"now
findsbrowser_click. Every word must appear; when no tool holds them all, the tools
that hold some come back best first with a note saying so, instead of an empty list.
searchover the catalog already worked this way.
Documentation
- README rewritten around what the project is for: a cover and four illustrations,
setup for OpenCode, Claude Code, Claude Desktop and Cursor besides DeepSeek Harness,
how to share one catalog between clients, troubleshooting, and a comparison with the
neighbouring projects built from their own READMEs. The measurements are unchanged. - The tool-selection accuracy table rendered broken: its header had seven columns and
its separator six. - The model-in-the-loop smoke documentation moved to
docs/harness-smoke.md. - The product is called NeoXider MCP Hub; the tool stays
capability_hub.
Repository
- Pushing a
v*tag now runs the tests, builds the Harness bundle and attaches it to a
GitHub release. Releases 0.8.0 to 0.9.1 had no bundle attached. - Two committed build artifacts (
*.tgz) were removed and*.tgzis ignored.
0.8.0
Structured call arguments: action call now accepts the child tool arguments as a structured object under arguments, alongside payloadJson. Declaring the field makes it survive MCP SDK input validation on both stdio and native paths; passing both is an error, and arguments with any other action is an error. New wire unit tests plus an end-to-end leg.
v0.7.0
Native DeepSeek Harness bundle: the hub registers as one native model-facing
tool (capability_hub) with no child process and no absolute paths.
Install:
dsh plugin --profile web add https://github.com/NeoXider/neoxider-mcp-hub/releases/download/v0.7.0/neoxider-mcp-hub-0.7.0.tgz
NeoXider MCP Hub v0.3.1
Full Changelog: v0.3.0...v0.3.1
DeepSeek Capability Hub v0.3.0
Full Changelog: v0.2.4...v0.3.0
DeepSeek Capability Hub v0.2.4
Verified lazy MCP and skill routing through one universal Harness tool. Includes compact context-economy evidence, package allowlist hardening, and an optional strict end-to-end DeepSeek Harness smoke in which LM Studio Qwen 3.5 2B discovers, inspects, enables, calls, and disables the pinned @playwright/mcp@0.0.79 with zero tool errors. CI passes on Windows and Ubuntu.
DeepSeek Capability Hub v0.2.1
Verified strict Harness smoke
- Uses exactly one outer MCP tool.
- Proves search, inspect, tools, call, skill loading, status, and disable in one live DeepSeek Harness session.
- Auto-selects the smallest installed LM Studio tool-use model without downloading anything.
- Unloads only a model loaded by the smoke.
- Verifies approved Web Search Neo and Unity CLI catalog metadata.
- CI passes on Windows and Ubuntu.
Security boundary: third-party MCP entries still require separate human approval before they can execute.