This release is a pre-release and may not be stable for production use.
holon
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, TypeScript SDK and Go SDK.
Install
curl -fsSL https://holon-labs.dev/install.sh | sh
Or with Go 1.27+:
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.
{
"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.
holon types check
Or name the servers yourself. Any -s replaces the whole requires list, so server.json is not needed.
holon types check -s https://mcp.context7.com/mcp
Call the server. A wrong tool name or argument is a type error.
Python
from holon.apps import apps
await apps.context7.call_tool("resolve-library-id", libraryName="Next.js", query="app router")
await apps.context7.call_tool("resolve-library-id", libraryName=1, query="app router")
# error: No overload variant of "call_tool" of "Context7App" matches argument types "str", "int", "str" [call-overload]
await apps.context7.call_tool("resolve-library", libraryName="Next.js", query="app router")
# error: No overload variant of "call_tool" of "Context7App" matches argument types "str", "str", "str" [call-overload]
TypeScript
import { apps } from "holon-sh";
const libraries = await apps.context7.tools["resolve-library-id"]({ libraryName: "Next.js", query: "app router" });
libraries.content; // Context7 declares no output schema, so the complete result is returned
await apps.context7.tools["resolve-library-id"]({ libraryName: 1, query: "app router" });
// error TS2322: Type 'number' is not assignable to type 'string'.
await apps.context7.tools["resolve-library-id"]({ libraryName: "Next.js" });
// error TS2741: Property '"query"' is missing in type '{ libraryName: string; }' but required in type '{ libraryName: string; query: string; }'.
await apps.context7.tools["resolve-library"]({ libraryName: "Next.js", query: "app router" });
// error TS2551: Property 'resolve-library' does not exist on type '{ readonly "query-docs": (input: { language?: string | undefined; libraryId: string; query: string; }, options?: CallOptions | undefined) => Promise<CompleteResult<unknown>>; 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.
# 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.
holon types check foo -s bar/server.py
Python
from holon.apps import apps
greeting = await apps.bar.tools.greet(name="world")
greeting["result"]
await apps.bar.tools.greet(name=1)
# error: Argument "name" to "greet" of "BarTools" has incompatible type "int"; expected "str" [arg-type]
await apps.bar.tools.hello(name="world")
# error: "BarTools" has no attribute "hello" [attr-defined]
greeting["text"]
# error: TypedDict "BarGreetOutput" has no key "text" [typeddict-item]
TypeScript
import { apps } from "holon-sh";
const greeting = await apps.bar.tools.greet({ name: "world" });
greeting.result;
await apps.bar.tools.greet({ name: 1 });
// error TS2322: Type 'number' is not assignable to type 'string'.
await apps.bar.tools.hello({ name: "world" });
// error TS2339: Property 'hello' does not exist on type '{ readonly greet: (input: { name: string; }, options?: CallOptions | undefined) => Promise<{ result: string; }>; }'.
greeting.text;
// error TS2339: Property 'text' does not exist on type '{ result: string; }'.
Dependencies
A dependency is an MCP server your project calls. For each one holon obtains a contract—the JSON Schemas of the server's tools and resources—and writes a typed client apps.<alias> into the SDK package your project declares. holon types check then runs the language's type checker over your code against those clients.
A dependency is written in one of three ways.
Source code
An implementation of an MCP server, or its parent directory.
holon types check -s bar/server.py
Registry
A sh.holon.requires entry in server.json, or -s with a registry version URL. The record is fetched for its contract.
holon types check -s https://registry.modelcontextprotocol.io/v0.1/servers/io.github.upstash%2Fcontext7/versions/4.4.4
Server
An endpoint URL. The running server is asked for tools/list and resources/list.
holon types check -s https://mcp.context7.com/mcp
If the server requires a token, name it and set <ALIAS>_MCP_TOKEN. The token is sent only to that URL's origin, as a bearer token, and is not written anywhere.
export DOCS_MCP_TOKEN=...
holon types check -s docs=https://mcp.example.com/mcp
Reference
holon types generate
Generate typed clients for MCP servers.
Leverages sh.holon.requires in the publisher-provided metadata field
(https://modelcontextprotocol.io/registry/faq#can-i-add-custom-metadata-when-publishing) to
resolve dependencies, or the -s list for explicit dependencies.
Usage:
holon types generate [DIR] [flags]
Examples:
# Generate for the current project
holon types generate
# Another project
holon types generate ../checkout
# Name the project's own server to call it from outside the browser too, as apps.orders
holon types generate -s orders=./server
# Explicit dependencies: a server directory, a server entry, an MCP registry server, a remote
# MCP server named docs
holon types generate -s ../orders
holon types generate -s ../orders/server.py
holon types generate -s https://registry.modelcontextprotocol.io/v0.1/servers/io.github.upstash%2Fcontext7/versions/4.4.4
holon types generate -s docs=https://mcp.context7.com/mcp
# A remote MCP server that requires a token: DOCS_MCP_TOKEN is sent to it as a bearer token
DOCS_MCP_TOKEN=... holon types generate -s docs=https://mcp.example.com/mcp
# Print one server's contract, or commit it beside its server.json
holon types generate --contract ../orders
holon types generate --contract ../orders -o ../orders/holon-contract.json
Flags:
--contract string Print one server's MCP contract instead of generating
-h, --help help for generate
-o, --output string Write the --contract document to FILE, such as holon-contract.json
-s, --server stringArray A dependency, [ALIAS=]PATH or URL, paths relative to the working
directory
-v, --verbose Show generation details
holon types check
Generate typed clients for MCP servers, then type-check the project's calls to them.
Leverages sh.holon.requires in the publisher-provided metadata field
(https://modelcontextprotocol.io/registry/faq#can-i-add-custom-metadata-when-publishing) to
resolve dependencies, or the -s list for explicit dependencies.
Usage:
holon types check [DIR] [flags]
Examples:
# Generate, then type-check
holon types check
# Type-check the existing clients only (no network, no writes)
holon types check --no-generate
# Explicit dependencies, as for generate
holon types check -s orders=../orders
Flags:
-h, --help help for check
--no-generate Type-check the existing clients only: no network, no install, no
writes
-s, --server stringArray A dependency, [ALIAS=]PATH or URL, paths relative to the working
directory
Metadata
Release files for holon-types 0.0.1.dev14
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
| File | Actions Reset | |||
|---|---|---|---|---|
| holon_types-0.0.1.dev14-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.musllinux_1_2_x86_64.whl | Python 3 | none | Linux glibc 2.17+ x86-64, Linux musl 1.2+ x86-64 | Details for holon_types-0.0.1.dev14-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.musllinux_1_2_x86_64.whl |
| holon_types-0.0.1.dev14-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_2_aarch64.whl | Python 3 | none | Linux musl 1.2+ ARM64, Linux glibc 2.17+ ARM64 | Details for holon_types-0.0.1.dev14-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_2_aarch64.whl |
| holon_types-0.0.1.dev14-py3-none-macosx_15_0_x86_64.whl | Python 3 | none | macOS 15.0+ x86-64 | Details for holon_types-0.0.1.dev14-py3-none-macosx_15_0_x86_64.whl |
| holon_types-0.0.1.dev14-py3-none-macosx_15_0_arm64.whl | Python 3 | none | macOS 15.0+ ARM64 | Details for holon_types-0.0.1.dev14-py3-none-macosx_15_0_arm64.whl |
Total release size: 86.6 MB
Release files / holon_types-0.0.1.dev14-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.musllinux_1_2_x86_64.whl
| Download URL | holon_types-0.0.1.dev14-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.musllinux_1_2_x86_64.whl |
|---|---|
| Size | 21.9 MB |
| Tags | Linux glibc 2.17+ x86-64 Linux musl 1.2+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
9e25b5d867cdf1c5de3df214a9f54a0e9d7b3c6f60b0be2ba14debc893037967
|
|
BLAKE2b-256 checksum How to use checksums |
9b8155c738e4591ef48815b881f3b710b0fad26cca56e9f8f7c719ae82213844
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 8, 2026.
Transparency logRelease files / holon_types-0.0.1.dev14-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_2_aarch64.whl
| Download URL | holon_types-0.0.1.dev14-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_2_aarch64.whl |
|---|---|
| Size | 20.9 MB |
| Tags | Linux glibc 2.17+ ARM64 Linux musl 1.2+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
1a28efa4cd9b4fab0c03927c0b518c487435ea579f0c9317a8f461dc7a33bd06
|
|
BLAKE2b-256 checksum How to use checksums |
0fb1a4e4702c314bbdb31c3728f9a9edbfccd7c7932d28709944fc374dc01647
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 8, 2026.
Transparency logRelease files / holon_types-0.0.1.dev14-py3-none-macosx_15_0_x86_64.whl
| Download URL | holon_types-0.0.1.dev14-py3-none-macosx_15_0_x86_64.whl |
|---|---|
| Size | 22.1 MB |
| Tags | Python 3 macOS 15.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
880f9da3bb603c4981f218754be93a22b0e01dbb79eaf08d86f0bb0490b25c11
|
|
BLAKE2b-256 checksum How to use checksums |
4a91fbf32e09c763bba2940e3c00d07f9637e7b37913fd310bbfca785b43ca4e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 8, 2026.
Transparency logRelease files / holon_types-0.0.1.dev14-py3-none-macosx_15_0_arm64.whl
| Download URL | holon_types-0.0.1.dev14-py3-none-macosx_15_0_arm64.whl |
|---|---|
| Size | 21.7 MB |
| Tags | Python 3 macOS 15.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
443aedc9389af88d8189ac8687dabf6ac668a69d04da5e2c39e28480ddc12a5a
|
|
BLAKE2b-256 checksum How to use checksums |
739be15a38ed7b3c7b70109e11bc43ddc0a151ff5a33290f86c6238fc0017275
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 8, 2026.
Transparency logSecurity for holon-types 0.0.1.dev14
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 4 files in this release have been uploaded with provenance metadata.
Attestation for holon_types-0.0.1.dev14-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.musllinux_1_2_x86_64.whl
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 8, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.