minibot
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@minibotwrite a file hello.py that prints hello, then read it back"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
minibot
A locally-hosted bot for your terminal, powered by Ollama tool calling. Type natural language — the model picks tools, your bot eats, plays, recharges, and can read/write code files in a restricted sandbox.
Zero third-party dependencies: pure Python stdlib. Runs on Termux, Linux, macOS and Windows.
.---. Pixel the bot · mood: happy · age 3d
/ o o \ Hunger [██░░░░░░░░] 20/100
\ w / Happiness [███████░░░] 72/100
'---' Energy [██████░░░░] 65/100
Health [██████████] 100/100
❯ write a file hello.py that prints hello
» tools: write_file
Pixel: wrote hello.py (21 bytes), want me to run the idea past you?Requirements
Python 3.10+
Ollama running locally (or on another machine on your LAN)
Related MCP server: veriloop
Install Ollama
Platform | How |
Linux |
|
macOS |
|
Windows |
|
Termux |
|
Pull a tool-calling-capable model (7B recommended on desktops):
ollama pull qwen2.5:7b # or llama3.1:8b
# phones / weak CPUs:
ollama pull qwen2.5:3b
ollama pull qwen2.5:1.5bVerify: curl http://127.0.0.1:11434/api/tags should list your models.
Install minibot
git clone https://github.com/karun99/minibot.git && cd minibot
pip install . # installs the `minibot` command
# — or run without installing: python -m minibotNo pip install step needed beyond that — there are no runtime dependencies.
Quick start
minibot doctor # check python/config/sandbox/ollama/model
minibot run # interactive terminal botThen chat, or use direct commands (they work even with Ollama stopped):
/feed /play /rest /treat /status /stats
/ls /read notes.md /write notes.md /history /undo notes.md
/needle on /doctor /clear /help /quitCaring for the bot earns treats (feed and rest earn 1, play earns 2, capped
at 20); /treat spends one for a small happiness/health/energy boost.
/stats charts the recent stat history, /history lists recent sandbox
writes and /undo [file] reverts one.
Type minibot run --offline to start anyway when Ollama is down
(direct /commands only).
One-shot commands (scriptable)
minibot status # human readable
minibot status --json # machine readable
minibot feed # feed once
minibot treat # spend a treat
minibot stats --points 20 # recent stat chart (also --json)
minibot ls src/
minibot read src/app.py
echo "print('hi')" | minibot write hello.py
minibot history # recent sandbox writes
minibot undo src/app.py # restore the previous version
minibot chat "read hello.py and tell me what it does"Use it from any MCP client
minibot mcp serves the bot's tools over stdio using the
Model Context Protocol, so Claude Desktop,
Cursor, OpenCode or any other MCP client can feed your bot, read and write
sandbox files, and undo writes:
{
"mcpServers": {
"minibot": {
"command": "minibot",
"args": ["mcp"]
}
}
}Exposed tools: feed_bot, play_with_bot, rest_bot, give_treat,
get_bot_status, read_file, write_file, list_dir, file_history,
undo_write. The same sandbox rules apply — a client outside your machine
still cannot escape the sandbox directory.
Configuration
Search order: --config PATH → ./config.json →
$XDG_CONFIG_HOME/minibot/config.json → ~/.config/minibot/config.json →
defaults. Precedence: CLI flags > environment > config file > defaults.
Copy config.example.json to config.json and edit. Every key is optional:
Key | Default | Meaning |
|
| Ollama endpoint (also |
|
| model for the main loop (also |
|
| your bot's name |
|
| only directory file tools can touch (also |
|
| persisted bot state |
|
| rotating log (tool calls + file writes) |
|
| tool-loop cap per user message |
|
| read/write size limit (1 MB) |
|
| write journal backing |
|
| how many writes the journal keeps |
|
| intent pre-filter on/off |
|
|
|
| see example | stat drift per hour of real time |
MINIBOT_HOME (default ~/.minibot) overrides where state/sandbox/logs live.
The Needle pre-filter (optional)
When enabled, input is classified first into bot_action / file_action / chat / unknown:
heuristic mode — regex/keyword classifier, no model, instant, offline.
ollama mode — a tiny classifier model (
needle.model); any failure silently falls back to the heuristic, and any total failure falls back to the main loop (graceful degradation).Only high-confidence, unambiguous bot-care phrases ("feed my bot", "status") execute directly without the LLM; everything else — including vague or mixed requests — goes through the normal tool-calling loop.
Sandbox safety
All paths are resolved (symlinks followed) and must stay inside the sandbox.
..traversal, absolute paths outside the root, escaping symlinks and null bytes are rejected with a safe error.Read/write capped at
max_file_bytes(default 1 MB).Every write is logged with timestamp, path and size.
Tests
pip install pytest
pytest180+ tests: sandbox traversal attacks, state decay/persistence, treat inventory, stat-history samples, the write journal (history/undo), tool schemas, the ReAct loop (malformed-JSON retry, max iterations, history trimming), Needle routing, the Ollama client against a local fake server, the MCP server over stdio, and CLI acceptance tests.
Troubleshooting
Symptom | Fix |
|
|
|
|
Bot replies but never uses tools | use a tool-capable model ( |
Loop hits max iterations | ask for one thing at a time, or raise |
Colors/emoji look wrong |
|
Windows console garbled | Windows Terminal recommended (VT sequences auto-enabled) |
Layout
minibot/
config.py config file + env + CLI precedence
state.py bot stats, time decay, atomic JSON persistence
sandbox.py path containment, size limits, write audit
tools.py tool schemas + handlers (add a tool in ~10 lines)
ollama_client.py stdlib HTTP client for /api/chat and /api/tags
needle.py optional intent pre-filter (heuristic | ollama)
orchestrator.py ReAct loop, malformed-retry, history trimming
mcp_server.py stdio MCP server: expose the tools to other agents
tui.py terminal UI: sprite, bars, slash commands
cli.py run/status/feed/treat/stats/history/undo/chat/mcp/doctor
checks.py health checks shared by doctor and /doctor
docs/SRS.md the requirements this implements
tests/ pytest suite (run on a fast disk, not an SD card)License
MIT — see LICENSE.
Available Tools
10 toolsfeed_botA
Feed the bot Pixel. Reduces hunger (0 = full, 100 = starving), small happiness and health boost. Use when the user says the bot is hungry or asks to feed it.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden. It does well to state the hunger scale (0 = full, 100 = starving) and the direction of happiness/health effects, but says nothing about feeding limits, overfeeding consequences, cooldowns, or what the response contains. For a zero-parameter mutation this is adequate but incomplete.
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: action, effects with scale, then trigger. The core behavior and the hunger scale are front-loaded. Nothing is redundant, though the parenthetical hunger explanation slightly interrupts the flow.
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 simple no-param tool with no output schema and no annotations, the description covers what it does, its effects, and when to use it. Missing only return-value expectations and interaction with sibling tools like give_treat, which would be needed to make routing fully reliable.
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 tool takes no parameters, so the baseline is 4. The description correctly implies no inputs are needed ('Feed the bot Pixel'), and there are no parameter semantics to compensate for.
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?
Specific verb ('Feed') and resource ('the bot') with explicit effects: reduces hunger, boosts happiness and health. It does not distinguish itself from the sibling give_treat, which is a closely related feeding action, so an agent cannot tell when to pick one over the other from the description alone.
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?
Gives a clear trigger: 'Use when the user says the bot is hungry or asks to feed it.' This is actionable context for when to call it. It stops short of exclusions or naming an alternative such as give_treat or play_with_bot, which leaves edge cases unresolved.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
file_historyA
List recent sandbox file writes (who wrote what, and when). Use before undoing a write you did not intend to make.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many recent writes to return (default 20) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. 'List' implies a read-only, non-destructive operation and the sandbox scope plus returned fields are stated, but it omits pagination/ordering behavior and whether results span all files or only recent sessions.
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 tight sentences, zero waste, with the purpose front-loaded and the usage cue immediately following.
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 simple single-parameter list tool with a fully documented schema and no output schema, the description covers what it returns and when to reach for it. Only richer behavioral detail (ordering, scope boundaries) 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?
Only one parameter (limit) with 100% schema coverage and a documented default of 20, so the schema does the heavy lifting. The description adds nothing beyond the schema about the limit or ordering semantics.
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 specific verb ('List') and resource ('recent sandbox file writes') and clarifies the record fields with 'who wrote what, and when'. It implicitly separates itself from write_file/read_file by being a history view, though it never names sibling tools outright.
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?
'Use before undoing a write you did not intend to make' gives a concrete triggering situation that points the agent toward undo_write as the follow-up action. No explicit when-not conditions or named alternatives, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_bot_statusA
Return the bot's current stats (hunger/happiness/energy/health), mood and age in days.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
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. "Return" implies a read, but it never states explicitly that the call is side-effect free, nor whether reading advances time or triggers stat decay — plausible concerns for a bot simulator.
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?
A single sentence, front-loaded with the action and then the exact return contents, with zero filler.
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?
There is no output schema, so the description must describe the return value — and it does, naming every stat field, the mood and the age in days. It stops short of describing value ranges or whether stats decay over time, which would make it fully self-sufficient.
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 has zero properties, so there are no parameter semantics to explain; the baseline of 4 applies. The description correctly implies no input is needed.
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?
Specific verb ("Return") plus resource ("the bot's current stats") with the returned fields enumerated (hunger/happiness/energy/health, mood, age). It is functionally separable from the mutating siblings (feed_bot, play_with_bot, rest_bot), though it never names them to make the distinction explicit.
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?
Usage is only implied: an agent can infer this is the read-side companion to feed/play/rest, but the description never says when to call it (e.g., before feeding to check hunger) or that the mutators are the alternative for changing stats.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
give_treatA
Give Pixel a treat from the inventory. Costs one treat (earned by feeding, playing and resting); boosts happiness, health and energy a little.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose the two key behaviors: it consumes one treat from inventory and it boosts happiness, health and energy. It does not say what happens when the inventory is empty, whether the call fails or is a no-op, or how large the boost is, which matters for a state-mutating tool with zero annotation coverage.
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, both of which earn their place: one states the action and its cost, the other states the effect. The cost, the most decision-relevant fact, is front-loaded before the benefit.
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 zero-parameter, no-output-schema tool, the description covers the essentials: what it does, what it costs, and what it changes. The only meaningful gap is the failure mode when no treat is available, which an agent would want to know before attempting the call.
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 tool takes zero parameters, so there is nothing for the description to disambiguate. The baseline for a parameterless tool applies, and the description doesn't waste words inventing parameter detail.
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 and resource ('Give Pixel a treat from the inventory') and implies a distinct mechanic from feed_bot, play_with_bot and rest_bot by consuming a stored treat. It could have explicitly named how it differs from feed_bot, but the resource is unambiguous enough to separate it from its 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 cost sentence ('earned by feeding, playing and resting') implies the precondition for using this tool, so usage is inferable rather than stated. There is no explicit guidance on when to prefer this over feed_bot or play_with_bot, nor any stated exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_dirA
List a directory inside the sandbox. 'path' defaults to the sandbox root; use it to browse files before reading or writing.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Directory relative to the sandbox root (default '.') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It discloses the sandbox scope and default root path, but does not describe return format, ordering, hidden-file behavior, or error cases.
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 concise sentences with the purpose front-loaded and no wasted language. The default path and usage hint are both useful and compact.
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, non-destructive directory listing tool, the description is nearly complete. The main omission is return shape, but the tool is simple enough that this is a minor gap.
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%, and the schema already documents 'path' with a default of '.'. The description confirms the sandbox-root default but adds no new syntax or format details 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?
States a specific verb and resource ('List a directory') and scopes it to the sandbox, which clearly distinguishes browsing from read_file/write_file 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?
Provides clear usage context: browse files before reading or writing. It does not name explicit alternatives or exclusions, but the guidance is sufficient for a simple listing tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
play_with_botA
Play with the bot. Raises happiness, costs energy, adds a little hunger. Fails if the bot is exhausted or sick.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does disclose the mutation's side effects on happiness, energy, and hunger plus a failure condition — meaningful behavioral context an agent cannot get from the empty schema. It does not say whether a failed play leaves state untouched or what the error looks like, which keeps it below a 5.
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 short sentences with no filler; the action and its effects come first, and the failure condition is placed last where it belongs. Every clause adds information.
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 zero-parameter tool with no output schema, the description supplies what the agent needs: what changes in state and when the call fails. Magnitudes (how much energy/happiness) and post-failure state are unspecified, which is a minor but real gap for an agent reasoning about resource management.
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 tool takes zero parameters, so the baseline is 4 and there is nothing the description needs to disambiguate. It correctly implies a parameterless, single-target action.
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?
"Play with the bot" states a specific verb and resource, and the follow-up sentence enumerates the concrete state effects (happiness up, energy down, hunger up), which distinctively separates it from feed_bot, rest_bot, and give_treat. It stops short of naming those siblings explicitly, but the effect profile makes the distinction inferable.
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?
"Fails if the bot is exhausted or sick" gives a usable precondition for calling it, and the energy cost implies a budget consideration. However, there is no explicit guidance on when to choose play over feed_bot/give_treat, nor any suggestion to check get_bot_status first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_fileA
Read a UTF-8 text file inside the sandbox directory. 'path' is relative to the sandbox root (e.g. 'notes/todo.md'). Absolute paths and '..' are rejected.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | File path relative to the sandbox root |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the behavioral load, and it does disclose key constraints: UTF-8 only, sandbox-scoped, absolute paths and '..' rejected. It omits error behavior for missing files, size/encoding failure modes, and return shape, which matters given there is no output schema.
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, zero waste, with the core action and the hard constraint both front-loaded. Nothing could be cut without losing information.
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-required-parameter read tool with full schema coverage, this covers scope, encoding, and path rules adequately. The remaining gap is failure behavior (nonexistent file, permission, non-UTF-8 content), which is not addressed anywhere.
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 already 100%, so the baseline is 3; the description goes further by adding an example path format ('notes/todo.md') and explicitly stating that absolute paths and '..' are rejected, which is real meaning beyond the schema's 'relative to the sandbox root'.
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 specific verb (read) and resource (UTF-8 text file inside the sandbox directory), which cleanly separates it from write_file/list_dir in the sibling set. It stops short of explicitly naming or contrasting a sibling, so it sits just below the top band.
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?
Usage is only implied by the verb — nothing tells the agent when to prefer this over list_dir (to discover paths) or file_history/undo_write. The path constraints are stated, but there is no explicit when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rest_botA
Let Pixel rest/recharge. Restores energy, small hunger cost. Use when the bot is tired.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does disclose the key tradeoff: energy is restored at a small hunger cost, which changes agent strategy (don't spam rest). It omits cooldowns, time duration, or whether the action is reversible, but the core side effect is surfaced.
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 compact sentences: purpose and effects first, trigger condition second. No filler, nothing to trim.
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 no-param state-changing action with no annotations or output schema, the description covers what it does, its side effect, and when to call it. Only the result format / post-rest state is unstated, which is minor.
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?
Zero parameters, so there is nothing to disambiguate; the description correctly spends no words on inputs and none are needed.
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 specific verb+resource ('Let Pixel rest/recharge') and immediately names the concrete effects (restores energy, small hunger cost). It clearly contrasts with feed_bot/give_treat by being about energy rather than hunger, though it does not explicitly call out the sibling distinction.
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?
'Use when the bot is tired' gives an unambiguous activation condition. It stops short of naming when NOT to use it or pointing to alternatives (e.g., get_bot_status to check energy first), so it is clear context without exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
undo_writeA
Undo a sandbox file write: restores the previous contents, or deletes the file if the write created it. Without 'path' undoes the most recent write.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | File to revert (relative to the sandbox root); omit for the last write |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and it does disclose the key mutation outcome — that the file may be deleted if the write created it. Missing are failure modes: what happens if the file changed after the write, whether repeated undos walk back further, and whether the operation errors or no-ops when nothing is undoable.
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?
A single tight sentence with the primary action front-loaded and the default-behavior clause second. No wasted text.
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 no output schema, the description covers both behavioral branches (restore vs delete) and the no-argument default. It would be complete with a note on the response or on error conditions when there is nothing to undo.
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% and the schema already documents that omitting path targets the last write, so the description's restatement adds little. A baseline 3 is appropriate since the schema does the parameter work.
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 specific verb (undo) and resource (a sandbox file write) and spells out both possible outcomes: restoring previous contents or deleting a file the write created. It is clearly distinguishable from read_file/write_file, though it does not address the closest alternative, file_history, for inspecting prior versions.
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 phrase "Without 'path' undoes the most recent write" explains the default argument behavior, which implies when the tool applies. There is no explicit guidance on when to prefer undo over file_history for restoring state, nor any note on preconditions such as whether the write must still be the latest change.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
write_fileA
Create or overwrite a UTF-8 text file inside the sandbox (e.g. write code). 'path' is relative to the sandbox root; absolute paths and '..' are rejected.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | File path relative to the sandbox root | |
| content | Yes | Full new contents of the file |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description does useful work by disclosing the overwrite-destroys-existing-content semantics and the path validation rule that rejects absolute paths and '..'. It leaves other behavioral gaps unaddressed: whether parent directories are created, whether writes are reversible via undo_write, size limits, and what (if anything) is returned.
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 tight sentences with zero filler. The core operation is front-loaded, and the path constraint follows immediately as supporting detail.
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 simple two-parameter write tool with no output schema, the description covers what is written, encoding, and path rules. Missing only secondary details an agent might want: return value, directory auto-creation, and interaction with the undo_write sibling.
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 both parameters are already documented. The description adds meaning beyond the schema by stating the hard constraint that absolute paths and '..' segments are rejected, which is actionable validation info the schema does not carry.
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 specific verb pair and resource ('Create or overwrite a UTF-8 text file inside the sandbox') with a concrete example of intended use (write code). It is easy to separate from siblings like read_file, undo_write, and file_history.
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?
'Create or overwrite' plus the sandbox-pathing note gives clear context for when this applies versus reading or listing files. It stops short of explicitly naming alternatives such as undo_write for reverting an overwrite or file_history for inspecting prior versions.
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.
10 tool updates
v1.0.0- First observed
feed_bot - First observed
file_history - First observed
get_bot_status - First observed
give_treat - First observed
list_dir - First observed
play_with_bot - First observed
read_file - First observed
rest_bot - First observed
undo_write - First observed
write_file
TDQS
Scored across 10 tools
The set splits into two clear clusters: bot-care tools and sandbox-file tools. Within each cluster the operations are distinct, though feed_bot and give_treat have overlapping effects and could occasionally be confused.
Most names are verb_noun, but conventions vary: feed_bot/play_with_bot/rest_bot use a bot suffix, file tools use read_file/write_file/list_dir, and file_history/undo_write break the pattern. Still readable, but not a single predictable scheme.
Ten tools is well-scoped for a small virtual-pet server with sandboxed file support. Each tool has a distinct role and the count does not feel bloated or thin.
Bot care covers feeding, playing, resting, status, and treats, but lacks inventory inspection or healing/medicine operations. File handling covers read, write, list, history, and undo, but misses explicit delete, move, copy, or search operations.
Maintenance
Related MCP Connectors
Remote MCP server exposing your Node Command fleet (files, shell, processes, browser) to AI hosts.
Guard wraps stdio MCP servers: risky calls wait for a person; no answer, no run. Remote: cooperative
Remote MCP server for supportsheep: run AI interviews and manage support content for your blog.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceStdio MCP server for sandboxed file access — read files, search content, safely edit with checksums, and manage file structure.98 npmISC
- AlicenseAqualityDmaintenanceExposes a verified tool registry (calculator, sandboxed file read, web fetch) over MCP stdio, enabling any MCP-capable client to reuse the same tools from the inspectable ReAct loop.3MIT
- AlicenseNot gradedqualityAmaintenanceA small filesystem MCP server that reads and writes files under one confined root over stdio, with paginated tools and strict change-detection. It enables safe, deterministic file access for agentic runtimes and MCP clients.21 npmMIT
- AlicenseAqualityBmaintenanceEnables MCP-capable AI clients to control a local computer over stdio with filesystem operations, ripgrep search, shell command execution, and persistent process sessions.14MIT