nagi-ledger
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| NAGI_GOAL_FILE | No | Path to the goal state file. Default: ~/.nagi/goal.json | ~/.nagi/goal.json |
| NAGI_LEDGER_DB | No | Path to the SQLite ledger database. Default: ~/.nagi/ledger.db | ~/.nagi/ledger.db |
| NAGI_BRIEF_REPOS | No | Repositories to include in session brief. Default: the current git repository, if any | |
| NAGI_GOAL_HISTORY | No | Path to the goal history file. Default: ~/.nagi/goal_history.jsonl | ~/.nagi/goal_history.jsonl |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| ledger_log_actionA | Record a single autonomous action taken during a self-directed dev loop. Use this to log any action the agent takes on its own initiative, tagged with a tier indicating how consequential it was. Args: tier (int): Impact tier. Must be 0 (routine/info), 1 (notable), or 2 (high-impact, e.g. irreversible or user-facing). category (str): Short category label, e.g. "refactor", "deploy", "file_write", "dependency_change". Must be non-empty. description (str): Human-readable description of what was done. Must be non-empty. project (Optional[str]): Project/repo name this action belongs to. Returns: dict: {"id": int} — the new action's row id. Errors: Raises ValueError if tier is not in {0,1,2} or category/description are empty, with a message explaining the valid values. |
| ledger_log_dispatchA | Record a subagent dispatch (e.g. via the Agent tool) for audit and retry tracking. Call this every time a subagent is dispatched for a task, so retries of the same task can be counted and budget-limited via ledger_task_status. Args: task (str): Stable identifier/description of the task being dispatched. Use the SAME string across retries of the same underlying task so retry counting works. agent_type (str): Subagent type used (e.g. "fork", "general-purpose"). model (str): Model used for the dispatch (e.g. "sonnet", "opus"). brief_summary (str): One-line summary of what the dispatch was asked to do. Returns: dict: {"id": int, "retry_count": int} where retry_count is the number of PRIOR dispatches recorded under the same task (0 for the first). Errors: Raises ValueError if any field is empty. |
| ledger_log_verdictA | Attach a verification verdict to a previously logged dispatch. Use this after independently verifying a subagent's work, to record whether its claims were confirmed, refuted, or partially true. Args: dispatch_id (int): The id returned by ledger_log_dispatch for the dispatch being verified. verdict (str): One of "CONFIRMED", "REFUTED", "PARTIAL". notes (Optional[str]): Optional free-text notes on the verification. Returns: dict: {"ok": true, "task": str} — the task string of the dispatch the verdict was attached to. Errors: Raises ValueError with an actionable message if dispatch_id does not exist, or if verdict is not one of the three allowed values. |
| ledger_task_statusA | Look up dispatch/retry/verdict status for a given task string. Use this BEFORE dispatching a subagent to check whether the same task has already been retried too many times (budget enforcement). Args: task (str): The exact task string used with ledger_log_dispatch. Returns: dict: { "dispatch_count": int, # total dispatches recorded for this task "retry_count": int, # dispatch_count - 1, floored at 0 "last_verdict": str | None, # verdict of most recent dispatch, or null "over_retry_limit": bool # true when retry_count >= 2 } |
| ledger_session_reportA | Generate a markdown report of actions and dispatches from the last N hours. Actions are grouped by category; dispatches are listed with their resolved verdict or PENDING if not yet verified. Useful for a human-readable audit summary of recent autonomous activity. Args: since_hours (int): How many hours back to include. Defaults to 24. Returns: str: Markdown report, or a short "no entries" message if nothing was logged in the window. |
| ledger_statsA | Aggregate statistics over actions and dispatches from the last N days. Args: days (int): How many days back to include. Defaults to 7. Returns: dict: { "actions_by_tier": {"0": int, "1": int, "2": int}, "actions_by_category": {category: int, ...}, "dispatch_count": int, "verdicts": {"CONFIRMED": int, "REFUTED": int, "PARTIAL": int, "PENDING": int} } |
| ledger_log_approachA | Record the outcome of an approach tried (or considered) for a task. Record every failed approach IMMEDIATELY after it fails, and every deliberate NO-GO decision, so future attempts (by you or another agent) skip them instead of re-discovering the same dead end. Args: task (str): Stable identifier/description of the task. Use the SAME string across approaches to the same underlying task so ledger_check_approaches can find them. approach (str): Short description of the specific approach tried or considered. Must be non-empty. outcome (str): One of "DEAD_END" (tried and failed), "NO_GO" (decided against without trying), or "WORKS" (confirmed working). reason (str): Why the approach failed, was rejected, or worked. Must be non-empty. Returns: dict: {"id": int} — the new approach record's row id. Errors: Raises ValueError if task/approach/reason are empty, or outcome is not one of DEAD_END/NO_GO/WORKS, with a message naming the valid values. |
| ledger_check_approachesA | Call this BEFORE retrying or re-planning a task. Never re-attempt an approach listed in dead_ends or no_gos unless you have new information that invalidates its reason. Args: task (str): The exact task string used with ledger_log_approach. Returns: dict: { "task": str, "dead_ends": [{"approach": str, "reason": str, "ts": str}, ...], "no_gos": [{"approach": str, "reason": str, "ts": str}, ...], "works": [{"approach": str, "reason": str, "ts": str}, ...], "total": int } Each list is ordered newest first. Empty lists when nothing has been recorded for the task. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/watasisaikou/nagi-ledger'
If you have feedback or need assistance with the MCP directory API, please join our Discord server