Robot & MCPFirst-class automation and agentic control baked into the framework itself — not bolted on after. One introspection registry drives E2E test harnesses, IDE tooling, and an MCP server an LLM can use as a tool surface.
The introspection registryEvery mounted primitive registers itself with a shared registry. Each entry carries a stable handle, a `test_id`, a label, and a primitive kind. The registry is platform-agnostic — the same shape is populated on web, iOS, Android, and any backend you add.Three consumers read from the same registry. They don't know about each other, but they read identical data.
E2E test harnessesQuery by `test_id`, click buttons, type into inputs, read signals, snapshot the tree. The same `Robot` API drives web, iOS, and Android — no separate platform runner per target, no Detox-on-iOS-and-Espresso-on-Android split.// Robot.rs — cross-platform E2E test harness.
let robot = Robot::connect("localhost:9000")?;
robot.tap_by_test_id("submit-button")?;
robot.type_text_into("name-field", "Alice")?;
let count = robot.signal_value::<i32>("counter")?;
assert_eq!(count, 1); `methods! { ... }`Inside a `#[component]` body, a `methods! { ... }` block exposes named methods that the registry registers as JSON-callable. External automation can invoke them by name without per-app glue.#[component]
pub fn Cart(props: &CartProps) -> Element {
let items = signal!(Vec::<Item>::new());
methods! {
fn add(item: Item) {
items.update(|v| v.push(item));
}
fn clear() {
items.set(Vec::new());
}
fn total() -> f64 {
items.get().iter().map(|i| i.price).sum()
}
}
// ...the rest of the component
} The component's `cart.add(...)`, `cart.clear()`, and `cart.total()` are now callable from a Robot test, an IDE inspector, or an LLM tool call — same surface, three consumers. MCP server`idealyst-mcp` is a stdio MCP server that turns each registry capability into an MCP tool. Drop it into a Claude Desktop config and an LLM can drive a running iOS / Android / web app directly: fill out forms, navigate, assert state, call exposed component methods.// claude_desktop_config.json
{
"mcpServers": {
"idealyst": {
"command": "idealyst-mcp",
"args": ["--from-bin", "./target/debug/my-app"]
}
}
} The framework's component catalog (every primitive, every props struct, every theme token) ships alongside the live registry, so the LLM also has rich type information for the code it's manipulating. Gated on a Cargo featureThe Robot bridge + registry compile in only when the `robot` feature is on. Production release builds leave it off; there's no runtime overhead and no exposed surface in shipped binaries. Dev builds auto-enable it via the `runtime-core/dev` feature.