Typed interoperability for
AI agent tools
AI capabilities are in the pre-TypeScript era. Effector adds a typed interface layer—tools can be compiled, verified, and composed across runtimes. All in one effector.toml sidecar.
Every AI tool has a type system. It's just invisible.
Your tool takes something, produces something, and needs credentials from the environment. Today these interfaces are implicit. Effector makes them explicit.
One file. Four capabilities.
Drop an effector.toml next to your tool. Your implementation stays untouched — the manifest is pure metadata.
Declare your interface
Pick from 42 standard types to describe what your tool accepts, produces, and requires. Declare permissions explicitly. One file, no code changes.
[effector] name = "code-review" version = "1.0.0" [effector.interface] input = "CodeDiff" output = "ReviewReport" context = ["Repository"] [effector.permissions] network = false filesystem = ["read"]
Validate statically
Catch type errors, missing permissions, and structural issues at build time. The validator checks your manifest against the 42-type catalog and JSON schema.
$ effector check . Manifest ✓ valid Types ✓ CodeDiff → ReviewReport Lint ✓ 0 warnings Audit ✓ Score 5/5 ✓ All checks passed (3.1ms)
Compile to any runtime
One manifest, every target. The compiler reads your effector.toml and emits MCP schemas, OpenAI function definitions, LangChain configs, or JSON IR.
import { compile } from '@effectorhq/core/compile'; // Same manifest, different targets const mcp = compile(def, 'mcp'); const oai = compile(def, 'openai-agents'); const lang = compile(def, 'langchain'); const ir = compile(def, 'json');
Compose with confidence
Chain tools into pipelines with type-level guarantees. The composition checker proves output types match input types — incompatible wiring is caught before any API call.
// Static type checking for tool pipelines git-fetch → CodeSnippet ↓ code-review → ReviewReport ✓ ↓ slack-notify → SlackMessage ✓ // Score: 1.0 — all types compatible
Verified against established benchmarks.
Two-tier evaluation grounded in BFCL, τ-bench, ToolSword, MCPToolBench++, and API-Bank. Not custom metrics — dimensions that published research has shown correlate with tool-use accuracy.
BarCode matches Code* incorrectly
Deterministic · No API keys · Reproducible:
node benchmark.js --verbose
Zero friction. Zero dependencies.
Sidecar manifest
Your tool's implementation stays untouched. effector.toml sits next to your code like .d.ts sits next to .js.
5 minutes to start
npx @effectorhq/cli init scaffolds everything. One command to validate, one to compile. No configuration.
Zero dependencies
The entire toolchain uses only Node.js built-ins. No node_modules tree. Installs in under a second.
Build-time only
No runtime overhead. Effector runs at build and CI time. Zero code in the request path.
One monorepo. One shared kernel.
Every package builds on @effectorhq/core. Every package uses only Node.js built-ins.
@effectorhq/cli
The product — init, check, compile, inspect, serve. One install, one tool.
@effectorhq/core
Embeddable zero-dep kernel — TOML parser, type checker, schema validator, compiler
@effectorhq/serve
Typed MCP server with preflight validation and permission enforcement
effector-types
42-type catalog — fields, aliases, subtypes, frequency scores
@effectorhq/audit
Permission verification & trust tracking
@effectorhq/compose
Static composition & type compatibility
@effectorhq/lint
SKILL.md structure validation (16 rules)
@effectorhq/graph
Interactive D3 visualization
effector-studio
Visual manifest editor with compile preview
Everything runs in the browser.
No sign-up. No download. No setup.
Playground
Validate fast: paste TOML, see errors and compile outputs instantly
Studio
Author visually: form-based editing for production-ready manifest files
Graph Explorer
Analyze registries: inspect relationships, density, and capability drift
Type Catalog
Browse all 42 types with fields, aliases, and subtype relations
Start with one file.
Ship to every runtime.
One command to scaffold. One manifest to declare your interface. One compiler for every target.