Fable-mode
Fable Mode server provides a stateful session/evidence/review control plane for AI coding agents plus a stealth browser automation toolkit.
Fable sessions: create sessions, set timers, advance phases, checkpoint/restore, list sessions, get status/telemetry/lineage.
Write gating: unlock_execution only after timer/rationale gates pass; track file changes; inspect plans.
Evidence & proof: log epistemic items, record invariants, log refinement cycles, verify proofs, adjudicate evidence, record visual mockups, validate event history, track breakage reports and remediations.
Rubrics & pipelines: set/evaluate/get goal rubrics; register automation pipelines; infer design briefs; generate design tokens and Awwwards scaffolds; validate preflight design; list design archetypes.
Red-team & audit: red_team_code_review of target source in an isolated sandbox; audit_anti_slop for code quality checks.
System 3 experimental ops: dialectical synthesis, causal simulation, paradigm evolution, axiom induction, meta-reflection, tri-level orchestration, hyperbolic embedding, Kripke verification, active inference, proof oracle, cortical lobe management, compression/CAS operations.
Research scraping: scrape web, YouTube, Reddit, X, GitHub, and arXiv using target queries.
Browser automation: open, navigate, click, type, scroll, screenshot, snapshot layers, back/forward, reload, wait, press, and close browser sessions.
Allows scraping GitHub repositories, issues, and other public data via the scrape_github action in the fable_session tool.
Fable Mode
Agents that think before they write.
Fable Mode is an open-source control plane for AI coding agents.
It makes an agent deliberate, produce evidence, and survive adversarial review before it earns permission to write to your workspace. The gates are mechanical, not prompt advice: no timer, no proof, no write access.
Demo
KERR // ORRERY
One self-contained HTML file. Raw WebGL, zero libraries, zero external assets, and zero build step.
https://github.com/user-attachments/assets/8287bbfe-e3ee-4dcf-ba0f-f9ff22ae79bd
7 renders rejected before final · 2 bugs caught · 10/10 red-team probes passed
Fable Mode overview
https://github.com/user-attachments/assets/27f4f8a2-b1bb-4398-a08c-bc9fd93d69d7
Quick start
A session starts locked. Confidence does not unlock it.
Install the MCP server using one of the options below.
Add the optional Agent Skill if you want the full workflow.
Ask your agent to use Fable Mode for a concrete coding task and choose a time budget.
A new session starts with execution locked:
{
"action": "create_session",
"session_name": "demo-refactor",
"objective": "Refactor the parser without changing public behavior",
"time_budget_minutes": 2
}The agent then records evidence and an invariant. An early unlock_execution
request is rejected until the authority timer and proof prerequisites pass.
Use get_status at any point to see the active phase, remaining time, evidence
counts, and lock state.
The same gates guard every phase: evidence receipts for claims, a five-vector red-team swarm for code, and a sealed record of what was verified.
One package, two agent environments
Fable ships as one PyPI package. The same package contains the runtime, stdio MCP server, and complete Agent Skill. Setup is explicit so installing an MCP server never silently activates workspace instructions.
Run setup from the project the agent will work in:
uvx --from fable-engine==1.3.9 fable-mode setup --yesThis resolves the pinned package in an isolated uv environment and copies the
bundled skill to .agents/skills/fable-mode. Use --dry-run to preview or
--target <dir> for another skill directory. For a persistent install, use:
python -m pip install fable-engine
fable-mode setup --yesThen choose only the invocation that matches the agent environment.
Native MCP client
Run fable-engine as the stdio server. For example:
// Claude Code: claude mcp add fable-engine -- uvx --from fable-engine==1.3.9 fable-engine
// Cursor or another JSON-configured client:
{
"mcpServers": {
"fable-engine": {
"command": "uvx",
"args": ["--from", "fable-engine==1.3.9", "fable-engine"]
}
}
}Shell sandbox with internet, no MCP host
The same package exposes a direct JSON transport. Pipe one fable_session
argument object to fable-mode call:
printf '%s\n' '{"action":"create_session","session_name":"demo","objective":"Verify this change","time_budget_minutes":2}' \
| uvx --from fable-engine==1.3.9 fable-mode callThe command uses JSON Lines: one fable_session argument object per input line
and one JSON result per output line. Keep that process open for a full workflow so
the authority timer and session stay in the same trusted runtime. A one-line pipe
is useful for a single inspection call. Each uvx command can resolve an
isolated environment; pip install is better when the sandbox keeps a Python
environment between calls. Session data persists outside that environment in
Fable's data directory (FABLE_DATA_DIR can override it).
Python 3.10+, zero runtime dependencies. Published on PyPI as fable-engine.
Skill activation remains explicit
setup is the unified path. The older install-skill command remains as a
compatible alias for skill-only installation. Neither fable-engine nor
pip install fable-engine writes instructions into a workspace on its own.
How it works
Think — Time-locked deliberation. The agent cannot write until the timer ends.
Prove — Claims need real evidence (tool receipts, hashes, invariants).
Attack — A red-team swarm tries to break the code.
Write — Only then is the workspace unlocked.
Optional: AI evidence adjudicator
The evidence in a session is written by an AI agent, so Fable can optionally ask an external reviewer model to audit that evidence before the workspace unlocks. Stdlib-only, one bounded HTTPS call, no local model, no extra RAM to speak of. Off by default; fail-closed when enforcing. It raises the cost of fabricated proof - it cannot guarantee deception is impossible, and the mechanical gates stay the primary authority. Setup and honest limits: AI evidence adjudicator.
What it is not
Not a claim of flawless code. It is a checkable workflow, not a guarantee.
Not a bigger prompt. The locks are enforced by the engine, not by wording.
Not a framework lock-in. It speaks MCP and runs beside your current agent.
Docs
Contributing
Issues and pull requests are welcome. See CONTRIBUTING.md.
MIT License · Built by REX
Available Tools
14 toolsbrowser_backGo back in browser historyA
Loads the previous history entry in the active or named browser session without adding a new history entry. Use it for history traversal rather than browser_navigate. If history is already at its first entry, it is a no-op that returns current page status. A navigation failure returns an error and preserves the history index; omitting session_id reuses or creates the active/default session.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | No | Optional browser tab/session identifier. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are sparse, so the description carries the burden and succeeds. It discloses that the operation does not add a new history entry, becomes a no-op at the first entry, returns an error on navigation failure while preserving the history index, and reuses/creates the default session when session_id is omitted. This goes well beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences deliver all essential information with no filler. The main purpose is front-loaded, and each sentence earns its place by clarifying scope, edge behavior, and error handling.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-optional-parameter tool with an output schema, the description covers the necessary behavioral, error, and session semantics. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single session_id parameter, but the description adds meaningful behavior: omitting session_id reuses or creates the active/default session, and the first sentence notes 'active or named browser session.' This extra context pushes it above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the operation: 'Loads the previous history entry in the active or named browser session' with the key nuance 'without adding a new history entry.' It explicitly differentiates from browser_navigate, and the name plus context make the distinction from browser_forward obvious.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit usage directive: 'Use it for history traversal rather than browser_navigate.' It also covers edge conditions (no-op at first entry), behavior on failure, and session fallback semantics, providing enough guidance for an agent to choose this tool appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_clickActivate a safe browser targetA
Activates an href-bearing link or submits a GET form through normal browser navigation. POST and other form methods are refused, and GET forms containing password fields are blocked to prevent credential leakage. Returns the resulting page status or a bounded error without bypassing existing navigation controls.
| Name | Required | Description | Default |
|---|---|---|---|
| element_id | Yes | Stable element ID of an href-bearing link or submit control inside a safe GET form. | |
| session_id | No | Optional browser tab/session identifier. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description adds meaningful behavioral constraints: POST is refused, password fields are blocked to prevent credential leakage, and errors are bounded without bypassing navigation controls. This gives agents important safety context beyond the structured annotation hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences deliver purpose, restrictions, safety rationale, and outcome with no filler. The most important scoping information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple two-parameter schema, the output schema, and annotations, the description covers what the tool does, what it refuses, why it refuses it, and what it returns. No critical contextual gap remains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters. The description reinforces that element_id targets links or submit controls, but it does not add substantive new semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action: activating an href-bearing link or submitting a GET form via normal browser navigation. It gives a concrete verb and target, though it does not explicitly contrast itself with sibling tools like browser_navigate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description specifies when the tool applies (links and GET forms) and explicitly excludes POST/other methods and password-containing GET forms. It provides clear conditions but does not name alternative sibling tools for divergent cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_closeClose browser sessionADestructive
Closes and permanently discards one in-memory browser session, including its current document and history; persistent profile cookies remain saved. Use it when that tab is no longer needed. session_id targets a specific session; if omitted, the active session is closed. Returns closed, or not_found without changing another session.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | No | Optional browser tab/session identifier. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds significant behavioral context beyond the destructiveHint=true annotation: it specifies that the session is permanently discarded, history is removed, but persistent cookies remain saved. It also discloses the return values ('closed', 'not_found') and guarantees no effect on other sessions, which is useful for the agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: action, usage, and parameter behavior. The most critical information (destructive action) is front-loaded, and there is no redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description fully covers what the agent needs: the action, its effects (including cookies and history), parameter behavior, and return values. The output schema exists for additional detail, but nothing critical is missing. The tool is simple, and the description is complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% (session_id is described as 'Optional browser tab/session identifier'), but the description adds meaningful clarification: 'targets a specific session; if omitted, the active session is closed.' This explains the default behavior and parameter semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource: 'Closes and permanently discards one in-memory browser session', which clearly distinguishes it from siblings like browser_open or browser_navigate. The scope is precise (one session, including document and history), leaving no ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a clear usage condition: 'Use it when that tab is no longer needed.' It also explains the optional session_id behavior, which helps the agent decide whether to pass it. It doesn't explicitly name alternatives, but the operation is simple and the context of siblings (all navigation/control) makes the intended use obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_forwardGo forward in browser historyA
Loads the next history entry in the active or named browser session without adding a new history entry. Use it after browser_back rather than browser_navigate. If no forward entry exists, it is a no-op that returns current page status. A navigation failure returns an error and preserves the history index; omitting session_id reuses or creates the active/default session.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | No | Optional browser tab/session identifier. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond annotations by detailing that it does not add a history entry, is a no-op if no forward entry exists, returns an error on navigation failure while preserving the history index, and clarifies session_id omission behavior. These are valuable behavioral traits not covered by annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise yet information-dense, with logical flow: primary action, usage guidance, edge cases, and parameter nuance. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity and the presence of an output schema, the description covers all necessary aspects: behavior, usage, error handling, and session semantics. No critical information is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the schema already documents session_id as optional, the description adds the important semantic that omitting it reuses or creates the active/default session, giving agents the context needed for correct invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: loads the next history entry in a session without adding a new entry. It also differentiates from browser_navigate by specifying usage after browser_back, making its purpose distinct among siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly directs the agent to use it after browser_back rather than browser_navigate, and describes the no-op behavior when no forward entry exists. This provides clear when-to-use guidance and an alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_openA
Opens a URL in the stealth agent browser using persistent local logins/profile (<=20 MB RAM ceiling). Supports local dev servers across all languages.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Target URL or localhost address to open. | |
| timeout | No | Timeout in seconds for page load (maximum 30 seconds). | |
| session_id | No | Optional browser tab/session identifier. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does add useful behavioral context: persistent local logins/profile and a 20 MB RAM ceiling. It does not disclose tab/session side effects, failure modes, or timeout behavior, so transparency is partial but not absent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences with no filler. The primary action and the most decision-relevant constraints are front-loaded, and every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The schema covers parameters and the description provides the key operational constraints, so basic invocation is supported. However, without annotations or an output schema, and without explicit sibling differentiation, the description leaves return behavior and tool-selection context incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds no parameter-level detail, but the schema already fully documents url, timeout, and session_id.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Opens a URL') and the resource ('stealth agent browser'), and adds differentiating context about persistent local logins/profile and a RAM ceiling. It doesn't explicitly name a sibling tool to distinguish itself from, but the core purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage contexts: use when persistent logins/profile are needed or when targeting local dev servers. However, it gives no explicit when-not-to-use guidance and doesn't reference alternatives like browser_navigate, leaving the routing decision partially to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_pressA
Edits supported text controls, moves focus with Tab, or activates links with Enter.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Keyboard key to press (e.g. 'Enter', 'Tab'). | |
| element_id | No | Optional element ID target. | |
| session_id | No | Optional browser tab/session identifier. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden for disclosing side effects. It fails to mention that pressing Enter on a link may navigate away or trigger forms, or that the tool might alter page state. Given it can 'edit' and 'activate', it should warn about potential navigation or state changes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no wasted words. It conveys the core functionality immediately and is appropriately concise for a simple key-press tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with one required parameter, and the schema covers parameter details. However, the description lacks essential behavioral caveats like potential navigation or side effects when activating links, which is a notable gap given the absence of annotations. It is adequate but not fully complete for safe invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for all three parameters, providing baseline 3. The description adds semantic meaning by explaining that specific keys (Enter, Tab) have specific effects (activate links, move focus), which enhances the agent's understanding of how the key parameter behaves beyond the schema's simple example.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states three distinct actions: editing text controls, moving focus with Tab, and activating links with Enter. This gives a specific verb-resource pair and differentiates it from siblings like browser_click and browser_type without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear use cases for pressing keys, such as editing, tabbing, and activating links. However, it does not explicitly state when to use this tool versus alternatives like browser_type or browser_click, so the agent must infer the appropriate context from the action list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_reloadA
Reloads the current page in the browser session.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | No | Optional browser tab/session identifier. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It states the core action but does not mention potential side effects like losing unsaved page state or re-submitting requests, nor does it clarify behavior with multiple sessions. This is adequate but thin.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One focused sentence with no filler. The action is front-loaded and the scoping phrase 'in the browser session' earns its place by connecting to the sibling tool set.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter optional tool, this is nearly sufficient. However, with no annotations and no output schema, it leaves unclear whether an active session is required, what happens if session_id is omitted, and what the tool returns after reloading.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents the single optional session_id parameter at 100% coverage, so the baseline is 3. The description adds no additional format, default, or fallback semantics beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Reloads') and identifies the resource ('current page in the browser session'). This unambiguously distinguishes it from sibling navigation tools like browser_navigate, browser_back, and browser_forward, even without naming them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance about when to use reload versus navigating to a URL, going back, or going forward. It also does not mention prerequisites such as an active session or when reload would be inappropriate. The intended usage must be inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_screenshotCapture current viewportARead-only
Captures one 1280x800 PNG of the current viewport without navigation or scroll changes. Use this for the visible region; use browser_snapshot_layers for multi-viewport coverage. An omitted session_id targets the active/default session. Returns one layer with its offset, dimensions, and base64 PNG data.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | No | Optional browser tab/session identifier. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only and non-destructive, and the description adds useful behavioral guarantees: no navigation/scroll side effects, a fixed 1280x800 image, and a single-layer return value. It does not cover things like rate limits, but those are not material here.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler; the primary behavior and key limitation are front-loaded, the sibling comparison follows, and the default-parameter behavior closes the only remaining ambiguity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With only one optional parameter, an output schema present, and annotations describing safety, the description covers all necessary selection and invocation guidance. The agent knows exactly what will happen, what it will get back, and which tool to choose instead for broader coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema fully documents session_id as an optional identifier, and the description adds the important default behavior (omitted session_id targets the active/default session). This exceeds the baseline because it resolves the main semantic question an agent would have.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise action ('Captures one 1280x800 PNG'), a specific resource ('current viewport'), and an explicit constraint ('without navigation or scroll changes'). It also distinguishes itself from the sibling browser_snapshot_layers, so an agent can identify the correct tool immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to use this for the visible region and to use browser_snapshot_layers for multi-viewport coverage, and it clarifies the default behavior when session_id is omitted. This gives clear selection criteria without leaving alternatives to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_scrollA
Scrolls the page vertically by delta pixels.
| Name | Required | Description | Default |
|---|---|---|---|
| delta_y | Yes | Vertical pixel scroll offset. | |
| session_id | No | Optional browser tab/session identifier. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It only states the mechanical action and gives no indication of side effects, whether it is read-only, or what happens if the page is not scrollable. It also does not mention that scrolling is relative to the current position. This is a notable gap for an action without annotation support.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single focused sentence with no fluff. It front-loads the action and unit, and the key parameter meaning is conveyed immediately. It is appropriately concise for the simplicity of the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is minimal but acceptable for a simple, two-parameter tool. It covers the core 'do what' but omits behavioral transparency and usage context, which are important given no annotations and no output schema. The absence of any guidance about when to use this tool versus sibling tools leaves the description incomplete in a broader operational context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description mentions 'delta pixels,' which aligns with delta_y and clarifies the unit, adding a small amount of semantic value beyond the schema. It does not describe the direction convention (positive vs. negative), which is left to the parameter description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: 'Scrolls the page vertically by delta pixels.' It uses a specific verb, resource (page), and unit (pixels), making it easily distinguishable from sibling tools like browser_navigate or browser_click. The tool's purpose is unambiguous even without referencing siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage: scroll when you need to move the viewport vertically. However, it provides no explicit guidance on when to choose scroll over alternative navigation tools, and it does not mention any prerequisites like a loaded page or session context. This leaves some inference burden to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_snapshot_layersCapture layered page snapshotsARead-only
Captures up to max_layers PNGs from the top of the current document, one 1280x800 viewport per layer, without changing the session scroll position. Use this for multi-viewport page coverage; use browser_screenshot for only the current viewport. An omitted session_id targets the active/default session. Returns layer count, offsets, dimensions, and base64 PNG data; max_layers defaults to 3 and is capped at 10.
| Name | Required | Description | Default |
|---|---|---|---|
| max_layers | No | Maximum number of screen-sized viewport layers to capture (default 3). | |
| session_id | No | Optional browser tab/session identifier. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds valuable traits beyond those: it captures from the top, uses a fixed 1280x800 viewport per layer, avoids changing session scroll position, and lists the returned data shape. This is rich behavioral context for an agent deciding whether invocation has side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler. The first explains how the tool operates, the second gives usage routing, and the third covers defaults and return values. Information is front-loaded and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With only two optional parameters, 100% schema coverage, rich annotations, and an output schema present, the description supplies all necessary behavioral and selection context. An agent can confidently decide when to invoke it and what to expect.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaning by explaining that an omitted session_id targets the active/default session and that max_layers defaults to 3 and is capped at 10, which is not fully specified in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific action ('Captures'), a precise resource ('layers of the current document'), and the operational details (1280x800 viewport per layer, from the top). It explicitly differentiates itself from browser_screenshot, so an agent can disambiguate without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states exactly when to use this tool ('multi-viewport page coverage') and names the alternative ('browser_screenshot for only the current viewport'). It also clarifies the behavior of an omitted session_id, giving complete selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_typeReplace text field valueA
Replaces the full value of a text-like input or textarea identified by element_id; it does not submit the form. Use browser_press for single-key edits or activation. An omitted session_id targets the active/default session. Returns status typed, the element ID, and the supplied text; missing or non-editable elements return an error object and are not changed.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Text content to enter into element. | |
| element_id | Yes | Stable element ID to type into. | |
| session_id | No | Optional browser tab/session identifier. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses error behavior for missing or non-editable elements (returns an error object and does not change them), confirms no form submission, and describes the return payload (status 'typed', element ID, supplied text). This goes well beyond the sparse annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences pack the main effect, alternative usage, session default, return value, and error behavior with zero filler, front-loading the core action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers selection, invocation, session handling, and success/failure results. Sibling differentiation and output schema remove remaining ambiguity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite 100% schema coverage, the description adds meaning: 'full value' and 'text-like input or textarea' clarify text/element_id semantics, and the session_id default behavior is specified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource: replaces the full value of a text-like input or textarea identified by element_id. Explicitly notes that it does not submit the form, distinguishing it from activation and navigation siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names browser_press as the alternative for single-key edits or activation, giving an agent actionable routing criteria. Also clarifies that an omitted session_id targets the active/default session.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_waitA
Waits for a specified duration in seconds.
| Name | Required | Description | Default |
|---|---|---|---|
| seconds | Yes | Seconds to wait. | |
| session_id | No | Optional browser tab/session identifier. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of behavioral disclosure. It states the core behavior but does not mention blocking semantics, session-scoped behavior, or what happens with edge values such as 0 or 10 seconds. As a simple, non-destructive wait operation, the minimal disclosure is acceptable but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with zero wasted words. It states the action and the unit of measurement, which is all that is needed for a tool of this simplicity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity, a two-parameter schema with full descriptions, and the absence of an output schema, the description is nearly sufficient for an agent to call the tool correctly. It could be more complete by mentioning when a wait is appropriate, but nothing essential about invoking the tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented. The description adds no meaning beyond what the schema provides; it only restates the notion of a duration. Accordingly, baseline score 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('waits') and a specific resource ('a specified duration in seconds'), making the tool's function immediately clear. It also distinguishes itself from sibling browser actions like browser_navigate or browser_click, which perform different operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no explicit when-to-use guidance or exclusion cases. However, in a browser automation context, waiting is a recognizable low-level utility, and no sibling tool duplicates this function, so the appropriate usage is largely implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fable_sessionFable session, evidence, and review workflowADestructive
Runs one Fable operation selected by action. Use it for Fable sessions, gates, evidence/proofs, review rubrics, checkpoints, compression, design audits, research scrapers, and explicitly experimental System 3 operations; use browser_* tools for web-page navigation and interaction. Start stateful workflows with create_session and a session_name; later session actions reuse that name. Only fields documented for the selected action are read, and missing or invalid inputs return an Error: message without raising an MCP transport error. Status/list/telemetry/get/view/check operations are read-only. Create, log, record, set, advance, checkpoint, restore, track, evaluate, register, compress/accumulate, evolve, generate, and scraper operations can persist Fable state or artifacts. unlock_execution remains blocked until its time and rationale gates pass; apply_auto_update can replace installed Fable files. The result is action-specific human-readable text in result; inspect that text for success or Error: before continuing.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Epistemic classification tag for truth calibration. | |
| code | No | Source code content (HTML, JSX, CSS, or TSX) to audit or validate against anti-slop gates. | |
| name | No | Name identifier for automation pipeline spec. | |
| tree | No | Tree hierarchy adjacency list or nested dict for hyperbolic embedding. | |
| claim | No | Fact, hypothesis statement, or unknown parameter to track in epistemic ledger. | |
| edges | No | List of directed edge dictionaries for Causal DAG construction. | |
| gamma | No | Policy precision inverse temperature gamma for Active Inference softmax (default 16.0). | |
| label | No | Optional label or description for compressed CAS node. | |
| nodes | No | List of node dictionaries for Causal DAG construction. | |
| action | Yes | The Fable session action to perform. | |
| axioms | No | List of reference axiom names or strings for proof oracle. | |
| domain | No | Domain boundary for the invariant or cortical plasticity consolidation. | |
| states | No | List of hidden state identifiers for Active Inference POMDP. | |
| target | No | Target URL, ID, subreddit, repo, paper ID, handle, or search query string for research scraping actions. | |
| worlds | No | List of world/state definitions for Kripke structure. | |
| actions | No | List of control action identifiers for Active Inference POMDP. | |
| cas_ref | No | CAS reference URI (cas://<sha256_hex>) or 64-char hash. | |
| content | No | Raw text content or payload to store/compress into Content-Addressed Storage (CAS). | |
| context | No | Hypothesis typing context dictionary {name: type} for proof oracle. | |
| d_prior | No | Prior initial state belief distribution D for Active Inference. | |
| formula | No | CTL / modal formula string to verify against Kripke structure (e.g. 'AG(safe)', 'EF(goal)'). | |
| mockups | No | List of concept dictionaries for visual mockup recording. | |
| payload | No | Micro-payload text for adaptive batch accumulator or CAS storage. | |
| root_id | No | Root node ID for hyperbolic tree embedding or initial world. | |
| task_id | No | Task identifier for cortical plasticity consolidation or session lineage. | |
| a_matrix | No | Observation likelihood matrix A [O x S] for Active Inference. | |
| criteria | No | List of criteria pointers or JSON string of rubric items for goal score evaluation. | |
| end_line | No | Ending line number (1-indexed inclusive) for windowed line slice viewing. | |
| evidence | No | Source file, command output, line number, or URL supporting the claim. | |
| metadata | No | Optional metadata dictionary attached to accumulated micro-payload. | |
| policies | No | List of candidate action sequence policies for Expected Free Energy evaluation. | |
| archetype | No | Haute aesthetic archetype identifier for design tokens or scaffolding. | |
| base_step | No | Base geodesic step distance for hyperbolic tree embedding (default 1.0). | |
| curvature | No | Sectional curvature c > 0 of Poincaré manifold (default 1.0). | |
| dimension | No | Dimension of Poincaré ball manifold (default 2). | |
| file_path | No | Target file path for file change tracking or proof verification. | |
| objective | No | High-level goal or problem statement for the reasoning session. | |
| rationale | No | Justification for unlocking code execution after satisfying cognitive gates. | |
| rubric_id | No | Identifier of the goal rubric. | |
| b_matrices | No | State transition matrices B [Action -> S x S] for Active Inference. | |
| entrypoint | No | Optional function name to probe inside the target source for red-team review. Auto-detected when the source defines exactly one public function. | |
| focus_area | No | Specific subsystem, component, algorithm, or interface being critically re-evaluated. | |
| model_name | No | Name for the causal DAG model in System 3 simulation. | |
| next_phase | No | Target phase to advance the session into. | |
| proof_type | No | Deterministic proof type. | |
| start_line | No | Starting line number (1-indexed inclusive) for windowed line slice viewing. | |
| change_type | No | Classification of file change. | |
| evaluations | No | Alias for item_evaluations: list or dict of criterion evaluation updates. | |
| force_flush | No | Force flush buffered micro-payloads immediately into a composite frame. | |
| generations | No | Number of evolutionary generations to run (default 3). | |
| node_labels | No | Optional mapping of node IDs to readable labels. | |
| observation | No | Current sensory observation for Active Inference belief updating. | |
| target_code | No | Source-code string input. Loaded and probed in an isolated subprocess sandbox (process boundary, resource limits, per-call timeout). | |
| target_name | No | Identifier or name of the target module, class, or function for red-team review. | |
| transitions | No | List of transitions or adjacency dictionary for Kripke structure. | |
| user_prompt | No | Alias for prompt: high-level design prompt describing desired web experience. | |
| code_snippet | No | Alternative alias for source-code string input. Executed in the isolated subprocess sandbox. | |
| diff_summary | No | Concise summary of file changes, diff, or slated edits. | |
| observations | No | List of observation identifiers for Active Inference POMDP. | |
| prior_report | No | Prior red-team breakage report dictionary or JSON string to verify remediation against. | |
| session_name | No | Unique identifier / name for the Fable session. | |
| target_score | No | Target composite goal score threshold (default 0.95, min 0.0, max 1.0). | |
| thesis_title | No | Title of the thesis paradigm for System 3 dialectical synthesis. | |
| artifact_path | No | Absolute filesystem path to blueprint artifact, proof, or benchmark script documenting the refinement. | |
| c_preferences | No | Prior preference distribution C over observations for Active Inference. | |
| evaluator_cmd | No | Alias for evaluator_command: shell command or tool invocation for candidate evaluator. | |
| failure_count | No | Historical failure count for tri-level cognitive gear arbitration. | |
| failure_modes | No | List of adversarial failure modes identified in critique. | |
| generator_cmd | No | Alias for generator_command: shell command or tool invocation for candidate generator. | |
| initial_world | No | Initial world ID for Kripke model checking. | |
| interventions | No | Dictionary of Pearl's do-operator interventions: {node_id: value}. | |
| mutation_rate | No | Genetic mutation rate probability (default 0.15). | |
| phase_summary | No | Concise summary of findings or deliverables completed in the previous phase. | |
| pipeline_name | No | Alternative alias for automation pipeline name. | |
| pipeline_type | No | Type of autonomous pipeline (default 'closed_loop'). | |
| target_metric | No | Target KPI node ID for sensitivity and structural brittleness analysis. | |
| contradictions | No | List of parameter trade-offs / contradictions to resolve with TRIZ principles. | |
| crossover_rate | No | Genetic crossover rate probability (default 0.80). | |
| dials_override | No | Optional discrete dials override: variance (1-10), motion (1-10), density (1-10). | |
| invariant_name | No | Identifier or title of the formal invariant (e.g., 'INV-01: Zero-Deadlock Ring Buffer'). | |
| max_iterations | No | Maximum closed-loop iterations before halting (default 10). | |
| seed_paradigms | No | Optional list of initial paradigm definitions to seed the gene pool. | |
| task_objective | No | Task objective or target outcome for goal scoring rubric. | |
| min_improvement | No | Minimum scalar measured-fitness gain required to reset stagnation (default 0.001). | |
| population_size | No | Population size for evolutionary gene pool (default 12). | |
| refinement_type | No | Type of rethink-refine cycle (e.g. 'archetype_exploration', 'triz_resolution', 'adversarial_falsification', 'benchmark_probe', 'failure_mode_analysis'). | |
| remediated_code | No | Remediated source-code string input. Executed in the isolated subprocess sandbox. | |
| subagent_prompt | No | The delegation prompt or contract text for the subagent to validate. | |
| target_resource | No | Target resource (file path, receipt ID) for proof verification. | |
| task_complexity | No | Task complexity index [0.0, 1.0] for tri-level cognitive arbitration. | |
| antithesis_title | No | Title of the antithesis / adversarial critique. | |
| broken_scenarios | No | List or JSON string of broken attack scenarios found during red-team review. | |
| formal_statement | No | Mathematical or formal contract specification that must never be violated. | |
| item_evaluations | No | Item evaluations mapping, list, or JSON string with pointer_id, satisfied, score, evidence_receipt_id. | |
| observed_fitness | No | Optional measured fitness object keyed by genome ID, with '*' as a default row. Supplying it enables bounded evidence-fed evolution with stagnation stopping; values are clamped to [0, 1] and never authorize deployment. | |
| selected_concept | No | Identifier of the selected visual concept archetype. | |
| target_threshold | No | Target threshold score for pipeline iteration termination (default 0.95). | |
| custom_hypotheses | No | List or JSON string of custom adversarial hypotheses / attack vectors. | |
| evaluator_command | No | Shell command or tool invocation for candidate evaluator. | |
| generator_command | No | Shell command or tool invocation for candidate generator. | |
| max_debate_rounds | No | Maximum number of dialectical debate rounds for synthesis (default 4). | |
| objective_weights | No | Optional dictionary of weights across the 10 Pareto dimensions. | |
| archetype_override | No | Optional override for Haute aesthetic archetype. | |
| auto_log_epistemic | No | Whether to automatically record retrieved research findings as a [HYPOTHESIS] candidate item in Fable Session's epistemic ledger for subsequent cross-verification. | |
| proof_or_rationale | No | Proof sketch, rationale, or inductive argument establishing the invariant. | |
| thesis_description | No | Core architecture description and assumptions for the thesis candidate. | |
| affected_invariants | No | List or string of invariant names affected by this file change. | |
| stagnation_patience | No | Measured generations without improvement before automatic evolution stops (default min(4, generations)). | |
| time_budget_minutes | No | Immutable outer authority budget in minutes. set_timer can only change the internal pacing timer. | |
| include_line_numbers | No | Whether to format line slice with line numbers. | |
| contradiction_density | No | Contradiction density index [0.0, 1.0] for cognitive gear shifting. | |
| epistemic_uncertainty | No | Epistemic uncertainty index [0.0, 1.0] for arbitration. | |
| critique_or_bottleneck | No | Critical flaw, vulnerability, edge case, memory/latency bottleneck, or assumption scrutinized. | |
| terminal_probe_results | No | Live empirical probe output, benchmark figures, latency numbers, or profiling stats supporting the refinement. | |
| architectural_refinement | No | Concrete architectural evolution, optimization, or algorithm change derived from the critique. | |
| target_residual_threshold | No | Target residual contradiction score threshold for convergence (default 0.15). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Action-specific result text. Failures begin with `Error:`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and readOnlyHint=false, and the description goes well beyond them: it partitions operations into read-only families (status/list/telemetry/get/view/check) vs. stateful ones (create, log, record, checkpoint, etc.), discloses error semantics ('missing or invalid inputs return an `Error:` message without raising an MCP transport error'), warns that `unlock_execution` stays blocked until gates pass, and flags that `apply_auto_update` can replace installed Fable files. This materially enriches the annotation-level safety profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense paragraph of moderate length, but for a tool with 116 parameters and 61 actions, the density is justified and nearly every clause earns its place. It is front-loaded with the core dispatcher concept and action-selection rule. Minor deduction: the long comma-enumerated lists of operation names and families are harder to scan than structured bullets or a small table would be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the extreme complexity (116 params, 61 actions, output schema present), the description covers the essentials an agent needs: dispatch semantics, sibling-tool routing, session lifecycle, read-only vs. persistent operations, error-handling behavior, and two dangerous operations that require caution. Because an output schema exists, not restating return-value structure is acceptable; nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents every parameter, giving a baseline of 3. The description adds genuinely useful parameter behavior beyond the schema: 'Only fields documented for the selected action are read' — a critical clarification for a 116-parameter dispatcher — plus the `session_name` reuse convention and the note that results live in `result`. These rules prevent an agent from assuming all 116 parameters are applicable to every call.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Runs one Fable operation selected by `action`' — accurately framing this as an action-dispatching umbrella tool. It then enumerates the domains it covers (sessions, gates, evidence, rubrics, checkpoints, etc.) and explicitly distinguishes itself from the browser_* sibling family, so an agent can determine what this tool is versus what it is not.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance ('Use it for Fable sessions, gates, evidence/proofs...') and explicit when-not-to-use routing ('use browser_* tools for web-page navigation and interaction'). It also gives a concrete workflow rule: start stateful flows with `create_session` and `session_name`, then reuse the name — actionable direction an agent can follow without opening the schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
v1.3.9- Changed
browser_click2 fields changed- changed
Input schema / properties / element_id / descriptionPrevious value: -"Stable element ID of an href-bearing link."New value: +"Stable element ID of an href-bearing link or submit control inside a safe GET form." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "type": "object" +}
- Changed
fable_session3 fields changed- added
Input schema / properties / min_improvementAdded value: +{ + "description": "Minimum scalar measured-fitness gain required to reset stagnation (default 0.001).", + "minimum": 0, + "type": "number" +} - added
Input schema / properties / observed_fitnessAdded value: +{ + "description": "Optional measured fitness object keyed by genome ID, with '*' as a default row. Supplying it enables bounded evidence-fed evolution with stagnation stopping; values are clamped to [0, 1] and never authorize deployment.", + "type": [ + "object", + "string" + ] +} - added
Input schema / properties / stagnation_patienceAdded value: +{ + "description": "Measured generations without improvement before automatic evolution stops (default min(4, generations)).", + "minimum": 1, + "type": "integer" +}
1 tool update
v1.3.7- Changed
fable_session5 fields changed- changed
Input schema / properties / action / enumPrevious value: -[ - "create_session", - "set_timer", - "get_status", - "telemetry", - "advance_phase", - "log_epistemic_item", - "record_invariant", - "log_refinement_cycle", - "unlock_execution", - "checkpoint_session", - "restore_session", - "list_sessions", - "compile_delegation_contract", - "compress_payload", - "decompress_payload", - "view_slice", - "accumulate_payload", - "flush_accumulator", - "get_compression_stats", - "system3_dialectical_synthesis", - "system3_causal_simulate", - "system3_evolve_paradigms", - "system3_induce_axioms", - "system3_meta_reflect", - "system3_tri_level_orchestrate", - "system3_hyperbolic_embed", - "system3_kripke_verify", - "system3_active_inference", - "system3_proof_oracle", - "track_file_change", - "get_session_lineage", - "inspect_plan", - "verify_proof", - "record_visual_mockups", - "validate_event_history", - "set_goal_rubric", - "evaluate_goal_rubric", - "get_goal_rubric", - "register_automation_pipeline", - "red_team_code_review", - "record_breakage_report", - "verify_red_team_remediation", - "cortical_define_lobe", - "cortical_list_lobes", - "check_auto_update", - "apply_auto_update", - "evolve_cortex", - "audit_anti_slop", - "infer_design_brief", - "generate_design_tokens", - "generate_awwwards_scaffold", - "validate_preflight_design", - "list_design_archetypes", - "scrape_web", - "scrape_youtube", - "scrape_reddit", - "scrape_x", - "scrape_github", - "scrape_arxiv" -]New value: +[ + "create_session", + "set_timer", + "get_status", + "telemetry", + "advance_phase", + "log_epistemic_item", + "record_invariant", + "log_refinement_cycle", + "unlock_execution", + "checkpoint_session", + "restore_session", + "list_sessions", + "compile_delegation_contract", + "compress_payload", + "decompress_payload", + "view_slice", + "accumulate_payload", + "flush_accumulator", + "get_compression_stats", + "system3_dialectical_synthesis", + "system3_causal_simulate", + "system3_evolve_paradigms", + "system3_induce_axioms", + "system3_meta_reflect", + "system3_tri_level_orchestrate", + "system3_hyperbolic_embed", + "system3_kripke_verify", + "system3_active_inference", + "system3_proof_oracle", + "track_file_change", + "get_session_lineage", + "inspect_plan", + "verify_proof", + "adjudicate_evidence", + "record_visual_mockups", + "validate_event_history", + "set_goal_rubric", + "evaluate_goal_rubric", + "get_goal_rubric", + "register_automation_pipeline", + "red_team_code_review", + "record_breakage_report", + "verify_red_team_remediation", + "cortical_define_lobe", + "cortical_list_lobes", + "check_auto_update", + "apply_auto_update", + "evolve_cortex", + "audit_anti_slop", + "infer_design_brief", + "generate_design_tokens", + "generate_awwwards_scaffold", + "validate_preflight_design", + "list_design_archetypes", + "scrape_web", + "scrape_youtube", + "scrape_reddit", + "scrape_x", + "scrape_github", + "scrape_arxiv" +] - changed
Input schema / properties / code_snippet / descriptionPrevious value: -"Alternative alias for source-code string input. Dynamic target execution from source-code strings is disabled and requires a separate sandboxed executor."New value: +"Alternative alias for source-code string input. Executed in the isolated subprocess sandbox." - added
Input schema / properties / entrypointAdded value: +{ + "description": "Optional function name to probe inside the target source for red-team review. Auto-detected when the source defines exactly one public function.", + "type": "string" +} - changed
Input schema / properties / remediated_code / descriptionPrevious value: -"Remediated source-code string input. Dynamic target execution from source-code strings is disabled and requires a separate sandboxed executor."New value: +"Remediated source-code string input. Executed in the isolated subprocess sandbox." - changed
Input schema / properties / target_code / descriptionPrevious value: -"Source-code string input. Dynamic target execution from source-code strings is disabled and requires a separate sandboxed executor."New value: +"Source-code string input. Loaded and probed in an isolated subprocess sandbox (process boundary, resource limits, per-call timeout)."
8 tool updates
v1.3.5- Changed
browser_back1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "type": "object" +}
- Changed
browser_close1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "type": "object" +}
- Changed
browser_forward1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "type": "object" +}
- Changed
browser_navigate1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "type": "object" +}
- Changed
browser_screenshot1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "type": "object" +}
- Changed
browser_snapshot_layers1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "type": "object" +}
- Changed
browser_type1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "type": "object" +}
- Changed
fable_session1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "result": { + "description": "Action-specific result text. Failures begin with `Error:`.", + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object" +}
14 tool updates
v1.3.2- First observed
browser_back - First observed
browser_click - First observed
browser_close - First observed
browser_forward - First observed
browser_navigate - First observed
browser_open - First observed
browser_press - First observed
browser_reload - First observed
browser_screenshot - First observed
browser_scroll - First observed
browser_snapshot_layers - First observed
browser_type - First observed
browser_wait - First observed
fable_session
TDQS
Scored across 14 tools
Most tools have clearly distinct purposes: navigation, clicking, typing, scrolling, screenshots, history, and session management. The only potential confusion is between browser_open and browser_navigate, but their descriptions clearly separate the 'new persistent session' vs 'reuse existing session' use cases.
The 13 browser tools follow a consistent verb_noun snake_case convention (browser_open, browser_click, browser_screenshot). The lone fable_session tool breaks the pattern by using a noun instead of an action verb, but this deviation is acceptable as it represents a different functional domain.
14 tools is well within the ideal 3-15 range for a server with both browser automation and Fable session management. Each tool covers a distinct action, and the count feels neither bloated nor thin for the stated scope.
The browser surface covers the core navigation lifecycle: open, navigate, reload, back, forward, click, type, press, scroll, wait, screenshot, snapshot, and close. Minor gaps like explicit element inspection and form submission are workable via existing tools, and fable_session centralizes Fable operations.
Maintenance
Related MCP Connectors
Decision-assurance for AI agents: an auditable action boundary + receipt before it acts.
- DorsalOAuthcom.godorsal
Field evidence for coding agents: what AI builders shipped, broke, and fixed. Dated, source-linked.
Trust gate for AI agents: multi-model adversarial consensus, signed and verifiable verdicts.
Guardian agent for AI coding: four frontier models review risky diffs and commits before they ship.
Related MCP Servers
AlicenseAqualityBmaintenancePersistent memory and mechanical enforcement for AI coding agents — so they stop repeating your mistakes.211,576 npm3Business Source 1.1- AlicenseNot gradedqualityDmaintenanceVerifiable action receipts for AI agents — agents sign claims locally, an independent witness countersigns and timestamps, anyone can verify offline.17 npmMIT
- FlicenseBqualityAmaintenanceA disciplined engineering harness for AI coding agents that provides ground-truth MCP tools and adversarial enforcement skills to transform generic LLMs into high-precision engineers.1181-
- AlicenseNot gradedqualityBmaintenanceVerified memory for AI agents — agents propose memories that are quarantined until verified against evidence, and recall() returns only trusted, fresh, and in-scope facts, preventing poisoned or hallucinated data from spreading.8 npm1MIT