PoC alpha server - base install, subcommand selection from a shared PyPI package.
Runs on your machine from its package; the steps are below.
At most: only reads or looks up information.
Odel charges nothing per call. The publisher may charge for its own service.
Runs locally over stdio
This server isn't hosted — your MCP client launches it from a package registry. Use one of the commands below, or drop the config into your client (e.g. Claude Desktop).
Run
uvx mcp-multi-poc
MCP client config
{
"mcpServers": {
"multi-poc-alpha": {
"command": "uvx",
"args": [
"mcp-multi-poc"
]
}
}
}PoC for serving multiple MCP servers from a single PyPI package, using subcommands for server selection and optional extras for on-demand dependencies. Stands in for the Couchbase MCP monorepo question (alpha = operational, beta = analytics, tabulate = the analytics SDK — chosen because it is outside fastmcp's transitive dependency tree; httpx and pyyaml are not, and silently defeat the extras guard).
| # | Question | Where it's tested |
|---|---|---|
| 1 | Can two MCP registry entries point at the same PyPI package? | Publish both server.alpha.json and server.beta.json |
| 2 | Does registry ownership validation accept multiple mcp-name comments in one package README? | The two HTML comments above |
| 3 | Does the registry schema/validator accept extras syntax in identifier (mcp-multi-poc[beta])? | server.beta.json — if rejected, fall back to plain identifier and record that extras can't be expressed |
| 4 | Do clients run the subcommand form correctly from registry metadata (uvx mcp-multi-poc alpha)? | Install both servers from a client (Claude Desktop / MCP Inspector) |
| 5 | Is there any schema-legal way to run a console script named differently than the package (mcp-multi-poc-beta)? | server.beta-script.json. 5a (failed): identifier = script name → 404, identifier must be a real PyPI package. 5b (current file): identifier = real package, script name smuggled as a positional runtimeArgument → uvx --from 'mcp-multi-poc[beta]' mcp-multi-poc-beta mcp-multi-poc; the appended identifier becomes a stray arg the server must ignore. If 5b also fails, fallback is a shim package per script |
mcp-multi-poc-alpha published
against the shared package.mcp-name comments in one README: YES (alpha validated with
three comments present).identifier: NO, but expressible via runtimeArguments.
Extras in the identifier fail the literal PyPI lookup —
PyPI package 'mcp-multi-poc[beta]' not found (status: 404). Fallback
works: mcp-multi-poc-beta published successfully with plain
identifier: mcp-multi-poc + runtimeArguments: --from "mcp-multi-poc[beta]"
(live in the registry, verified via the /v0/servers API).'mcp-multi-poc-beta' not found) — the
registry validates the identifier as a real PyPI package before anything else.runtimeArgument: YES, published.
io.github.nithishr/mcp-multi-poc-beta-script is live (published
2026-07-31, after trimming description to the 100-char limit — the only
validation hiccup). Locally, uvx --from 'mcp-multi-poc[beta]' mcp-multi-poc-beta mcp-multi-poc completes the MCP initialize handshake —
the trailing identifier is silently ignored because main() never parses
argv. Caveats: only safe when the entrypoint tolerates stray argv (click
needs ignore_unknown_options + allow_extra_args or a dummy optional
argument); depends on clients preserving runtimeArguments order — the
least-exercised metadata path; registry UIs show the identifier as the
runnable. For production script-per-server, prefer a shim package per
script (identifier == script name, no runtimeArguments at all).description ≤ 100 chars;
identifier must be a literal, existing PyPI package (extras rejected);
runtimeArguments/packageArguments contents are NOT validated.cd mcp-registry-poc
uv venv && uv pip install -e .
mcp-multi-poc alpha # starts alpha on stdio (Ctrl+C to exit)
mcp-multi-poc beta # must FAIL with the friendly extras message
uv pip install -e ".[beta]"
mcp-multi-poc beta # now starts
mcp-multi-poc # bare command runs alpha (backward-compat check)
mcp-multi-poc-beta # Option 1 script works locally once extra installed
uvx behavior (after publishing to PyPI):
uvx mcp-multi-poc alpha # base only
uvx "mcp-multi-poc[beta]" beta # extras via uvx — key UX under test
uvx --from "mcp-multi-poc[beta]" mcp-multi-poc-beta # Option 1 fallback form
mcp-multi-poc is taken on PyPI, pick another name and rename consistently
(pyproject name, [project.scripts], both server.json identifiers).uv build && uv publish.mcp-publisher login github (interactive) — must match the io.github.<username> namespace.mcp-publisher publish server.alpha.json, ... server.beta.json, and
... server.beta-script.json — the last one is expected to fail validation;
record the exact error (if the CLI expects the file at ./server.json, copy
each into place first).curl "https://registry.modelcontextprotocol.io/v0/servers?search=mcp-multi-poc"echo (alpha) and make_table (beta).Most clients don't install directly from the official registry yet, so Q4
splits in two: (a) does the spec-mandated command construction
(uvx <runtimeArguments> <identifier> <packageArguments>) produce a working
server, and (b) does a registry-consuming client reproduce that construction.
packages block:
curl "https://registry.modelcontextprotocol.io/v0/servers?search=mcp-multi-poc"npx @modelcontextprotocol/inspector uvx mcp-multi-poc alpha
npx @modelcontextprotocol/inspector uvx --from "mcp-multi-poc[beta]" mcp-multi-poc beta
echo / make_table:
claude mcp add poc-alpha -- uvx mcp-multi-poc alpha
claude mcp add poc-beta -- uvx --from "mcp-multi-poc[beta]" mcp-multi-poc beta
claude_desktop_config.json entries:)
{
"mcpServers": {
"poc-alpha": { "command": "uvx", "args": ["mcp-multi-poc", "alpha"] },
"poc-beta": { "command": "uvx", "args": ["--from", "mcp-multi-poc[beta]", "mcp-multi-poc", "beta"] }
}
}
mcp-multi-poc
there and install; this exercises whether a client assembles
runtimeArguments + identifier + packageArguments on its own. Entries may
lag or be curated before appearing.Steps 2–3 only prove (a); only step 4 (or another registry-consuming client) proves (b), which is what the beta/beta-script entries actually depend on.