Packages
Any API can ship as a Halo tool. These are in the registry at halolang.com/registry:
halo search # list them
halo add stripe # then: tool Pay : Stripe()
halo add world-time --trust # it runs its own code, so it needs --trust
halo tools # every provider you can use, and its methodsgithub-mcp
1.0.0 · GitHubMCP()GitHub through its official MCP server: repositories, issues, pull requests, code search, and more
reads env: GITHUB_PERSONAL_ACCESS_TOKEN
starts: docker run -i --rm -e GITHUB_PERSONAL_ACCESS_TOKEN ghcr.io/github/github-mcp-server
runs its own code: YES (needs --trust)
jira
1.0.0 · Jira()Jira Cloud issues: search with JQL, read, create, comment, and transition
reads env: JIRA_EMAIL, JIRA_API_TOKEN
runs its own code: no
notion
1.0.0 · Notion()Notion pages and databases: search, read, query, create, and append
reads env: NOTION_API_KEY
runs its own code: no
sentry
1.0.0 · Sentry()Sentry error tracking: list, read, and resolve issues
reads env: SENTRY_AUTH_TOKEN
runs its own code: no
stripe
1.0.0 · Stripe()Stripe payments: customers, charges, refunds, and balance
reads env: STRIPE_API_KEY
runs its own code: no
world-time
1.0.0 · WorldTime()Time zones without an API: the time anywhere, and converting a time between zones
reads env: nothing
runs its own code: YES (needs --trust)
cloudflare
1.0.0 · Cloudflare(), CloudflareZone()Cloudflare: Workers, KV, D1, R2, Pages and Queues in an account; DNS records, settings and cache purges in a zone
reads env: CLOUDFLARE_API_TOKEN
runs its own code: no
Method colors are their effects: read write external. Policies and halo plan use them.
How packages work
A package is a halo-tool.json declaring providers of one of three kinds:
| Kind | What runs | Needs --trust |
|---|---|---|
http | Nothing from the package: Halo makes the requests, only under the declared base URL | no |
mcp | An MCP server: a command it starts, or a URL | for a command |
module | The package's TypeScript | yes |
Every package is a single checksummed file. halo add pins its version and SHA-256 in halo.lock, and every load checks the installed files against it. Trust is recorded on your machine (.halo/trust.json, per checksum), never read from the lockfile, so a pull request can't grant it.
Publish your own
halo pack ./my-api # → my-api-1.0.0.halotool
halo publish my-api-1.0.0.halotool --registry ./index.json # add it to a registry indexA registry is a static index.json plus the package files: host it anywhere. Users point at it with --registry, HALO_REGISTRY, or "registry" in halo.json. Writing a package →