

toolsmelt --help: the command list.

toolsmelt app-js reading an Electron app's own code.

toolsmelt setup --dry-run prints what it would change and writes nothing.
_DB_PASSWORD` (or `toolsmelt secret set` in the hub). Install the driver for your database next to `toolsmelt[sql]` (for example `psycopg`).
### Tool-choice evals
`toolsmelt eval --write --provider anthropic` writes `evals.yaml` (one or two user questions per tool, plus a few that no tool should answer). Review the file and commit it. `toolsmelt eval --provider anthropic` then asks the model which tool and arguments answer each question, and reports tool and argument accuracy and which tools get confused. `--json` and `--min 0.9` make it a CI gate. The tool list is the cached prompt prefix, so repeat runs are cheap.
### Drift check
`toolsmelt check _PROXY` takes one URL or a comma list (pool). ` _BASE_URL` overrides the base URL. System proxy env vars are ignored on purpose.
- Chrome TLS fingerprint for sites that block plain clients: `pip install "toolsmelt[stealth]"` and `impersonate: true` in the plan. Without the extra it falls back to plain httpx with one warning.
- Compact output: `shape()` keeps only the planned fields, caps lists (reports the total count), clips long strings, drops nulls.
- Actionable errors: a 403 suggests setting ` _PROXY`, a 401 names the auth env var, 404/429/5xx say what to do next.
- Auth: bearer, header, query, cookie or basic, read from an env var.
## Comparison
Most generators mirror every endpoint as a tool and hand the model raw JSON. toolsmelt designs a few workflow-level tools with plain argument names, descriptions that say when to call what next, and compact output.
| | Input | Output | Tool design | Response shaping | Drift check | Open source |
|---|---|---|---|---|---|---|
| toolsmelt | OpenAPI, HAR, app code | live hub tools or Python MCP project | LLM-designed plan | per-tool root/fields/max_items | `toolsmelt check` | yes |
| FastMCP `from_openapi` | OpenAPI | runtime proxy | one tool per endpoint; manual route maps / transforms | raw JSON | no | yes |
| openapi-mcp-generator | OpenAPI | TypeScript server | one tool per endpoint; `x-mcp` to pick | raw JSON | no | yes |
| Speakeasy / Gram | OpenAPI | TypeScript or hosted | manual toolsets | experimental | no | yes (AGPL, since Sep 2026) |
| Cloudflare Forge / Code Mode | OpenAPI | SDK, CLI, MCP server | code mode (search + execute) | n/a | no | yes |
| AnythingMCP | OpenAPI, Postman, SOAP, GraphQL, SQL, HAR | self-hosted gateway | one tool per operation, visual editor | manual | no | yes (AGPL) |
| mitmproxy2swagger, har-to-openapi | HAR / traffic | OpenAPI spec | none | none | no | yes |
| Integuru, reverse-api-engineer | HAR / browsing | API client code, not MCP | none | none | no | yes |
| Supergood, Wire | site walkthrough | hosted API / MCP | managed | managed | vendor claims | no |
Compiled from each project's public docs in October 2026; check them before relying on a cell. Stainless, which generated MCP servers in code mode, joined Anthropic in May 2026 and closed new signups. FastMCP's own docs say curated servers clearly beat auto-converted ones.
## Extending
Add an input format, a value transform or a sign-in provider as your own installed package, without forking: toolsmelt finds them through the entry-point groups `toolsmelt.importers`, `toolsmelt.transforms` and `toolsmelt.signin`. Plugin importers use `toolsmelt.scrub`, the same privacy rules as the built-ins. See [docs/extending.md](docs/extending.md).
## Limitations
- No browser per call: JS challenges and captchas are out of scope. Sites that need them will fail at `check`.
- A tool is one request, a paginated request (`paginate`) or a chain of requests (`steps`, with `for_each` fan-out). Logic beyond that (branching, computed values) needs hand edits to the generated `server.py`, and regenerating overwrites them.
- The generated project is Python only. Servers speak stdio, or Streamable HTTP with `--transport http`; HTTP auth is a shared bearer token (`MCP_AUTH_TOKEN`) or OAuth tokens from your own identity provider (`MCP_OAUTH_ISSUER`); toolsmelt is not an authorization server.
- A HAR only contains what you did while recording; unrecorded features are not in the plan.
- Endpoints read from app code are unverified until `probe`; a method that cannot be read stays empty.
- Request bodies are JSON, form (`application/x-www-form-urlencoded`) or multipart text fields (`body_encoding` on a tool); file uploads are not supported.
- The plan is trusted input: its text ends up in server instructions and the skill, and `toolsmelt check` runs the generated code. Review a plan written by an LLM from third-party content before you generate and publish it.
- Alpha.
## Develop
```bash
uv sync
uv run pytest -q
uv run ruff check .
```
See [CONTRIBUTING.md](CONTRIBUTING.md) and [docs/design.md](docs/design.md).
## License
MIT