An MCP server that provides shell context awareness and command suggestions using AI, integrating with bash history, environment variables, and OS information
This server presents 4 read-only CLI tools with mostly complete schemas and descriptions, but has moderate quality gaps. All tools have input schemas (though some are empty {}) and descriptions, meeting baseline requirements. Naming is clear and action-oriented (get_os_info, ls, history, env). Descriptions range from adequate to good (66-280 chars), providing context but lacking explicit WHEN/WHY guidance. Parameters are typed but lack descriptions in some cases (notably 'path' in ls, 'n' in history are documented in docstrings but not visible in registered schema annotations). Output schemas are not explicitly documented, only inferred from code behavior. Error handling is minimal; no recovery guidance is provided. All tools are read-only (low risk) and properly decorated with caching, showing operational awareness. The server uses FastMCP with HTTP transport, which is current. Main deficits: output schemas not formalized, parameter descriptions not visible in schemas, no error recovery hints, and minimal exploration of composition patterns.
Retrieves a copy of all current environment variables. This function accesses the environment variables of the current process and returns them as a standard Python dictionary. By returning a copy, it ensures that any modifications made to the returned dictionary do not affect the live process environment.
Return what OS name and version are we running on.
Fetches the last n valid commands from the user's shell history. This function locates the history file by first checking the `$HISTFILE` environment variable. If the variable is not set, it defaults to `~/.bash_history`. It then reads the file, ignoring any comments (lines starting with '#') and blank lines, to return a list of the n most recent valid commands in chronological order.
Lists the files and directories directly within a given path. This function takes a path to a directory and returns a list of pathlib.Path objects, each representing a file or subdirectory inside it. It does not recurse into subdirectories.
Output schemas are not formally documented. LLMs cannot know what fields to expect from tool returns (e.g., does get_os_info return a string or an object? Does ls return Path objects or strings?). This forces LLMs to guess output structure and makes composition unreliable.
Parameter descriptions are embedded in docstrings but not surfaced in the registered tool schema. The 'path' parameter in ls() has a good docstring explanation ('The path to the directory to list...'), but this is not visible in the Input schema shown: {"path":{"type":"string","description":"..."}}. FastMCP may extract these, but it is not verifiable from the source.
No error handling or recovery guidance. None of the tools document what happens if a path is invalid (ls), the history file is missing (history), or the system call fails. LLMs receive no actionable error messages and cannot self-correct or retry intelligently.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 63 | 2026-07-28+ | v2 |
| 2026-03-09 | D | 50 | - | v1 |
Parameter 'n' in history() lacks a bounds constraint or description. No guidance on minimum/maximum valid values. An LLM could pass n=1000000, causing performance issues or hanging the tool.
The ls() tool description claims it 'does not recurse' but does not explain what happens if the path is not a directory, doesn't exist, or is a symlink. Edge cases are not addressed.