Typed interoperability for
AI agent tools
AI capabilities are in the pre-TypeScript era. Effector adds a typed interface layer — 40 standard capability types, static composition checking, and cross-runtime compilation from a single sidecar manifest.
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 40 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 40-type catalog and JSON schema.
$ npx @effectorhq/core validate . ✓ effector.toml parsed ✓ Schema valid ✓ Types: CodeDiff → ReviewReport $ npx @effectorhq/audit check . ✓ Permissions match source ✓ No undeclared access
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 create-effector 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.
9 focused packages. One shared kernel.
Every package builds on @effectorhq/core. Every package uses only Node.js built-ins.
@effectorhq/core
Shared kernel — TOML parser, type checker, schema validator, compiler, CLI
effector-types
40-type catalog — fields, aliases, subtypes, frequency scores
create-effector
Interactive project scaffolder with manifest, SKILL.md, and test setup
@effectorhq/skill-lint
SKILL.md structure validation
@effectorhq/audit
Permission verification & trust tracking
@effectorhq/compose
Static composition & type compatibility
@effectorhq/skill-eval
Quality scoring — 10 metrics
@effectorhq/graph
Interactive D3 visualization
openclaw-mcp
MCP server for the full toolchain
Everything runs in the browser.
No sign-up. No download. No setup.
Playground
Paste a manifest, get instant validation and type checking
Studio
Visual editor — pick types, toggle permissions, preview compile output
Graph Explorer
Interactive D3 force graph of type relationships and subtypes
Type Catalog
Browse all 40 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.