H
holon-sh/cli
Type-safe MCP servers
View on GitHub ↗Link checked 2026-11-12 · HTTP 200 · opens the vendor's own site
Install & config
Install command from the repository
go install github.com/holon-sh/cli/cmd/holon@latest
Parsed from the README we fetched on 2026-11-04; we have not executed it.
This is the install method the repository states, not an MCP client config, so no JSON is generated.
Key names differ by client: Clients & CLI
- Star count
- 1 ★ · holon-sh/cli · read from the GitHub search API · (checked 2026-11-13 20:00:50)
- Source
- read directly from its GitHub page · type: open-source project
- Harvest history
- first seen 2026-11-05 · last seen 2026-11-14 · seen 10× · listed by 3 sources
- Score
- score 303 · 1 ★ · 3 sources · repo
- Install
go install github.com/holon-sh/cli/cmd/holon@latest
FAQ (answers come from our records)
How do I install it?
The repository provides this install command:
go install github.com/holon-sh/cli/cmd/holon@latest. It comes from the repository itself; we cannot guarantee it runs as-is in your client.Who is it for?
We filed it under these tags: MCP 服务. The tags come from the entry itself, not a taxonomy we imposed.
Who maintains it?
repository
holon-sh/cli;first catalogued 2026-11-05;last seen 2026-11-14。There is no official certification or quality rating here — we record sources and dates only.# holon
以下摘录自该仓库的 README(片段) · 在 GitHub 读完整 README →
holon provides type-safety for MCP servers, e.g. invoking an MCP server as a function call your type checker understands.
This is currently supported via the Python SDK and TypeScript SDK.
## Install
sh
curl -fsSL https://holon-labs.dev/install.sh | sh
Or with Go 1.27+:
sh
go install github.com/holon-sh/cli/cmd/holon@latest
## Example
Declare dependencies under sh.holon.requires in your project's server.json (publisher-provided metadata). This example uses the public Context7 server.
json
"name": "com.example/foo",
"version": "0.1.0",
"description": "Example Foo",
"meta": {
"io.modelcontextprotocol.registry/publisher-provided": {
"sh.holon": {
"requires": {
"context7": { "name": "io.github.upstash/context7", "version": "4.4.4" }
Generate the typed clients and type-check the calls to them.
sh
holon types check
Or name the servers yourself. Any -s replaces the whole requires list, so server.json is not needed.
sh
holon types check -s https://mcp.context7.com/mcp
Call the server. A wrong tool name or argument is a type error.
Python
python
from holon.apps import apps
await apps.context7.calltool("resolve-library-id", libraryName="Next.js", query="app router")
await apps.context7.calltool("resolve-library-id", libraryName=1, query="app router")
# error: No overload variant of "calltool" of "Context7App" matches argument types "str", "int", "str" [call-overload]
await apps.context7.calltool("resolve-library", libraryName="Next.js", query="app router")
# error: No overload variant of "calltool" of "Context7App" matches argument types "str", "str", "str" [call-overload]
TypeScript
ts
import { apps } from "holon-sh";
const libraries = await apps.context7.tools"resolve-library-id";
libraries.content; // Context7 declares no output schema, so the complete result is returned
await apps.context7.tools"resolve-library-id";
// error TS2322: Type 'number' is not assignable to type 'string'.
await apps.context7.tools"resolve-library-id";
// error TS2345: Argument of type '{ libraryName: string; }' is not assignable to parameter of type '{ [key: string]: unknown; libraryName: string; query: string; }'.
// Property '"query"' is missing in type '{ libraryName: string; }' but required in type '{ [key: string]: unknown; libraryName: string; query: string; }'.
await apps.context7.tools"resolve-library";
// error TS2551: Property 'resolve-library' does not exist on type '{ readonly "query-docs": (input: { [key: string]: unknown; language?: string | undefined; libraryId: string; query: string; }, options?: CallOptions | undefined) => Promise >; readonly "resolve-library-id": (input: { ...; }, options?: CallOptions | undefined) => Promise ; }'. Did you mean 'resolve-library-id'?
### Development Servers
Let's say you have a server that you're still developing, and it's not in any MCP Registry yet.
python
# bar/server.py
from mcp.server import MCPServer
server = MCPServer("com.example/bar", version="0.1.0", description="Example Bar")
@server.tool()
def greet(name: str) -> str:
return f"hello {name}"
Pass its entry file with -s.
sh
holon types check foo -s bar/server.py
Python
python
from holon.apps import apps
greeting = await apps.bar.tools.greet(name="world")
This is currently supported via the Python SDK and TypeScript SDK.
## Install
sh
curl -fsSL https://holon-labs.dev/install.sh | sh
Or with Go 1.27+:
sh
go install github.com/holon-sh/cli/cmd/holon@latest
## Example
Declare dependencies under sh.holon.requires in your project's server.json (publisher-provided metadata). This example uses the public Context7 server.
json
"name": "com.example/foo",
"version": "0.1.0",
"description": "Example Foo",
"meta": {
"io.modelcontextprotocol.registry/publisher-provided": {
"sh.holon": {
"requires": {
"context7": { "name": "io.github.upstash/context7", "version": "4.4.4" }
Generate the typed clients and type-check the calls to them.
sh
holon types check
Or name the servers yourself. Any -s replaces the whole requires list, so server.json is not needed.
sh
holon types check -s https://mcp.context7.com/mcp
Call the server. A wrong tool name or argument is a type error.
Python
python
from holon.apps import apps
await apps.context7.calltool("resolve-library-id", libraryName="Next.js", query="app router")
await apps.context7.calltool("resolve-library-id", libraryName=1, query="app router")
# error: No overload variant of "calltool" of "Context7App" matches argument types "str", "int", "str" [call-overload]
await apps.context7.calltool("resolve-library", libraryName="Next.js", query="app router")
# error: No overload variant of "calltool" of "Context7App" matches argument types "str", "str", "str" [call-overload]
TypeScript
ts
import { apps } from "holon-sh";
const libraries = await apps.context7.tools"resolve-library-id";
libraries.content; // Context7 declares no output schema, so the complete result is returned
await apps.context7.tools"resolve-library-id";
// error TS2322: Type 'number' is not assignable to type 'string'.
await apps.context7.tools"resolve-library-id";
// error TS2345: Argument of type '{ libraryName: string; }' is not assignable to parameter of type '{ [key: string]: unknown; libraryName: string; query: string; }'.
// Property '"query"' is missing in type '{ libraryName: string; }' but required in type '{ [key: string]: unknown; libraryName: string; query: string; }'.
await apps.context7.tools"resolve-library";
// error TS2551: Property 'resolve-library' does not exist on type '{ readonly "query-docs": (input: { [key: string]: unknown; language?: string | undefined; libraryId: string; query: string; }, options?: CallOptions | undefined) => Promise >; readonly "resolve-library-id": (input: { ...; }, options?: CallOptions | undefined) => Promise ; }'. Did you mean 'resolve-library-id'?
### Development Servers
Let's say you have a server that you're still developing, and it's not in any MCP Registry yet.
python
# bar/server.py
from mcp.server import MCPServer
server = MCPServer("com.example/bar", version="0.1.0", description="Example Bar")
@server.tool()
def greet(name: str) -> str:
return f"hello {name}"
Pass its entry file with -s.
sh
holon types check foo -s bar/server.py
Python
python
from holon.apps import apps
greeting = await apps.bar.tools.greet(name="world")
Listed badge (optional)
Copy this line into the README if you want the listing mark. Optional, and it does not affect being listed.
[](https://anclum.com/en/s/holon-sh-cli/)
- Source
- github · https://github.com/holon-sh/cli
- Browse by field
- MCP servers
- Traction
- 1 ★
- Listed by
- 3 independent sources
- added
- today
More like this
Filed under
Every tag opens the full list for that filter. Counts are the live catalogue figures.