Skip to main content
Glama
crunchtools

mcp-metsuke-crunchtools

Official
by crunchtools

mcp-metsuke-crunchtools

Stateful reports catalog MCP server. Metsuke (目付 — the Sengoku intelligence officer who gathered field reports and compiled them for the daimyō) is the durable, cross-agent home for report definitions and their gathered outputs.

An autonomous gatherer reads a definition, sweeps the configured sources, and writes findings — each carrying its own source URL. A compiler later reads the freshest output to draft a fully cited report. This replaces ad-hoc, run-scoped research caches with a real, queryable store.

Features

  • Definitions + outputs — separate what-to-gather from what-was-gathered

  • Built-in scheduler — Metsuke fires each definition's gather when its cron schedule comes due, or on demand via trigger_report — no external timer

  • Run lifecycle — every fire opens a durable run with a second-granularity run_id: a provisional row is recorded before the callback (a fire is never lost), and a per-report concurrency lock keeps two gathers from racing

  • Cited findings — payloads carry per-finding source URLs for one-click checking

  • Re-homeable gathering — owner_agent makes the gatherer identity data, not code

  • Local-first — plain SQLite (WAL), no external services, no per-seat fees

  • Three transports — stdio, SSE, streamable-http

Related MCP server: Argon Memory

Install

uvx mcp-metsuke-crunchtools

pip

pip install mcp-metsuke-crunchtools

Container

podman run --rm -v ~/.local/share/mcp-metsuke:/data:Z \
  quay.io/crunchtools/mcp-metsuke \
  --transport streamable-http --host 0.0.0.0 --port 8009

Claude Code Integration

claude mcp add mcp-metsuke-crunchtools -- uvx mcp-metsuke-crunchtools

Tools (10)

Definitions (4)

Tool

Description

list_reports

List all report definitions in the catalog, each with its next scheduled fire time.

get_spec

Return the gather prompt + source config for one definition.

upsert_definition

Create or update a definition (name, prompt, owner, cron schedule, timezone, sources).

trigger_report

Fire a report gather right now, without waiting for its schedule. For a swept definition it returns at once with dispatched: "after_sweep"; the sweep and the callback follow in the background.

Outputs (6)

Tool

Description

save_output

Complete a run by persisting its gathered findings (pass the run_id from the fire callback; each finding ideally carrying a source URL).

get_output

Read the freshest output (or a specific day's) for compiling a report.

list_outputs

Browse the run history — metadata + finding_count per saved gather, no payloads.

delete_output

Delete one saved output by id.

prune_outputs

Bulk-prune a report's outputs — keep the N newest, or drop those before a date.

get_sweep

Read a swept run's pre-gathered records: the index, or one page of one section.

Environment Variables

Variable

Default

Description

METSUKE_DB

~/.local/share/mcp-metsuke/metsuke.db

SQLite database path

METSUKE_DB_FILE

(none)

Path whose contents override METSUKE_DB (container secret-file convention)

TRENTINA_ALERT_URL

(none)

Base URL of the Trentina gateway; the scheduler POSTs gather callbacks to <url>/alert with the token as Authorization: Bearer

METSUKE_ALERT_TOKEN

(none)

Alert token identifying the reports profile; enables the scheduler when set with TRENTINA_ALERT_URL

METSUKE_ALERT_TOKEN_FILE

(none)

Path whose contents override METSUKE_ALERT_TOKEN (container secret-file convention)

METSUKE_PULL_OWNERS

(none)

Comma-separated owners that collect their own runs: their reports are opened and swept on schedule but get no callback. Also enables the scheduler

TRENTINA_GATEWAY_URL

(none)

Trentina gateway MCP endpoint for the sweep profile, e.g. http://mcp-trentina:8019/gateway/metsuke-sweep/mcp. Plain HTTP is accepted only for internal hosts (single-label service names, localhost, private IPs); anything else must be HTTPS

METSUKE_SWEEP_TOKEN

(none)

Bearer token for that profile; METSUKE_SWEEP_TOKEN_FILE overrides it

METSUKE_SWEEP_TIMEOUT_SECONDS

1200

Upper bound on one run's sweep

METSUKE_SCHEDULER_POLL_SECONDS

60

How often the scheduler checks for due reports

METSUKE_SCHEDULER_ENABLED

(auto)

Force the scheduler on/off; defaults to on when the callback is configured

METSUKE_RUN_LOCK_TTL_SECONDS

1800

How long an in-flight run holds the per-report lock before it is expired (self-heals a dead gatherer)

The scheduler runs only under the sse and streamable-http transports (the long-lived production processes), never under stdio.

Data Model

  • report_definitions — name (PK), gather_prompt, owner_agent, schedule (cron), timezone (IANA), source_config (JSON), last_fired_at, updated_at

  • report_outputs (one row per run) — id, report_name (FK), run_id (second-granularity identity), trigger (scheduled/manual/direct), gathered_at, finished_at, window_start/window_end, payload (JSON findings with source URLs), status (gathering/ready/compiled/failed), gatherer_run_ref, detail. A partial unique index on (report_name) WHERE status='gathering' is the per-report concurrency lock.

MCP Registry

io.github.crunchtools/metsuke

License

AGPL-3.0-or-later

Sweeps

A definition can opt into a deterministic pre-gather by adding sweep to its source_config:

{"sweep": {"timezone": "America/New_York", "window_hour": 6, "steps": [
  {"section": "slack", "collector": "slack_waiting",
   "options": {"user_id": "U9VN3S1ST", "handle": "smccarty"}},
  {"section": "work_email", "collector": "gmail_waiting",
   "options": {"backend": "gw-work", "account": "smccarty@redhat.com"}},
  {"section": "calendar", "collector": "calendar_day",
   "options": {"backend": "gw-work", "account": "smccarty@redhat.com"}},
  {"section": "rss", "collector": "feed_entries",
   "options": {"categories": {"1": 20, "5": 20}}}]}}

On fire, Metsuke runs each step in order through the Trentina gateway (as its own read-only profile), stores the results on the run, then dispatches the callback with sweep_status. The gatherer reads records with get_sweep instead of calling the sources, so the gathering LLM only selects, phrases and delivers. A failing step is recorded and the sweep continues. Results Trentina flags are stored as metadata only, with their text withheld.

Collector

What it produces

slack_waiting

Direct asks over a lookback: an @-mention, or a DM message that reads as a question or request (DM chatter and Slack system notices are not asks). Threads are read as threads; DMs and top-level channel mentions are read from channel history (one conversation per channel). Each is read for up to three pages (longer or partly unreadable ones are marked unverified). An ask the user replied to or reacted to is answered and dropped; the rest are waiting, with in_window separating new asks from still-open ones

gmail_waiting

Inbox threads in the window (or lookback_days) where the backend's ownership analysis says the ball is in the user's court; automated mail, bare calendar notices and threads newer than min_age_hours dropped, invitations kept, priority_senders marked priority

calendar_day

The report day's meetings, pending invites over a lookahead, and hard overlaps

feed_entries

Recent entries per feed category (read or unread), with a longer window after a weekend

jira_issues

Issues matching each named JQL query, with {since} substituted by the window start. Each record carries the key, browse link, status, components and age; where the description is a web intake form, its Field: value pairs are parsed into contact and a capped detail line. A failing query is recorded and the rest still run

Collector options

Every step is {"section": "<name>", "collector": "<collector>", "options": {...}}. Section names are [a-z0-9_-], unique, up to 12 steps. Top-level timezone (IANA, default America/New_York) and window_hour (0-23, default 6) set the window: from that hour on the previous weekday until the run.

Collector

Option

Required

Default

Bounds

slack_waiting

user_id

yes

2-32 chars

handle

yes

1-64 chars

backend

slack

≤64 chars

self_label

you

≤64 chars

first_name

none

1-64 chars; in group DMs and channels, a question or request that addresses the user by this name is an ask

lookback_days

7

1-30

max_conversations

40

1-100

workspace_url

https://redhat-internal.slack.com

≤200 chars

gmail_waiting

backend

yes

e.g. gw-work, gw-personal

account

yes

the mailbox address

query_extra

""

≤500 chars, appended to in:inbox after:<window>

max_threads

60

1-200

body_chars

1200

0-4000 (0 = no body)

link_template

Gmail #all/{thread_id}

≤200 chars, or null

lookback_days

report window

1-30, search the last N days instead

min_age_hours

0

0-168, drop threads active more recently

priority_senders

[]

≤20 From-header substrings (1-100 chars, case-insensitive)

calendar_day

backend

yes

account

yes

timezone

America/New_York

IANA zone

lookahead_days

3

0-14 (pending invites)

feed_entries

categories

yes

1-12 entries of "<id>": <limit>, id ≤9 digits, limit 1-100

backend

feeds

since_days

1

1-30

since_days_after_weekend

3

1-30 (Mondays and weekend runs)

jira_issues

queries

yes

1-6 of {"label", "jql", "limit"}: label [a-z0-9_-] ≤32, jql ≤600 chars ({since} → window start as YYYY-MM-DD HH:mm), limit 1-50

backend

jira

≤64 chars; needs jira_search allowed

browse_url

https://redhat.atlassian.net/browse/

≤200 chars, prefixed to the issue key

detail_chars

800

0-2000 (0 = no form detail line)

Collectors are code in sweep/collectors.py, not configuration: a definition can only pick and parameterize them. A bad spec is rejected at upsert_definition time.

Available Tools

10 tools
delete_output_toolDelete Output ToolA

Delete one saved report output by id.

Returns the deleted output's metadata (with deleted=True). Find ids with list_outputs_tool. Raises if no output carries that id.

NameRequiredDescriptionDefault
output_idYesThe id of the output to delete (from list_outputs_tool)

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

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 does disclose the error case ('raises if no output carries that id') and that the response echoes the deleted object with deleted=True, but for a destructive operation it says nothing about irreversibility, permissions, or whether deletion is soft or hard.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the action and scope, then return behavior, then id discovery, then the failure case. No filler and nothing buried.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the return-value sentence is supplementary rather than required, and the id source and error behavior are covered. The remaining gap is behavioral: nothing tells the agent whether a delete is recoverable, which matters for an irreversible mutation with no annotations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter exists and schema description coverage is 100%, with the schema already noting the id comes from list_outputs_tool. The description repeats that source but adds no new syntax, format, or range meaning, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (delete) and resource (saved report output) with explicit scope ('one ... by id'), which cleanly separates it from the bulk-deleting sibling prune_outputs_tool. It also names list_outputs_tool as the id source, so an agent can distinguish it from the get/save output tools without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear operational context: ids come from list_outputs_tool, and the tool deletes exactly one output. However it never states when to prefer this over the sibling prune_outputs_tool, nor any prerequisite or exclusion, so the alternative-selection guidance is incomplete.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_output_toolGet Output ToolA
Read-only

Read a gathered report output for compiling a report.

Returns the most recent output by default, or the latest output gathered on a specific date when gathered_date is given.

NameRequiredDescriptionDefault
nameYesThe report definition name
gathered_dateNoOptional YYYY-MM-DD to fetch that day's output instead

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint=true already tells the agent this is a safe read. The description adds genuinely useful behavior: default returns the most recent output, and gathered_date scopes to a specific day. It stops short of describing error behavior when no output exists or pagination/format details, but with annotations covering the safety profile this is adequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the core action and then the retrieval-mode distinction. No filler, though 'for compiling a report' is slightly redundant with the noun 'report output'.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and both parameters are fully documented in the schema. The only gap is guidance on alternatives among the many sibling output/report tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and both parameters carry their own descriptions, including the YYYY-MM-DD format hint. The description restates the date-filtering semantics but adds no syntax or edge-case meaning beyond the schema, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (read) and resource (gathered report output) clearly, and the report-definition name parameter anchors it. It distinguishes reasonably from save_output_tool and list_outputs_tool, though it doesn't explicitly name siblings or contrast scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage ('for compiling a report') and clarifies default vs. date-specific retrieval, but never says when to pick this over list_outputs_tool or get_spec_tool. No exclusions or prerequisites are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_spec_toolGet Spec ToolA
Read-only

Return the gather spec (prompt + source config) for a report definition.

This is what the autonomous gatherer calls on callback to learn what to collect for the named report.

NameRequiredDescriptionDefault
nameYesThe report definition name (e.g. "core-platform-status")

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so safety is covered. The description contributes useful context that the payload is a prompt plus source config consumed by an automated gatherer on callback, but says nothing about staleness, permissions, or failure behavior for a missing report name.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with the primary action front-loaded and no filler; every clause (what is returned, who calls it and when) earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be spelled out, and the description explains the tool's role in the callback workflow. It is nearly complete for a one-param read tool, with only the lack of sibling differentiation as a residual gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single 'name' parameter is documented with an example, so the schema carries the burden. The description only reinforces that the spec is keyed by the named report, adding no format or naming-convention detail beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Return the gather spec') and unpacks the return value into its two components (prompt + source config), which is more than the name conveys. It does not explicitly differentiate itself from lookalike getters such as get_sweep_tool or get_output_tool, so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The second sentence gives a real usage context: it is what the autonomous gatherer calls on callback for a named report. However, it offers no when-not guidance and never contrasts itself with the sibling getters, leaving the agent to infer the boundary.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_sweep_toolGet Sweep ToolA
Read-only

Read the pre-gathered sweep for a run.

Swept reports are gathered by Metsuke before the gatherer is called: fixed source calls, reply-state checks and noise filters run in code, and the results are stored on the run as sections of compact records. Call with no section for the index (window, overall status, per-section record counts and errors), then page through each section you need.

NameRequiredDescriptionDefault
pageNo1-based page of records within the section
run_idNoThe run from the callback (preferred)
sectionNoA section name from the index; omit for the index itself
page_sizeNoRecords per page (max 50)
report_nameNoAlternatively, use this report's newest swept run

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint, so the description usefully adds that sweeps are pre-gathered before the gatherer runs and that data is stored as sections of compact records, including what the index contains. It omits auth/permission needs and any rate or size caveats beyond the schema's page_size max.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core action in the first sentence and follows with just enough mechanism and call-order detail. The gatherer/Metsuke framing is somewhat jargon-heavy but earns its place by explaining where the data comes from.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be documented, yet the description still tells the agent what the index yields and how to page. Read-only, no required params, and 100% schema coverage make this nearly self-sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 reinforces the section/index relationship and pagination flow, but the run_id-vs-report_name selection and page defaults are left to the schema, adding little beyond it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: read the pre-gathered sweep for a run. The concept is clearly distinct from the listed siblings (output/report/definition tools), though it never explicitly names an alternative to contrast against, so it falls just short of 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete call-order guidance: call with no section to get the index, then page through each section needed. That is clear usage context, but there are no explicit when-not conditions or named alternatives for choosing between run_id and report_name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_outputs_toolList Outputs ToolA
Read-only

List saved report outputs (the run history), newest first.

Returns one lightweight row per saved gather — id, report_name, gathered_at, reporting window, status, and a finding_count — but NOT the payloads, so the full history stays cheap to browse. Use get_output_tool to pull one run's findings, and delete_output_tool / prune_outputs_tool to prune.

NameRequiredDescriptionDefault
limitNoMax rows to return, newest first (default 50, max 500)
report_nameNoOptional report to filter to; None lists across all reports

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so safety is covered. The description goes further by describing the shape of results (one lightweight row per gather: id, report_name, gathered_at, window, status, finding_count) and, importantly, that payloads are NOT returned, which explains why the call is cheap. It does not discuss limits/pagination behavior beyond the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with the core action and ordering, followed by the return shape and the routing alternatives. Every sentence earns its place with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema exists so return fields need no full enumeration, and annotations cover the read-only profile. The description completes the picture by explaining payload omission and sibling routing, leaving nothing an agent needs to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with both limit and report_name fully documented including defaults and max. The description adds no parameter detail, so the schema does the heavy lifting — baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List) and resource (saved report outputs / run history) plus ordering (newest first). It clearly distinguishes itself from get_output_tool (single run) and delete/prune_outputs_tool (pruning), so an agent can route 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the alternatives and the conditions that select them: use get_output_tool to pull one run's findings, delete_output_tool/prune_outputs_tool to prune. The browse-vs-fetch tradeoff is spelled out rather than implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_reports_toolList Reports ToolA
Read-only

List all report definitions in the catalog.

Returns each definition with its gather prompt, owner agent, schedule, source config, and last-updated time.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint=true already tells the agent this is a safe read. The description adds the returned field set, which is mildly useful, but discloses nothing about pagination, ordering, rate limits, or result size. With annotations covering the safety profile, a 3 is appropriate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the core action and followed by the return detail. No filler sentences, though the return-field enumeration is somewhat redundant given an output schema exists.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter list tool with readOnlyHint and an output schema already present, the description covers what an agent needs to select and call it. The only minor gap is absent guidance on empty results or result-size behavior, which the output schema does not address.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the schema baseline is 4. Description adds no param info because there is none to add, and that is correct here.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List all report definitions in the catalog') and enumerates the returned fields. It is clearly distinguishable from siblings like list_outputs_tool or get_spec_tool, though it never explicitly names that distinction.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The scoping phrase 'all report definitions in the catalog' implies a browse/list use case, but there is no explicit when-to-use, when-not-to-use, or alternative routing guidance versus siblings such as list_outputs_tool or get_spec_tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

prune_outputs_toolPrune Outputs ToolA

Bulk-prune a report's saved outputs. Returns the count and ids deleted.

Give exactly one criterion: keep_last retains the N most recent outputs and deletes the rest (keep_last=0 deletes them all); before_date deletes every output gathered strictly before that date.

NameRequiredDescriptionDefault
keep_lastNoRetain this many newest outputs, delete older ones
before_dateNoDelete outputs gathered before this date (YYYY-MM-DD)
report_nameYesThe report whose outputs to prune

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It discloses that outputs are deleted, that keep_last=0 deletes all, and that it returns count and ids, but it does not state whether deletion is irreversible or what permissions are required.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short and front-loaded: purpose and return value first, then criterion semantics. Every sentence adds useful information without repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The schema fully documents parameters, an output schema exists, and the description explains the pruning criteria and return summary. The main remaining gap is behavioral safety context such as irreversibility and permissions, which matters because no annotations are provided.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds important meaning beyond the schema. It clarifies the exactly-one-criterion constraint and explains the special keep_last=0 case and the strict 'before' behavior of before_date.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: bulk-prune a report's saved outputs. The word 'bulk' helps distinguish it from a single-output deletion tool, though it does not explicitly name delete_output_tool as the alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly instructs that exactly one criterion must be given and explains how to choose between keep_last and before_date. It does not explicitly compare this tool with delete_output_tool or list_outputs_tool, but the usage context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

save_output_toolSave Output ToolA

Persist a gathered report output, completing the run that opened it.

The gatherer writes findings here after sweeping the sources. Each finding in payload should carry its own source URL so the compiler can cite it. Pass the run_id Metsuke handed you in the fire callback so this completes that exact in-flight run (one row per fire). Omit run_id for an ad-hoc direct save; Metsuke stamps a fresh run identity either way.

NameRequiredDescriptionDefault
run_idNoThe run to complete (from the fire callback); None = direct save
statusNoOne of "gathering", "ready", "compiled", "failed" (default: "ready")ready
payloadYesList of findings. Each needs a non-empty summary and should carry its source_url; see Finding for the other allowed keys
window_endNoEnd of the reporting window (ISO date/datetime)
report_nameYesThe report definition this output belongs to
window_startNoStart of the reporting window (ISO date/datetime)
gatherer_run_refNoOpaque reference to the gatherer run that produced this

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are supplied, so the description carries the full behavioral burden, and it discharges most of it: it discloses run-completion semantics, the one-row-per-fire cardinality, and that Metsuke stamps a run identity even on ad-hoc saves. It does not cover failure behavior or what happens when run_id refers to an already-completed run.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, front-loaded with the primary effect (persist and complete the run), then the payload convention, then the run_id branch. Every sentence adds operational information; nothing is padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no annotations, the description covers the essentials, and an output schema exists so return values need no explanation. The main residual gap is error/edge-case behavior (invalid run_id, duplicate fires), which a writer would still want stated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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, but the description adds real meaning: it explains where run_id comes from (the fire callback), what omitting it does, and that payload findings should each carry source_url so the compiler can cite them.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Persist a gathered report output') and adds the consequential nuance that it 'completes the run that opened it.' This distinguishes it from read-side siblings like get_output_tool and list_outputs_tool, which cannot complete a run.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly covers the two invocation modes: pass run_id from the fire callback to complete an in-flight run, or omit it for an ad-hoc direct save. It also states the triggering context ('after sweeping the sources'). It stops short of naming sibling tools (e.g. upsert_definition_tool, get_output_tool) as alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

trigger_report_toolTrigger Report ToolA

Fire a report gather right now, without waiting for its schedule.

Dispatches the same callback the scheduler uses: Metsuke POSTs the trigger to the Trentina alert endpoint, which forwards it to the owning gatherer. Requires the callback to be configured (TRENTINA_ALERT_URL + METSUKE_ALERT_TOKEN), unless the owner is a pull owner (METSUKE_PULL_OWNERS): then the run is opened and left for the owner.

NameRequiredDescriptionDefault
nameYesThe report definition name to fire (e.g. "core-platform-status")

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so well: it discloses the dispatch mechanism (POST to Trentina alert endpoint forwarded to the owning gatherer), required env config (TRENTINA_ALERT_URL + METSUKE_ALERT_TOKEN), and the pull-owner branch behavior (run opened and left for owner). These are real side-effect and prerequisite details beyond the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core purpose is front-loaded in the first sentence and the follow-up detail (mechanism, prerequisites, pull-owner case) is genuinely useful rather than filler. Slightly dense but every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and the description covers purpose, prerequisites, and the alternate pull-owner execution path. An agent has everything needed to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single 'name' param is already documented with an example, so the schema does the heavy lifting. The description adds no syntax or semantics beyond it, making 3 the appropriate baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Fire a report gather') and the distinguishing condition ('right now, without waiting for its schedule'), which separates it from scheduling/spec/definition siblings like upsert_definition_tool and get_sweep_tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'right now, without waiting for its schedule' clause clearly situates when to use it versus the normal scheduled path, and it states the configuration prerequisite. It stops short of naming a sibling alternative, so not a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upsert_definition_toolUpsert Definition ToolB

Create or update a report definition.

The owner_agent field makes the gatherer identity data, not code, so gathering can be re-homed to another agent without a rebuild. The schedule is a live cron expression: Metsuke's built-in scheduler fires the report when it comes due, in the given timezone.

NameRequiredDescriptionDefault
nameYesUnique report name (e.g. "core-platform-status")
scheduleNoCron expression for when to fire (e.g. "0 6 * * 5"); None = manual only
timezoneNoIANA timezone the schedule runs in (default: "UTC")UTC
owner_agentNoWhich agent gathers this report (default: "kagetora")kagetora
gather_promptYesThe instruction the gatherer runs to collect findings
source_configNoWhich sources to sweep, as a JSON object

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full disclosure burden. It does add real behavioral context beyond the schema: owner_agent is data not code (so gathering can be re-homed without a rebuild) and schedule is a live cron that the built-in scheduler acts on. It is silent on the mutation semantics that matter most for an upsert — whether an existing definition is merged or overwritten, and what a name collision does.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences with the action front-loaded and no filler. The owner_agent rationale sentence is longer than strictly necessary but does earn its place by justifying the field's design.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need no explanation, and the schema fully covers parameters. But for a 6-parameter mutation tool with zero annotations, the description omits the upsert contract: whether omitted optional fields (schedule=None, owner_agent="kagetora", timezone="UTC") reset existing values or are preserved on update.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 all six parameters, establishing a baseline of 3. The description adds nuance for owner_agent (re-homing without rebuild) and schedule (live cron, scheduler-driven), but says nothing about name, gather_prompt, or source_config beyond what the schema states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

"Create or update a report definition" gives a specific verb pair and resource, which is unambiguous. However it never distinguishes the definition-level write from the sibling trigger_report_tool (which fires a report) or list_reports_tool, leaving that distinction to be inferred from the name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied by "Create or update" — the description never states when to reach for this tool versus trigger_report_tool (fire now) or the listing tools. The cron/scheduler sentence explains one field's behavior rather than routing the agent to this tool over an alternative.

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.

  1. 7 tool updatesv1.1.0
    • Addeddelete_output_tool
    • Addedget_sweep_tool
    • Addedlist_outputs_tool
    • Addedprune_outputs_tool
    • Changedsave_output_tool8 fields changed
      • changedInput schema / properties / payload / description
        Previous value: -"List of finding objects, each ideally carrying a source URL"New value: +"List of findings. Each needs a non-empty summary and should\ncarry its source_url; see Finding for the other allowed keys"
      • changedInput schema / properties / payload / items / additionalProperties
        Previous value: -trueNew value: +false
      • addedInput schema / properties / payload / items / description
        Added value: +"One gathered finding.\n\nThe fields are declared, not left as a free-form dict, because a model\ncalling the tool fills in what the schema names: with a bare ``object``\nitem, strict tool-calling models emitted ``{}`` for every finding (RT #1505).\n``summary`` is the one field every report uses and the one a finding is\nworthless without. The rest are the keys the live reports use; a report\nthat needs one more adds it here.\n\nExample::\n\n    {\"summary\": \"Fedora 45 Beta shipped with Podman 6.\",\n     \"source_url\": \"https://fedoramagazine.org/...\",\n     \"section\": \"rss-news-roundup\", \"theme\": \"RHEL/Linux\"}"
      • addedInput schema / properties / payload / items / properties
        Added value: +{
        +  "actors": {
        +    "anyOf": [
        +      {
        +        "items": {
        +          "maxLength": 200,
        +          "type": "string"
        +        },
        +        "maxItems": 2000,
        +        "type": "array"
        +      },
        +      {
        +        "type": "null"
        +      }
        +    ],
        +    "default": null,
        +    "description": "People or teams involved, by name."
        +  },
        +  "category": {
        +    "anyOf": [
        +      {
        +        "maxLength": 200,
        +        "type": "string"
        +      },
        +      {
        +        "type": "null"
        +      }
        +    ],
        +    "default": null,
        +    "description": "Source category, e.g. the feed category the item came from."
        +  },
        +  "date": {
        +    "anyOf": [
        +      {
        +        "maxLength": 200,
        +        "type": "string"
        +      },
        +      {
        +        "type": "null"
        +      }
        +    ],
        +    "default": null,
        +    "description": "When it happened, ISO date (YYYY-MM-DD)."
        +  },
        +  "outcome_ref": {
        +    "anyOf": [
        +      {
        +        "maxLength": 2000,
        +        "type": "string"
        +      },
        +      {
        +        "type": "null"
        +      }
        +    ],
        +    "default": null,
        +    "description": "Tracker key this finding advances, e.g. a Jira issue key."
        +  },
        +  "section": {
        +    "anyOf": [
        +      {
        +        "maxLength": 200,
        +        "type": "string"
        +      },
        +      {
        +        "type": "null"
        +      }
        +    ],
        +    "default": null,
        +    "description": "Report section this belongs in, as named by the report's gather prompt."
        +  },
        +  "source_type": {
        +    "anyOf": [
        +      {
        +        "maxLength": 200,
        +        "type": "string"
        +      },
        +      {
        +        "type": "null"
        +      }
        +    ],
        +    "default": null,
        +    "description": "Kind of source, e.g. 'jira', 'slack', 'email', 'rss', 'web'."
        +  },
        +  "source_url": {
        +    "anyOf": [
        +      {
        +        "maxLength": 2000,
        +        "type": "string"
        +      },
        +      {
        +        "type": "null"
        +      }
        +    ],
        +    "default": null,
        +    "description": "Clickable link to the evidence; null when no source exists."
        +  },
        +  "summary": {
        +    "description": "One or two sentences stating the finding itself.",
        +    "maxLength": 2000,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  "theme": {
        +    "anyOf": [
        +      {
        +        "maxLength": 200,
        +        "type": "string"
        +      },
        +      {
        +        "type": "null"
        +      }
        +    ],
        +    "default": null,
        +    "description": "Grouping within a section, e.g. 'Security' or 'AI/Agentic'."
        +  },
        +  "title": {
        +    "anyOf": [
        +      {
        +        "maxLength": 2000,
        +        "type": "string"
        +      },
        +      {
        +        "type": "null"
        +      }
        +    ],
        +    "default": null,
        +    "description": "Headline of the source item, when it has one."
        +  }
        +}
      • addedInput schema / properties / payload / items / required
        Added value: +[
        +  "summary"
        +]
      • addedInput schema / properties / run_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "The run to complete (from the fire callback); None = direct save"
        +}
      • changedInput schema / properties / status / description
        Previous value: -"One of \"gathering\", \"ready\", \"compiled\" (default: \"ready\")"New value: +"One of \"gathering\", \"ready\", \"compiled\", \"failed\" (default: \"ready\")"
      • changedInput schema / properties / status / enum
        Previous value: -[
        -  "gathering",
        -  "ready",
        -  "compiled"
        -]New value: +[
        +  "gathering",
        +  "ready",
        +  "compiled",
        +  "failed"
        +]
    • Addedtrigger_report_tool
    • Changedupsert_definition_tool2 fields changed
      • changedInput schema / properties / schedule / description
        Previous value: -"Descriptive cron/time metadata (the actual firing is external)"New value: +"Cron expression for when to fire (e.g. \"0 6 * * 5\"); None = manual only"
      • addedInput schema / properties / timezone
        Added value: +{
        +  "default": "UTC",
        +  "description": "IANA timezone the schedule runs in (default: \"UTC\")",
        +  "type": "string"
        +}
  2. 5 tool updatesv0.2.0
    • First observedget_output_tool
    • First observedget_spec_tool
    • First observedlist_reports_tool
    • First observedsave_output_tool
    • First observedupsert_definition_tool

TDQS

A3.9/5.0

Scored across 10 tools

Disambiguation4/5

Most tools target clearly distinct resources (definitions, outputs, runs, sweeps) with a clean verb split (list/get/save/delete/prune). The only mild overlap is get_output_tool vs get_sweep_tool, since both retrieve gathered data, but the descriptions distinguish compiled findings from pre-gathered sweep sections well.

Naming Consistency5/5

Every tool follows the same verb_noun_tool pattern (list_reports_tool, get_output_tool, upsert_definition_tool, prune_outputs_tool), with consistent snake_case and singular/plural conventions (list uses plural, get/upsert use singular). No mixed styles.

Tool Count5/5

Ten tools is well-scoped for a report-gathering management server, covering the full lifecycle of definitions, outputs, triggering, and sweeps without redundancy. Each tool earns its place with a distinct role.

Completeness4/5

Outputs have full lifecycle coverage (save, get, list, delete, prune) and definitions support list/get_spec/upsert, but there is no delete_definition_tool, leaving a gap in definition management. Agents can work around it, but the surface is not fully closed.

Maintenance

ActivityActive
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables ChatGPT agents to store and retrieve reports in MongoDB Atlas, acting as a bridge between ChatGPT scheduled agents and a persistent database.
    -
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables MCP agents to maintain durable, evidence-aware project knowledge, retrieve precise excerpts on demand, and track decisions, conflicts, and revisions across sessions.
    1
    Apache 2.0
  • A
    license
    Not graded
    quality
    A
    maintenance
    Provides persistent, searchable memory across coding projects and machines, letting agents record and retrieve projects, reusable assets, sessions, decisions, commits, and handoffs via MCP.
    19 PyPI
    2
    Apache 2.0
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI clients to locally store and share tasks, work activities, long-term memory, knowledge, and people information, while allowing users to review saved content and generate briefings or reports through a web UI.
    MIT