Maplith
Server Details
The company brain for your AI agents: how your business works, from the systems you already use.
- Status
- Healthy
- Uptime
- 91.3% over 69 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 30 tools
The tool set has several related retrieval and workflow tools, but descriptions explicitly route between them (ask vs search vs get_object vs fetch, list_signals vs list_findings, request_action vs redeem_action_grant). Most tools target a distinct action or stage, though the large surface makes a few boundaries easy to miss in practice.
Almost all names use predictable snake_case verb_noun patterns such as get_object, list_signals, update_finding_status, and correct_source_system. A few retrieval primitives (fetch, search, route, ask) are noun/verb exceptions but remain conventional and readable.
Thirty tools is heavy for an MCP surface, though the domain is unusually broad: map exploration, signal handling, action governance, source ingestion, playbooks, metrics, automations, and reviews. The count is justifiable but likely exceeds what an agent should comfortably navigate without consolidation.
The surface covers the major lifecycle areas: upload/build, map discovery, retrieval, signals, findings, requests, grants, actions, playbooks, automations, metrics, and setup checks. Minor gaps exist around explicit deletion or management of some artifacts, such as unregistering automations or fuller playbook administration, but core workflows are covered.
Available Tools
30 toolsanswer_questionAnswer a question Maplith askedAInspect
Answer a question Maplith asked about your human's data. kind field_identity answers field_identity_unsure (each unrecognised column of a new export: accept Maplith's suggestion, or same_as a candidate, new, or other_table for the whole file); grain answers grain_unsure (the one or two columns that identify a row, or []); schema_dialect answers schema_dialect_unsure (postgresql or mysql); lineage_direction answers lineage_direction_unsure (which copied file holds the original); auto_detected confirms or corrects what agents' reports added (item_id from fieldwork_objects or work_done_in). get_task_context gives answer_with, the exact call: copy it. Answer only what you checked in your human's own systems, and say so as reason, or ask your human. A person's answer stands. A suggestion's confidence measures past correctness, never the model's certainty. Needs: a key that may act; grain, schema_dialect and lineage_direction apply only for an autonomous key that sees the whole map, or an admin's delegate key (it answers as the admin); field_identity and an auto_detected correction apply for an autonomous key and otherwise wait for a person; an auto_detected confirm applies for any key that may act and does not hand over only.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | field_identity takes question_id and answers; grain signal_id, columns, reason; schema_dialect signal_id, dialect, reason; lineage_direction signal_id, original, reason; auto_detected items, reason. | |
| items | No | auto_detected: each item once. | |
| reason | No | What you checked in the file or your human's own systems; no data values. | |
| answers | No | field_identity: each column once. | |
| columns | No | grain: one or two of the listed columns, or []. | |
| dialect | No | schema_dialect: what the file shows. | |
| original | No | lineage_direction: one of payload.options. | |
| signal_id | No | The signal from list_signals or get_task_context. | |
| question_id | No | field_identity: from get_task_context's field_identity block. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, destructiveHint=false), the description discloses a substantial behavioural rule set: 'Needs: a key that may act', the distinction between an autonomous key that 'sees the whole map' and an admin's delegate key that 'answers as the admin', and which kinds are withheld for person confirmation. It also states that 'a person's answer stands' and that suggestion confidence reflects past correctness, not certainty. What it does not disclose is what happens to the question after answering or how failures surface.
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?
Purpose is front-loaded in the first sentence, which is good, but the remainder is a single dense paragraph joined by semicolons that interleaves per-kind definitions, evidence rules, and key-permission rules. It is information-rich but hard to scan, and the critical permission rules are buried at the end where they are easy to miss.
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 nine-parameter, multi-mode tool with no output schema, the description covers the essential ground: what each kind asks for, who may answer each kind, and the evidence standard for `reason`. The remaining gap is the outcome side — nothing says whether answering closes the signal, what the agent receives back, or what happens if the answer is wrong later.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3 and the description only marginally exceeds it: it explains conceptually what each `kind` means (e.g. grain = 'the one or two columns that identify a row, or []', auto_detected = confirming what agents' reports added), which the schema mostly restates. Guidance on `accept_suggestion`, `same_as`, and `other_table` semantics leans on the schema's own enum descriptions rather than adding new depth.
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 first sentence states a specific verb and resource: answering a question that Maplith (the system) posed about the human's data, and the per-kind enumeration makes the scope of the tool unmistakable. It does not explicitly contrast itself with the sibling `ask` (the inverse direction) or explain when a question originates, so it falls just short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names, per `kind`, which pending uncertainty each answer resolves (field_identity_unsure, grain_unsure, schema_dialect_unsure, lineage_direction_unsure) and directs the agent to `get_task_context` for the exact `answer_with` call. The alternative path is also given: answer only from what was checked in the human's own systems, or 'ask your human'. What is missing is a clear statement of when not to answer at all versus delegating, but the context is otherwise explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
askAsk the mapARead-onlyInspect
Ask the map one question in plain language and get an answer with its sources. When to use which: ask when a question spans several parts of the map or you do not yet know which tool holds the answer. For one known thing the direct tool is faster and not metered: get_object for an object, route for the join path between two, get_metric for a formula, list_findings for the discrepancies, search to find map items by text. The answer is written from what your key may see (objects, fields, relations and join keys, findings, a bounded page of open signals, processes, metrics and tracked values), cites the exact elements it rests on, and says plainly what the map could not establish. Metadata only: it never reads rows, runs anything in your human's systems or invents an element. Every citation is an id you can pass on (fetch, get_object, route; signals cite signal:); a cited route carries each hop's measured verified_rate, and unmeasured_joins names joins never measured. It also answers questions about Maplith itself from its public documentation, citing doc:. Metered against the workspace's daily allowance and limited per key; keep questions specific, under 1,000 characters. Grounding fields: maplith://docs/mcp.
| Name | Required | Description | Default |
|---|---|---|---|
| question | Yes | One question in plain language, e.g. "Which systems hold customer data, and how are they joined?" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes far beyond the annotations: it discloses that the tool is metered against a daily allowance and per-key limited, that it is metadata-only and never reads rows or runs anything in external systems, and that it will not invent elements. It also describes return semantics the annotations cannot carry — citations are reusable ids, cited routes carry measured verified_rate, unmeasured_joins flags never-measured joins, and doc:<page> citations answer Maplith questions. No contradiction with readOnlyHint/openWorldHint=false.
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?
Front-loaded with purpose then routing rule, and the dense middle section is all substantive disclosure rather than filler. It is long, and the trailing "Grounding fields: maplith://docs/mcp" line reads as a dangling pointer with no explained use, which keeps it below a 5.
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?
Covers everything an agent needs for a metered, read-only Q&A tool with no output schema: what input it takes, what the answer will draw on, how citations can be chained into fetch/get_object/route, how to detect unmeasured joins, and what the tool refuses to do. No output schema exists, and the description compensates by describing the response's citation structure explicitly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single `question` parameter, so the baseline is 3; the description earns an extra point by scoping what a question may be about ("what your key may see: objects, fields, relations and join keys, findings, a bounded page of open signals, processes, metrics and tracked values") and by advising "keep questions specific." The length cap it mentions (<1,000 characters) merely restates the schema's maxLength.
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?
Opens with a specific verb+resource ("Ask the map one question in plain language") and immediately states the return shape ("an answer with its sources"). It distinguishes itself from five named sibling tools in the very next sentence, so an agent can tell what this does and what it is not without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to choose this tool ("a question spans several parts of the map or you do not yet know which tool holds the answer") and names the faster direct alternative for each known case: get_object, route, get_metric, list_findings, search. The exclusion condition ("For one known thing the direct tool is faster and not metered") is stated as a rule, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
build_mapBuild the mapAIdempotentInspect
Start a scan from a submitted upload and follow its run: pass submit_sources' upload_id; a retry returns the same run. It also reads current connections and keeps earlier uploaded systems. An owner or admin must first accept the Terms and DPA at human_action_url; a scan that does not fit in today's remaining scan budget is refused with when it starts again. It takes minutes; then call get_map_overview. Needs: a key with upload consent.
| Name | Required | Description | Default |
|---|---|---|---|
| upload_id | Yes | The id submit_sources returned. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations it discloses what an agent genuinely needs: retries are safe and return the same run, the operation takes minutes, a scan exceeding today's remaining budget is refused with a restart time, and scanning requires an accepted Terms/DPA and an upload-consent key. That adds real context (latency, quota refusal, auth gate) on top of the idempotentHint and destructiveHint=false already given.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The essential routing and prerequisite information comes first, but the description is a run-on chain of clauses and the sentence about reading current connections and keeping earlier uploaded systems does not clearly earn its place. It is informative rather than padded, yet a tighter structure would improve scannability.
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, non-destructive, long-running scan tool with no output schema, the description covers prerequisites, latency, quota refusal, retry behavior, and the next step. The only ambiguity is what 'reads current connections and keeps earlier uploaded systems' means for the caller, which slightly undercuts an otherwise complete picture.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the single parameter is already documented, but the description adds the retry semantics tied to that id — the same upload_id returns the same run — which is meaning the schema does not convey. The rest of the parameter story is left to the schema, which is appropriate for a one-parameter tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Start a scan from a submitted upload and follow its run,' and it names the sibling that produces the input (submit_sources) and the one that consumes the result (get_map_overview). That lets an agent place it in the pipeline without opening a schema. The one muddy sentence, 'It also reads current connections and keeps earlier uploaded systems,' blurs the otherwise crisp purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit sequence (call after submit_sources with its upload_id, then call get_map_overview) plus the prerequisites that would otherwise cause a silent failure: an owner/admin must accept Terms and DPA at human_action_url, and the key needs upload consent. There is no explicit 'do not use this when…' exclusion, and the scan-budget refusal is described as a behavior rather than a routing rule, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_setupCheck the setupARead-onlyInspect
Check whether every signal this workspace raises has a way to be handled, and what repairs each missing link. Use it when signals go unhandled or your human asks what is missing in the setup; use list_signals for the open work itself. It checks the chain from the map to a recorded completion and lists each gap with a severity, the item it concerns and the single next step: a signal kind nothing handles (no approved, anchored playbook and no automation); open signals piling up unacted, or past their severity's time (4 hours urgent, 24 attention, 72 info); a playbook in draft, anchored on nothing, naming an undeclared operation or a missing object, or whose trigger is not wired; an operation with no action policy or no live key able to ask for it; a join a playbook crosses that is neither confirmed nor measured; a source with unknown owner or refresh cadence; an automation registered active with no run reported for 8 days; an uploaded system no connection keeps fresh; a plan past its due date. The answer leads with one job per playbook, signal kind or operation; every gap says what your human opens to fix it (with a link) and, where you can help, what to do. Changes nothing; a scoped key sees only gaps about objects in its scope. Maplith runs it hourly and raises each gap as a setup_gap signal until a check no longer finds it.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly, non-destructive, closed-world), and the description adds substantive context beyond them: it enumerates the full taxonomy of gaps detected, tells the agent the answer leads with one job per playbook/signal kind/operation and carries a fix link plus a suggested action, and discloses that a scoped key sees only in-scope gaps. The hourly scheduling and setup_gap signal emission are behaviors no annotation could convey.
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?
It is well front-loaded, but the middle is a single sprawling sentence enumerating nine gap types in semicolon-delimited clauses, which is hard to scan and borders on a spec dump. 'Changes nothing' also restates readOnlyHint=true, the one sentence that does not earn its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters and no output schema, the description must carry the return shape itself, and it does: it lists what each gap contains, how the answer is ordered, and what remediation guidance accompanies it. It also covers scope restriction and the fact that the tool mutates nothing.
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 there is nothing for the description to disambiguate; baseline 4 applies. The description spends its words on output shape instead, which is the right trade for a zero-arg tool.
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 first sentence states a specific verb and scope: checking whether every raised signal has a handling path, plus the repairs for each missing link. It then explicitly separates itself from list_signals ('use list_signals for the open work itself'), so an agent can choose between the two without opening either schema.
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?
States explicit triggers ('when signals go unhandled or your human asks what is missing') and names the alternative tool with the condition that selects it. It also notes Maplith runs it hourly and raises setup_gap signals, which tells the agent when the check has already happened on its behalf.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
configure_metricTrack a metricAIdempotentInspect
Start, change or stop tracking a metric's value over time, so Maplith can tell you when the number moves. Where the metric's data carries a date the value is recorded per calendar period (a month, a week or a day) and get_metric hands back the series; where it does not, Maplith records one number per scan and says so. Off by default: nothing is recorded until your human asks for it, and only aggregates are kept. Set threshold and direction (up: rising is bad; down: falling is bad) to be told when the number crosses a line; the line is drawn for the kind of figure the metric gives now; redraw it when the formula changes shape. Not every metric can be computed: the answer says why, so tell your human rather than wait. Pass tracked false to stop; recorded values stay. Needs: an autonomous key.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The metric name, as get_metric lists it. | |
| tracked | Yes | Record this number from the next scan on, or stop. | |
| direction | No | Which way is bad: 'up' rising, 'down' falling. | |
| threshold | No | The line the value should not cross, drawn for the kind of figure the metric gives now (a period's value, or one number for the whole history). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the safety profile (not read-only, idempotent, non-destructive); the description adds the traits that actually matter here: disabled until a human opts in, aggregates-only retention, values persist after stopping, an auth requirement ('Needs: an autonomous key'), and the shape of the failure path. No contradiction with destructiveHint=false or idempotentHint=true.
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?
Purpose and the off-by-default caveat are front-loaded, and most clauses carry real information (period vs. per-scan recording, auth, stop semantics). It runs long and mixes configuration guidance with troubleshooting in one block, but no sentence is pure 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?
For a non-read-only config mutation with full annotation coverage and no output schema, the description covers defaults, retention, permissions, and failure handling. The only soft spot is what a successful call returns, which is gestured at ('the answer says why') rather than described, but nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents direction ('up' rising is bad) and threshold semantics, so the description largely restates them. It adds one genuine nuance the schema lacks: the threshold is drawn for the current figure type and must be redrawn when the formula changes shape. That extra earns a bit above floor but does not carry new meaning for name or tracked.
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?
Opens with a precise verb triple and resource: 'Start, change or stop tracking a metric's value over time'. It also draws the boundary against the sibling it will be confused with ('get_metric hands back the series'), so the agent can pick between writing tracking config and reading values without opening either schema.
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?
Explicit when-to-use (human must ask first; off by default), how to stop ('Pass tracked false'), when to touch the threshold ('redraw it when the formula changes shape'), and what to do on failure ('tell your human rather than wait'). The alternative for reading data is named. Nothing material is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
correct_source_systemCorrect upload systemsAInspect
Correct how uploaded files are grouped into systems: move files to another system, split files into a new one, merge a system into another, or rename one. Use exact systems and paths from list_sources, and ask your human for the precise choice. A correction is kept across later uploads and only re-homes files: it never removes anything from the map or changes object names, access or stated answers, and a person can undo it on Data sources › Scans. Refused while a scan is queued or running; it cannot wait for approval, so a key that acts with approval asks an admin to use Data sources › Scans. Needs: an autonomous key that sees the whole map.
| Name | Required | Description | Default |
|---|---|---|---|
| paths | No | Exact files from list_sources for move/split. Omit for merge/rename. | |
| source | Yes | Exact source system from list_sources. | |
| target | Yes | Existing system for move/merge; new system name for split/rename. | |
| operation | Yes | move: re-home paths into an existing target system. split: re-home paths into a new system named target. merge: fold the whole source system into the existing target. rename: give the whole source system the new name target. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: corrections persist across later uploads, only re-home files, never remove map entries or alter object names/access/answers, are undoable at Data sources › Scans, are refused while a scan is queued or running, and cannot wait for approval. It also states the auth requirement (autonomous key that sees the whole map).
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?
Front-loads the operations, then consequences, then constraints. Dense but each sentence carries information; the run-on sentence combining persistence, non-destructiveness, and undo is slightly overloaded.
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 4-param mutation tool with no output schema, it covers effects, reversibility, blocking conditions, approval limitations, and permission requirements. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds the meaningful constraint that systems and paths must be exact values taken from list_sources. It does not restate the per-operation parameter mapping, which the schema already covers.
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?
Opens with a specific verb+resource ('Correct how uploaded files are grouped into systems') and immediately enumerates the four concrete operations (move, split, merge, rename). An agent can distinguish this from siblings like build_map or submit_sources without opening the schema.
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?
States the precondition to use exact systems and paths from list_sources, and instructs asking the human for the precise choice. This gives clear context for invocation, though it does not explicitly name non-preferred alternatives to route away from.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
draft_playbookDraft a playbookAInspect
Record optional person-stated time, or draft a playbook for a workspace admin to approve on Rules & know-how › Playbooks; nothing is in use until then, and you cannot approve, edit or delete it. part steps: write the steps of a playbook Maplith wrote without them, from helpdesk conversations you read or steps your human states; get_task_context names the playbook_id where its note says the steps are not written yet. Never write message text, names or values: a draft with a value Maplith recognises is turned away. part time: ask once and record only a person’s stated manual minutes or skip, using their person-bound OAuth connection; a key not linked to a person (one you were handed, not your human's OAuth sign-in) saves and reads nothing, so skip the question there. Read status first and never estimate. part whole: a new playbook for a signal kind nothing handles yet, drawn from the signals you name, instead of handing each one to a person; refused for a kind that is covered or has a draft waiting, and then plan the signal with take_signal (plan: true, due in 7 days). A rejected or deleted whole proposal holds its workspace and kind for 90 days. A draft and its licence allow nothing until approval. Needs: a key that acts and sees the whole map; the whole part only in Maplith's own workspace.
| Name | Required | Description | Default |
|---|---|---|---|
| part | Yes | time: optional person-stated manual time for a playbook (playbook_id, time_mode). steps: the steps of a playbook Maplith wrote without them (playbook_id, steps, handoff, completion?). whole: a new playbook for a signal kind nothing handles (signal_kind, title, purpose, problem, value, trigger, steps, completion, exceptions?, licence?, signal_ids). | |
| steps | No | Both parts: the steps, in order, one plain sentence each. | |
| title | No | whole: a title in plain words. | |
| value | No | whole: the expected benefit supported by the evidence; never invent savings. | |
| handoff | No | steps: when a person takes over. | |
| licence | No | whole: [{signal_kind, operations: ['hq.<op>'], max_per_day, close}], the operations it may take per day and whether it may close the signal. | |
| problem | No | whole: the recurring problem it removes. | |
| purpose | No | whole: exactly what it does. | |
| trigger | No | whole: when it applies. | |
| time_mode | No | time: status first; ask claims the one question. answer or skip records the person’s explicit response. | |
| completion | No | How anyone can tell it is done (required for whole). | |
| exceptions | No | whole: when not to follow it. | |
| signal_ids | No | whole: the signals it was drawn from. | |
| time_basis | No | person_stated: the person explicitly gave these minutes or chose to skip; never an estimate. | |
| playbook_id | No | steps or time: the playbook, as get_task_context names it, or the id after playbook: in a search result. | |
| signal_kind | No | whole: the kind, as list_signals names it. | |
| manual_minutes | No | time answer: only the person’s stated minutes, at most two decimal places. | |
| time_statement_id | No | time: latest statement token from status; null before the first answer. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses the approval gate and that drafts are inert ('A draft and its licence allow nothing until approval'), a 90-day hold on the workspace and kind after rejection/deletion, value-validation rejection ('turned away'), and auth requirements ('a key that acts and sees the whole map'). These are substantive consequences not implied by readOnlyHint/destructiveHint/idempotentHint, so this exceeds the bar annotations set.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The 'part steps / part time / part whole' labels impose useful structure and the sentences are information-dense rather than padded. However, the prose is telegraphic and the opening sentence bundles scope, venue, approval state and a restriction together, forcing a re-read; some of that belongs after the mode breakdown.
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 an 18-parameter, three-mode mutation tool with no output schema, the description covers the approval lifecycle, the prerequisites, the per-mode data sourcing, and the fallback tool. The remaining gap is what the call returns (a draft identifier?), which an agent needs in order to follow up, and there is no output schema to fill that in.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3; the description still adds real meaning, notably that manual_minutes must be a person's explicit statement and never an estimate, that playbook_id can come from get_task_context or from a search result's playbook: token, and that time_statement_id is the latest status token. It does not resolve every parameter pair for the 'whole' part, which keeps it from 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the concrete verb/resource and splits it into three named sub-operations ('part time', 'part steps', 'part whole'), each with its own object (person-stated minutes, a written playbook's steps, a brand-new playbook). It also frames the outcome ('draft a playbook for a workspace admin to approve ... nothing is in use until then'), so an agent knows this is a proposal-creation tool, not a publish tool. It stops short of 5 because the opening sentence is so compressed that the core purpose is hard to extract on a first read.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use rules per mode ('status first and never estimate', get_task_context names the playbook_id where steps are not written yet) and explicit exclusions ('refused for a kind that is covered or has a draft waiting, and then plan the signal with take_signal (plan: true, due in 7 days)'). It also names the skip condition for the time question when the key is not linked to a person, which is exactly the kind of routing guidance an agent needs before calling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fetchFetch a map documentARead-onlyInspect
Read one map document by the id a search result handed you. Ids: object:, finding: or finding:<finding_key> (stable across rescans), process:, metric:, statement: (run-scoped: search again after a rescan), playbook:. It is the second half of the search/fetch pair that connector clients such as ChatGPT require, and returns id, title, text, url and metadata with the direct tools' data flattened to text. If your client can call the direct tools, use them instead (structured, no search first): get_object for an object you can name, get_process for a process, get_metric for a metric, list_findings for findings by status. Use fetch for a result search handed you, or a finding_key.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Search reference (including statement:<id>), or finding:<finding_key> (stable); row ids are run-scoped |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, non-destructive, closed-world), and the description adds behavior beyond them: it enumerates the accepted id namespaces, flags that statement:<id> is run-scoped and must be re-searched after a rescan while finding:<finding_key> is stable, and describes the return shape (id, title, text, url, metadata with direct-tool data flattened to text).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The essential rule — read by id, prefer direct tools if available — is front-loaded, and the id namespace list is compact. The 'second half of the search/fetch pair that connector clients such as ChatGPT require' clause is explanatory padding that a purely operational read could drop.
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 single-parameter read tool with no output schema, the description covers the id provenance, all accepted id formats, stability caveats, and return fields. An agent has everything needed to call it correctly or to decide not to.
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 notes the reference format and run-scoping, so the description is partly redundant here. It still adds value by spelling out all six id prefixes (object:, finding:, process:, metric:, statement:, playbook:) rather than the two the schema names, which is what an agent actually needs to construct a valid id.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read one map document by the id') and immediately scopes it to ids produced by a prior search. Clearly separable from siblings like get_object or list_findings, which the description names explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the condition for use ('for a result search handed you, or a finding_key') and the condition against use ('If your client can call the direct tools, use them instead'), then routes to four specific alternatives (get_object, get_process, get_metric, list_findings) with the criteria that select each.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_map_overviewMap overviewARead-onlyInspect
Orient yourself: domains, objects, row_counts, freshness and quality within your key's scope (truncated counts may be lower bounds), and your_key: what this key may do and, where wake-ups are on, its endpoints and deliveries (wake_ups). stated: the relationships people stated, with the scan's check of each, for a key that sees the whole map. Journey gives stage/done and up to three next steps (what/why/how/who): use journey to guide your human, including features they have not started yet. Setup counts missing links; check_setup details them. Maintenance: last-seen dates, refresh steps for stale sources. Confidence: trust 0-100, with raisers. Then route for a join path, get_object for fields and caveats, ask for cross-map questions. Full semantics: maplith://docs/mcp.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=false, and destructiveHint=false, and the description adds useful behavioral context beyond them. It notes key-scope limitations, that truncated counts may be lower bounds, that relationship checks come from the scan, and that wake-up endpoints/deliveries appear only where wake-ups are on. There is no contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with 'Orient yourself' and covers many relevant areas, but it is a dense, run-on block with internal jargon and semicolon-separated clauses. It is information-rich but harder to parse than necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no parameters, the description carries most of the explanatory burden, and it does list the major overview sections and follow-up paths. Some terms such as 'stated', 'journey', and 'raisers' remain slightly opaque, but the external docs link provides a fallback.
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 schema imposes no parameter-semantics burden. The description does not need to explain parameter usage, and the baseline for zero-parameter tools is appropriately high.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool provides an orientation overview of the map: domains, objects, row counts, freshness, quality, key scope, relationships, journey, setup, maintenance, and confidence. It distinguishes itself from siblings by naming specific follow-up tools, though the opening 'Orient yourself' is broader than a precise verb+resource phrase.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly positions the tool as the orientation step and routes the agent to alternatives: 'route' for a join path, 'get_object' for fields and caveats, and 'ask' for cross-map questions. It also says to use 'journey' to guide the human and mentions 'check_setup' for details, giving clear when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_metricMetricsARead-onlyInspect
Read one metric in full, or list every metric defined for this workspace. Without name it lists them with their tracking state: each row carries caveat_count, broken_reason (the formula cannot be measured as written, and why; its values are not recorded) and any proposed_for_removal mark, and older definitions kept for review are included. With name it reads that one: its formula in map terms, the exact object.field grounding, every caveat and, where tracking is on, the recorded values. Read the caveats before computing or citing a number: they say when it cannot be trusted; configure_metric starts tracking one. On a map larger than one call reads the list is cut: truncated is true and truncated_note says so. Use this, not fetch, when your client can call it.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | The metric to read, as the list spells it. Omit it to list every metric. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly annotations, the description discloses list-mode details such as caveat_count, broken_reason semantics, proposed_for_removal marks, inclusion of older review definitions, and truncation signals. Read mode similarly explains what is returned, including formula representation, object.field grounding, caveats, and recorded values when tracking is enabled.
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?
It is front-loaded with the primary purpose and every sentence carries substantive behavioral information. The definition is dense and somewhat lengthy, but there is little wasted text and the structure moves logically from list mode to read mode to usage guidance and truncation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the necessary return-shape context for both modes, including caveat, broken-state, truncation, formula, grounding, and recorded-value details. No critical information needed to call the tool correctly appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and already documents name as 'the metric to read, as the list spells it' and that omitting it lists every metric. The description reinforces the dual list/read behavior but does not add syntax or format detail beyond what the schema provides, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb and resource: 'Read one metric in full, or list every metric defined for this workspace.' It distinguishes both operating modes and explicitly routes the agent away from the sibling tool fetch, so the tool's role is unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states exactly when each mode applies: omit name to list metrics, supply name to read one. It also gives cross-tool guidance by naming configure_metric for starting tracking and fetch as the alternative when the client cannot call this tool, plus the caveat to read caveats before citing numbers.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_objectObject detailARead-onlyInspect
Read one object before you act on it: its applicable decision statements, fields, relations and caveats. Use this, not fetch, for an object you can name; route for the path between two objects; ask when the question spans several. Rules come as trees: each has a layer (principle, policy, rule, default) and rests_on the principle above it; full and compact rules carry statement keys and coverage, and statement_key fetches a compact rule in full. The detail also carries aliases, row_count and row_count_details, grain, field_id, also_called, recognised_by, auto_detected, role and role_basis, count-only profiles, personal-data classifications and pii flags, source systems and same_source_as peers, relations with join keys, coverage sides and basis (declared with declared_by, measured or guessed; null when unknown), findings and automations (list_automations has them all). Never echo pii=true values unless the task requires it. Full semantics: maplith://docs/mcp.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Object name as the map spells it — the name search, route and the object pages hand out, e.g. "invoice" or "Invoice". A name written entirely in lower case is matched too. | |
| context | No | {"client": "<company>"} (never a person): adds its confirmed variation. | |
| rule_node | No | One rule group, by node_key. | |
| statement_key | No | Read one applicable rule in full. | |
| statements_only | No | Rules alone, {} when none apply; call again with it only when your client cut a long answer. | |
| statements_query | No | Rank rules; never filter them. | |
| statements_cursor | No | Next page; keep the same query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and destructiveHint=false, but the description adds substantial behavioral context beyond that: the rule-tree structure with layers and rests_on, statement_key expansion, truncation recovery via statements_only, and a real safety constraint to never echo pii=true values. This is genuine added value, not restatement.
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?
Purpose is front-loaded and no sentence is pure filler, but the long field-name enumeration ('aliases, row_count, row_count_details, grain, field_id, also_called...') is a dense wall that is hard to parse and would read better as structured bullets. Detail is warranted by tool complexity but organization suffers.
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?
Complex tool with 7 params and no output schema, yet the description enumerates what the detail carries (rules, relations with join keys, coverage, PII flags, findings, automations) and points to a full-semantics doc. An agent has enough to call it correctly and interpret the return.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the baseline is 3, but the description adds real meaning: statement_key 'fetches a compact rule in full', statements_query 'ranks rules; never filter them', and statements_only re-call behavior on truncated answers. These semantics go beyond the schema descriptions, warranting a 4.
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 ('Read one object') and immediately scopes what the detail contains: decision statements, fields, relations, caveats. It explicitly distinguishes itself from siblings ('not fetch', 'route for the path', 'ask when the question spans several'), so an agent can select it without opening other schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use and when-not-to-use guidance naming three alternatives (fetch, route, ask). The opening 'before you act on it' plus the routing rules leave nothing to inference about which tool to pick.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_processProcessesARead-onlyInspect
Read one process in full, or list every process the map discovered. Without object_type it lists them, one per central object type, with case count, happy-path share and step count; with object_type it reads that one: its happy path with step counts and median hours between steps, and every deviating variant with its missing or extra steps, which are candidates for process-level findings. Processes are found deterministically from an object-centric event log built from the dated rows of the exports and any event log they include. On a map larger than one call reads the list is cut: truncated is true and truncated_note says so. Use this, not fetch, when your client can call it.
| Name | Required | Description | Default |
|---|---|---|---|
| object_type | No | Central object of the process to read, as the list spells it, e.g. "order". Omit it to list every process. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, non-destructive and closed-world, and the description adds real value on top: truncation behavior ('truncated is true and truncated_note says so') and the origin of the data (deterministic derivation from an object-centric event log built from dated export rows). It stops short of describing ordering or payload shape for the list case, so it is strong but not exhaustive.
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?
Front-loaded with the core action and the mode branch before any detail. The single long semicolon-chained sentence packs a lot in and the derivation sentence is secondary but still earns its place by explaining what 'discovered' means.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so: case count, happy-path share, step count, median hours between steps, and deviating variants with missing/extra steps. Truncation is covered, so an agent knows exactly what it will get back.
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 explains omitting object_type, but the description goes further by spelling out what each mode returns, which is the meaningful consequence of the parameter. It reinforces rather than merely repeats 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?
Opens with a specific verb and resource ('Read one process in full, or list every process') and makes the dual-mode nature explicit. An agent immediately knows this returns process structures rather than raw objects or metrics, distinguishing it from get_object, get_map_overview and get_metric.
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?
States the exact selection rule ('Without object_type it lists them...; with object_type it reads that one') and explicitly routes away from a named sibling: 'Use this, not fetch, when your client can call it.' That is both a when-to-use and a when-to-use-something-else statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_task_contextTask, signal or case contextARead-onlyInspect
Start any work here: one call equips you for a task, signal or support case. task: its objects, applicable decision statements (layer, rests_on, coverage), routes, playbooks, owners; fields via get_object. signal_id: its evidence, playbooks, playbook_drafts, suggested_action, remedy, handling, lifecycle and trust (weak joins and fields not to quote back), answer_with for Maplith's question, and approved_fix. case: identifier/topic are kinds, never customer values. Follow the rules; open a rule's source only if unclear; read payload.checks before acting on one. Still metadata: fetch rows in your human's own systems. Suggested actions forecast what request_action would decide, never a permission. Details: maplith://docs/signals-and-rules.
| Name | Required | Description | Default |
|---|---|---|---|
| case | No | A support case, in kinds. | |
| task | No | Pass one of task, signal_id and case. | |
| context | No | {"client": "<company>"} (never a person): adds its confirmed variation. | |
| rule_node | No | One rule group, by node_key. | |
| signal_id | No | A signal id from list_signals. | |
| statement_key | No | Read one applicable rule in full. | |
| statements_only | No | Rules alone, {} when none apply; call again with it only when your client cut a long answer. | |
| statements_query | No | Rank rules; never filter them. | |
| statements_cursor | No | Next page; keep the same query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/non-destructive/closed-world, so the bar is low, yet the description adds substantial behavioral detail: the tool is metadata-only and does not fetch real rows, signals carry trust caveats (weak joins, fields not to quote back), statements_only returns {} when nothing applies, and the cursor exists because the client may cut a long answer. That is real context an agent cannot get from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded with the key instruction and roughly the right length, but the middle is a long semicolon-separated dump that mixes mode contents, caveats and warnings into one undifferentiated block. Splitting the three modes into distinct sentences would cost nothing and greatly improve scanability.
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 nine-parameter tool with nested objects, three mutually exclusive modes and no output schema, the description covers the critical ground: mode selection, the metadata-only boundary, the safety framing around suggested_action, truncation/pagination behavior, and a doc pointer for depth. The main gap is that it never sketches the shape of the returned context, which the absent output schema would otherwise require.
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 3 is the baseline, but the description goes further by explaining what each mode yields (task → objects/routes/playbooks/owners; signal_id → evidence/remedy/handling/trust/answer_with/approved_fix) and adds ranking-vs-filtering semantics for statements_query plus the 'keep the same query' constraint on statements_cursor. Only rule_node, statement_key and context are left largely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a specific verb and scope ('one call equips you for a task, signal or support case') and then enumerates exactly what each of the three input modes returns. It is clearly a context-priming tool distinct from list_signals or get_object, though the dense semicolon chains and internal jargon (layer, rests_on, coverage, weak joins) make the purpose slightly harder to absorb than it needs to be.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states plainly when to call it ('Start any work here'), routes the agent elsewhere where appropriate ('fields via get_object', 'open a rule's source only if unclear'), and sets ordering rules ('read payload.checks before acting on one'). It also draws a hard boundary against misuse ('Still metadata: fetch rows in your human's own systems'; 'never a permission'), which is exactly the guidance an agent needs before acting.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_value_summaryValue summaryARead-onlyInspect
Summarise what the workspace got out of its signals over a period, as counts within your key's scope. It counts work signals raised, acted on, planned and not acted on, in total and by kind; notices and changes resolved before anyone acted are separate totals; findings that appeared and that are no longer reported; actions recorded by outcome with the median and longest time from signal to record; gate requests by decision and approvals a person decided (workspace-wide; null for a key limited to part of the map); the value agents stated in their own numbers (sum per currency, and how many records carried none); dead connections found and reached again; and each tracked metric's recorded values beside the records written against signals about it, by outcome and by day, never a claim that an action moved the number. Maplith does not estimate value or attribute a change to an action: this is what happened, and what your human's agents said it was worth. Acted on means a record exists against the signal, or a person closed it in Maplith or in the system the case lives in. Default period: the last thirty days (since, until).
| Name | Required | Description | Default |
|---|---|---|---|
| since | No | ISO 8601 timestamp — the start of the period. Default: thirty days before until. | |
| until | No | ISO 8601 timestamp — the end of the period (exclusive). Default: now. At most 400 days after since. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, openWorldHint=false, so safety is covered. The description adds real behavioral context beyond that: it defines 'acted on', warns that nulls appear for keys limited to part of the map, and explicitly states Maplith does not estimate value or attribute change to an action, which prevents an agent from over-reading the numbers.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is stated up front, but the body is one sprawling semicolon-delimited sentence enumerating every count. Because there is no output schema, that enumeration does earn its place as return-value documentation, but a bulleted or segmented structure would make it far easier to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing what comes back, and it does so exhaustively across signals, notices, findings, actions, gates, stated value, dead connections, and metrics. Combined with the null-case and no-attribution caveats, an agent has enough to call and interpret this correctly; only explicit sibling routing is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents ISO 8601 format, defaults, and the 400-day cap for since/until. The description's 'Default period: the last thirty days (since, until)' restates schema content rather than adding format or constraint detail beyond it, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: summarise what the workspace got out of its signals over a period, as counts within the key's scope. It is clearly an aggregate-report tool rather than a list/get tool like get_metric or list_signals, though it never explicitly names those siblings to differentiate itself.
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 period default ('the last thirty days (since, until)') and explains scope caveats (gate approvals are workspace-wide, null for a partial-scope key), which implies when it is appropriate. But it never says when to use this instead of get_metric, list_findings, or get_map_overview, and offers no explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
join_reviewJoin reviewAInspect
Question a join on the map, add one it missed, or report counts on a review: what you and your human found testing the map. It changes no system; a person decides on Business map › Glossary, but agreeing counts on a review Maplith opened, from a key that may act, mark that join tested. op flag opens a join review and a join_review signal whose task context says what to count in your human's own systems: name the two objects as the map spells them and a reason (wrong_key, wrong_direction with cardinality read from → to, not_related, works_like_this with how in note, or missed with the key or a note); for a join on the map pass its key exactly as route or get_object gave it. Maplith answers with its own evidence first: if it contradicts the claim nothing is opened and the outcome is contradicted, with the evidence to show your human; only if they still say it is wrong call again with confirm: true. Other outcomes: opened (with review_id and then, the report call), exists, on_map. op report records the counts as the evidence on a review that exists (review_id from the signal's task context or from flag): left_distinct, right_distinct and matched_distinct with sampled are required; a fraction, a negative, counts that cannot all be true or a note over 300 characters refuses the whole report. Never send a value, a row, a name or an id from the data. Show your human the numbers first.
| Name | Required | Description | Default |
|---|---|---|---|
| op | Yes | flag: open a review of a join (from, to, reason, key?, cardinality?, note?, confirm?). report: add measured counts to a review (review_id, measurement). | |
| to | No | flag: the other object. | |
| key | No | flag: the key; for a join on the map, its join_spec exactly as route or get_object gave it; for a missed join, from's file and column on the left, to's on the right. | |
| from | No | flag: one object, as the map spells it. | |
| note | No | flag: how it works, in your human’s words. Required for works_like_this, and for missed without a key. No values from the data. | |
| reason | No | flag: wrong_key, they do not join on this key; wrong_direction, direction or count is wrong (give cardinality); not_related, no join at all; works_like_this, it works differently (say how in note); missed, a join the map lacks (give key or note). | |
| confirm | No | flag: true to open the review although Maplith’s evidence contradicts it, only after your human has seen the evidence. | |
| review_id | No | report: the review, from get_task_context (join_review.review_id) or from the flag answer. | |
| cardinality | No | flag, wrong_direction (required) and missed: the right shape, read from → to: 1:1, 1:N, N:1 or N:M. | |
| measurement | No | report: counts from your own measurement, never a value. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare destructiveHint=false and readOnlyHint=false; the description adds the far more important behaviors: a person decides on the Business map so no system changes, evidence-first evaluation that returns contradicted with evidence instead of opening a review, the exists/on_map outcomes, and a report-validation policy that refuses the whole report on fractions, negatives, impossible counts, or notes over 300 characters. This is context an agent could not obtain from annotations or 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?
Almost every clause carries information, and the purpose and the confirm-flow are reasonably front-loaded. But it is delivered as one dense, run-on block mixing flag behavior, report behavior, privacy rules and outcome names, making it hard for an agent to parse on a single pass — structure, not length, is the problem.
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 10-parameter tool with nested objects and no output schema, the description covers the outcome vocabulary (contradicted, opened with review_id, exists, on_map), the report-then-read sequence, and the hard privacy rule against sending values, rows, names or ids from the data. Minor gap: the exact shape of the opened/signal payload is only gestured at via 'review_id from the signal's task context'.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds semantics the schema does not: cardinality must be read from → to, key must be passed exactly as route/get_object returned it, note max length differs between 300 (measurement) and 500 (flag), and counts must be internally consistent or the report is rejected. It also explains per-reason field requirements beyond the enum descriptions.
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 opening states concrete verbs and objects — question a join, add a missed join, or report counts on a review — so the agent can tell this is a join-review mutation tool, not a read tool like get_object or route. It is specific but the sentence is grammatically tangled ('a join_review signal whose task context says what to count'), and it never explicitly names a sibling it is not.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit branches: use flag to open a review (with reason-specific requirements: cardinality for wrong_direction, note for works_like_this, key or note for missed), use report to record counts on an existing review. It also states the when-not path — if Maplith's evidence contradicts the claim, nothing opens and you must only retry with confirm:true after the human has seen the evidence — and points to route/get_object as the source of the key.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_automationsList automationsARead-onlyInspect
List the automations your human's business runs in its own systems, each bound to the map objects it reads and writes: a flow, a zap, a scheduled job, an agent on a timer. Use it to see what breaks if an object changes, and to find dead automation: each entry carries attention, the reasons it needs a look, most urgent first (never_run, last_run_failed, status_unknown, object_not_on_map, paused), and the list is sorted that way. Maplith describes them from what was registered (register_automation adds or updates one); it does not run or watch them. Filter with object or status. Only automations whose every bound object is in your key's scope are listed.
| Name | Required | Description | Default |
|---|---|---|---|
| object | No | Only automations that read or write this object, as the map spells it. | |
| status | No | Only automations in this state: active, paused, never_run or unknown. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, non-destructive, closed-world, so the description spends its space on behavior beyond them: results are sorted by attention urgency, the attention reasons are enumerated (never_run, last_run_failed, status_unknown, object_not_on_map, paused), and it discloses a scope rule not visible anywhere in the schema — only automations whose every bound object is in the key's scope are returned. It also warns the data is registration-derived rather than live.
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?
Front-loaded with the core purpose, then use cases, then return shape, then filters — a sensible order with no filler sentences. It is dense, and the parenthetical attention-reason list is long, but every element is load-bearing rather than redundant.
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 carries the return-shape burden and does: entries carry 'attention', the reasons it needs a look, sorted most urgent first, plus the scope restriction on what is listed. An agent knows what comes back, how it is ordered, and why items might be absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents both filters and the status enum; the description's 'Filter with object or status' adds little. It does add value by introducing the 'attention' concept, whose reason labels (last_run_failed, object_not_on_map) differ from the status enum values (active, paused, never_run, unknown), hinting that status and attention are distinct signals — though it never explicitly reconciles the two lists.
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 the automations') and immediately defines what an automation is in this domain ('a flow, a zap, a scheduled job, an agent on a timer') bound to map objects. It also separates itself from the write counterpart by naming register_automation as the tool that adds or updates them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives two concrete use cases ('see what breaks if an object changes' and 'find dead automation') plus an explicit exclusion: 'it does not run or watch them,' which rules out a plausible but wrong expectation. It also names the sibling that performs writes (register_automation), so the read/write split is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_findingsList findingsARead-onlyInspect
List the documented data problems of this workspace: cross-system discrepancies with evidence, recommendation and lifecycle status, optionally filtered by status. Use it for the discrepancy catalogue; use list_signals for new work and changes since a timestamp, and fetch finding:<finding_key> for one finding you already hold a key for. finding_key stays stable across rescans (ids are per run). The list is complete unless truncated is true. After a scan whose own investigation found nothing, empty_scan says so: found_none_of_its_own when the scan produced no finding at all, findings_kept_from_previous_scan when the previous scan's findings were kept open with the statuses people gave them, so what you read is not this scan's news. A finding's decision says where its work stands; approved: a person approved its fix. A status is changed with update_finding_status.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Only findings in this state: open (not yet addressed), planned (someone plans to address it), automated (an automation handles it), dismissed (judged not a problem here), approved (a person approved the fix). Omit for every status. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly and non-destructive annotations, the description explains list completeness via truncated, the meaning of empty_scan values after a scan finds nothing, and the stability of finding_key versus per-run ids. These are exactly the behavioral traits an agent needs to interpret results correctly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and sibling routing, then covers key stability, truncation, empty_scan, and status mutation. It is dense but mostly earns its length; the decision/approved sentence slightly overlaps with the status enum documentation.
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 carries the burden of explaining return semantics, and it does: completeness/truncation, empty_scan cases, finding key stability, and the lifecycle meaning of status and decision. An agent has enough context to call the tool and interpret its output.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the status enum and its meanings are already fully documented in the schema. The description only adds that the filter is optional, which is already implied by the schema; it does not add syntax or format details beyond that.
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: list documented data problems of the workspace, defined as cross-system discrepancies with evidence, recommendation, and lifecycle status. It also distinguishes this catalogue tool from list_signals and fetch, so an agent can select it without opening sibling schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly names alternatives and the conditions that select them: list_signals for new work and changes since a timestamp, fetch for one known finding key, and update_finding_status for changing status. This is clear when-to-use and when-to-use-something-else guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_requestsYour requestsBRead-onlyInspect
Read your own request_action requests, newest first, and where each stands: pending (a person has not decided yet), allowed, denied or withdrawn. By default only the pending ones; status all lists every one. Each has its request_id, the operation (system.operation), the target, the params you sent, your reason, when you asked, and the signal it named with that signal's state now. Only this key's requests. request_action with op withdraw takes back one that still waits. It changes nothing. waiting_on_maplith lists what you or your human asked Maplith for and still wait on: a system Maplith is setting up, or a problem or suggestion you sent with suggest_feature. Each row says since when and where it stands. A row leaves the list when it is done and moves to recently_done for 30 days; for a system you also get an unblocked signal.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | At most this many, 1 to 50. Default 20. | |
| status | No | 'pending' (the default): only those still waiting for a person. 'all': every request, decided ones included. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/non-destructive/closed-world, and the description adds real context beyond that: scope limited to this key's requests, newest-first ordering, and an itemized list of returned fields (request_id, operation, target, params, reason, timestamp, signal state). With no output schema, that return-shape disclosure is the valuable contribution here.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core scope and default behavior are front-loaded, but the passage then rambles into unrelated tooling (waiting_on_maplith, recently_done, unblocked signal) using long run-on sentences. Those sentences do not describe this tool's behavior and actively cost the reader clarity rather than earning their place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does the necessary work of enumerating returned fields and ordering, which is genuinely complete for the read itself. But it omits pagination behavior given a limit-only schema, and the trailing material about Maplith waitlists describes data this tool does not return, so it neither completes nor cleanly bounds the picture.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description does elaborate what the status values mean ('pending (a person has not decided yet), allowed, denied or withdrawn'), adding semantic depth beyond the enum, but says nothing about limit or its 1-50 range, leaving the schema to do that 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?
Opens with a specific verb and resource: 'Read your own request_action requests, newest first, and where each stands,' which distinguishes it from request_action (which creates) and from mutation siblings. However, the closing sentences pivot into describing 'waiting_on_maplith' and 'recently_done', which are not what this tool returns, muddying what the tool actually is.
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?
'By default only the pending ones; status all lists every one' gives clear default-vs-override guidance. It also points at request_action with op withdraw as the way to take one back, which is a useful sibling reference. But there is no explicit statement of when to call this versus list_signals or waiting_on_maplith, and the blend of those other tools' semantics into the text leaves the agent unsure whether they are covered here.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_signalsList signalsARead-onlyInspect
Find work and changes: the scoped queue of signals (typed events) with severity, state, objects and aggregate payloads. Use it for the work queue and for what changed since a timestamp (since); use list_findings for documented discrepancies. Follow a signal up with get_task_context; when ready, take it with take_signal before you work on it and report with record_action. Lease expiry and reopening keep created_at, so also poll states [open] without since for available work; next_cursor paginates. Rules are judged per group by every scan as it finishes: one rule_fired per matching group (by_rule rolls this page's open ones up per rule), rule_broken when unjudgeable; the first evaluation is a quiet baseline, and a live check may raise rule_cleared. Legacy notice kinds remain readable. unacted and the states distinguish open work, plans, holds and completed episodes. Details: maplith://docs/signals-and-rules.
| Name | Required | Description | Default |
|---|---|---|---|
| kinds | No | Only these signal kinds, named as the enum lists them (the kinds this workspace can raise). Omit for every kind. | |
| limit | No | Signals per page. Default 100; up to 500 for a key that sees the whole map, up to 100 for a key limited to part of it. | |
| order | No | newest (default): newest first. urgency: urgent, then attention, then info, newest first within each; pass the same order with its cursor. | |
| since | No | ISO 8601 timestamp — only signals created after it. | |
| cursor | No | The next_cursor from the previous call. | |
| states | No | Only signals in these states, as your key sees them: open (not picked up), planned (open, planned by someone), in_progress (held by an agent or a person), done (settled). | |
| unacted | No | Only signals still to be dealt with: open, planned or in_progress (including ones another agent holds or that wait on a person). For only the work nobody has picked up, pass states: ["open"] instead. For a key limited to part of the map, a close counts only when that key may see the record behind it: one made without the signal's current version, or while the signal named objects outside the key, does not, so such a signal still comes back as open. | |
| exclude_kinds | No | Leave these kinds out, e.g. ['setup_gap'] when you review findings. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint/openWorldHint/destructiveHint, yet the description discloses lease expiry and reopening preserving created_at, cursor pagination, per-group rule judging semantics, the quiet baseline on first evaluation, and rule_cleared on live checks. That is substantial context an agent could not infer from structured fields.
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?
Purpose and the primary use case are front-loaded in the first two sentences, and most of the remaining content is load-bearing. The rules-judging passage is a dense run-on and could be split for scannability, which keeps it short of a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 8 optional params, no output schema, and minimal annotations, the description carries the burden well: it covers pagination, ordering, state semantics, polling strategy, follow-up tooling, and points to maplith://docs/signals-and-rules for depth. Nothing an agent needs in order to call it correctly appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, and the description goes beyond it by explaining that lease expiry and reopening keep created_at — which directly changes how 'since' should be used — and by tying cursor to the same order. It does not add much for limit or kinds beyond what the schema already says.
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 — the scoped queue of signals (typed events) with severity, state, objects and aggregate payloads — and immediately distinguishes it from list_findings for documented discrepancies. An agent can tell it apart from siblings like list_findings and take_signal 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names alternatives and the conditions selecting them: list_findings for documented discrepancies, get_task_context to follow up, take_signal before working, record_action to report. It also gives a non-obvious polling recipe (states [open] without since) for available work.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_sourcesList data sourcesARead-onlyInspect
List the systems and files this workspace's scans read: where the data behind the map lives. Read it before you query a source system, to know which export holds what; pass system for one system's files in full. Per system: file export or connection, when a scan last read it, whether the current map was built from that scan, and per file its path, format, record count and the objects built from it. Metadata only: no row, no value; paths are the export's own names, and Maplith tries to mask personal data in them. asked holds what a person stated about a system (owner as a team, refresh cadence, retention, access, sensitivity, warehouse hints); unknown means nobody answered: never guess it, ask your human. A key limited to part of the map sees a file only when every object built from it is in its scope. work_done_here counts the work agents reported in each system. Files under the wrong system are re-homed with correct_source_system.
| Name | Required | Description | Default |
|---|---|---|---|
| system | No | One system as list_sources names it, e.g. "economic". Omit for every system. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnly/non-destructive/closed-world; the description adds substantive context beyond that: metadata-only with no row values, personal data masking in paths, permission scoping ("a key limited to part of the map sees a file only when every object built from it is in its scope"), and the meaning of unknown in asked data. This is exactly the non-obvious behavior an agent needs.
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?
Purpose is front-loaded, then the response shape, then the semantic caveats. Dense and largely earning its place, though the later clauses (asked/unknown, work_done_here, re-homing) run together in long semicolon chains and could be split for faster scanning.
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?
No output schema exists, and the description compensates by enumerating the returned fields per system and per file (export/connection, last scan, map provenance, path, format, record count, objects built from it) plus the asked/work_done_here attributes. Nothing an agent needs to call or interpret it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description earns above that by clarifying the default (omit = every system) and that naming one system returns that system's files in full, which the schema only implies.
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?
Opens with a specific verb+resource ("List the systems and files this workspace's scans read") and immediately frames it as the inventory behind the map, which separates it from query-oriented siblings like search, fetch and get_value_summary. An agent can tell what this returns without opening the schema.
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 an explicit use case ("Read it before you query a source system, to know which export holds what") and a scoping instruction ("pass system for one system's files in full"). It also points to correct_source_system for the remediation case. It stops short of naming a clear when-not/alternative tool, 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.
record_actionRecord what you didAInspect
Record finished work; it changes nothing in your human's systems and starts no scan. Choose signal_id, request_id for your own allowed request, or work for work with no signal/request. With work: pass kind, map objects with non-personal references, the system you did it in and optional at, plus summary and outcome done or skipped; never message text or personal values. It is news in agent activity, not a signal. With a signal: pass its signal_version and episode; done/skipped needs resolution fixed, not_an_issue or wont_fix (the latter two wait for a person under an approval key, unless it is a delegate). needs_human hands the signal to a person; task says exactly what they do next. A person's hold is settled by that person or an admin's delegate key (not customer reports, security, secrets, legal). Use update_finding_status to change a finding's status instead. Summary is at most 500 characters; Maplith tries to mask it, best effort. State value only in your human's or their systems' own numbers, never estimate it. Details: maplith://docs/mcp. Needs: a key that may act with approval or autonomously.
| Name | Required | Description | Default |
|---|---|---|---|
| task | No | With needs_human: what the person does next, whole — the exact change (where, from what to what, why, how to check) or the reply to send. A task, not an approval. Max 2,600 characters, no secrets. Recorded again on a signal waiting on your task, it updates that task. | |
| work | No | Work with no signal/request; object names exactly as the map shows. References name things (edition, page, order), never people. Repeats can become a draft for an admin at the next scan. No task, resolution, episode or signal_version. | |
| links | No | Where the work landed, if anywhere a person can open. | |
| value | No | What this action was worth, in your human's own numbers, when they or their systems state it — the ad spend stopped on a sold-out product, the refund avoided. Only a stated figure: never estimate one. Leave it out when nothing states it; an action without a value stays unstated and is counted as such in get_value_summary. | |
| episode | No | The episode you worked on, as list_signals or get_task_context returned it. If the signal has since closed and come back as a new episode, nothing is recorded and you are told so. | |
| outcome | Yes | With work: done or skipped, without a resolution. On a signal, done: settled (with a resolution). needs_human: you got as far as you could; a person decides, and task says what they do next. skipped: it turned out not to matter (with a resolution). | |
| summary | Yes | One or two sentences on what you did. Max 500 characters. | |
| signal_id | No | The signal from list_signals or get_task_context. Leave it out when you pass request_id. | |
| task_type | No | 'reply' for a drafted reply; default 'change'. | |
| request_id | No | The request_id request_action returned, when this is the outcome of a request you were allowed (or approved) to carry out. Only your own key's requests. If the signal the request named is gone or no longer readable by your key, the outcome is recorded against the request alone and no signal is closed; if that signal still waits for work, it is handed to a person, so no other agent repeats it. | |
| resolution | No | What came of it — required with outcome 'done' or 'skipped' on a signal that is not settled yet. If you cannot say, record outcome 'needs_human' instead, so a person decides. | |
| signal_version | No | The signal's created_at exactly as list_signals or get_task_context returned it, so Maplith knows which version of the signal your summary is about. When recording a signal, a key limited to part of the map must send signal_version: if you leave it out, or a scan re-stamped the signal after you read it, nothing is recorded and you are told to read the signal again. When you pass a request_id whose request named no signal there is no version to name: pass an empty string. Omit signal_version with work. Every scan that emits a signal again moves its version, whether or not anything about the signal changed, so read it again and look before you record. For a key that sees the whole map the record is still kept in those cases, but is hidden from keys limited to part of the map, and those keys keep seeing the signal as not acted: list_signals with unacted: true hands it to them until someone records against its current created_at. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: masking of summaries is "best effort," not_an_issue/wont_fix waits on a person under an approval key, a mismatched signal_version records nothing, and a request whose signal is gone records against the request alone. The only gap is that the readOnlyHint=false / idempotentHint=false pair is never translated into a plain statement about retry/duplicate behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense paragraph of semicolon-chained clauses that repeats material already fully documented in the schema (resolution, episode, signal_version). The opening scope statement is well front-loaded, but the mode instructions, approval-key rules, and version-stamp warnings are run together with no visual separation, making it hard to parse at call time.
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 12-parameter mutation with nested objects and no output schema, the description covers the failure modes an agent must anticipate: version mismatch, closed-then-reopened episodes, requests pointing at unreadable signals, and hold settlement authority. What it lacks is a plain statement of what a successful call returns or how a rejected call reports itself beyond "you are told."
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds cross-parameter rules the schema cannot express: which parameters belong to the work mode versus the signal mode, that resolution is only meaningful on a signal, and that outcome semantics differ by mode. It also constrains summary length and forbids personal values in work objects.
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?
Opens with a concrete verb and resource plus the key negative scope: "Record finished work; it changes nothing in your human's systems and starts no scan." It also frames the record as "news in agent activity, not a signal," which separates it from the signal tools. The three input modes (signal/request/work) are named, though the density makes the core purpose slower to grasp than it should be.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes between modes: "Choose signal_id, request_id for your own allowed request, or work for work with no signal/request," and names an alternative tool with its condition ("Use update_finding_status to change a finding's status instead"). It also states prerequisites ("Needs: a key that may act with approval or autonomously") and the delegate/admin exception path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
redeem_action_grantRedeem an action grantADestructiveInspect
Spend the single-use grant request_action gave you, immediately before you perform the allowed action, and act only if the answer is redeemed. A grant is good for ONE action: the first redemption marks it used and every later attempt is refused, so redeem once, right before you act. Pass grant_id and the grant's digest; the request_id your job says you are fulfilling (from the job, never copied out of the grant); the system, operation and target_kind of the action; and param_digest, computed from the action's target id and params with the grant's param_salt (HMAC-SHA256; the recipe is in the parameter description and in Maplith's docs). Maplith checks all of them against the request and the grant in one atomic update and refuses if they differ, so a grant for a refund of 120 on one order never authorises 999,999 on another. Any key of the same workspace may redeem (the executor is usually another key than the asker), never a key of another workspace. Any answer but redeemed means do not act: already_redeemed (done, perhaps by your own retry), expired (ask again with a new idempotency_key), wrong_action or params_mismatch (the grant is not used up), params_required (no param_digest), params_unbound (ask again), revoked, or refused. Needs: a key with an action policy (Agents & access › Policies › What each agent may do), where Maplith signs grants.
| Name | Required | Description | Default |
|---|---|---|---|
| digest | Yes | The grant's digest, exactly as it was given to you. Pass it through unchanged: it is a bearer factor — proof you hold what Maplith issued — and NOT a check on the action, because Maplith hashes the parameters in the masked form it stored, so an executor cannot recompute it from the values it holds. What binds the action is system, operation and target_kind, and param_digest. | |
| system | Yes | The system you are about to act in, as the catalogue names it, e.g. "payments". Checked against the request the grant was issued for. | |
| grant_id | Yes | The grant_id from the grant request_action returned. | |
| operation | Yes | The operation you are about to perform, e.g. "issue_refund". Checked against the request the grant was issued for. | |
| request_id | Yes | The request your job says you are fulfilling -- taken from the job you were handed, NOT copied out of the grant, or the check compares the grant with itself. Checked against the grant. | |
| target_kind | Yes | The kind of thing you are about to act on, e.g. "order". Checked against the request the grant was issued for. | |
| param_digest | No | The parameter binding, COMPUTED by you: base64url(HMAC-SHA256(key = the grant's param_salt, base64url-decoded; message = 'maplith-action-params/v1' + newline + the canonical encoding of {system, operation, target: {kind, id}, params} of the action you are about to perform, exactly as it was sent to request_action)). Never copy it out of the grant. Required for every grant that carries a param_salt. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive/non-idempotent, and the description adds real context beyond them: atomic server-side validation, single-use consumption semantics, cross-workspace authorization boundaries (any key of the same workspace, never another's), and the full enumeration of refusal states with their consequences. No contradiction with destructiveHint=true or idempotentHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The critical rule — one redemption, act only on 'redeemed' — is front-loaded and repeated as a safeguard, which is appropriate for a destructive tool. It is a dense run-on paragraph with a long trailing error-code list, so structure could be tighter, but nearly every sentence carries operational weight.
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, and the description compensates by enumerating the return states (redeemed, already_redeemed, expired, wrong_action, params_mismatch, params_required, params_unbound, revoked, refused) and what each implies. Combined with the auth prerequisite ('a key with an action policy'), an agent has everything needed to call and interpret this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description still adds value by explaining *why* each value must come from a particular source (request_id from the job, not the grant; digest as a bearer factor) and by summarizing the HMAC-SHA256 param_digest recipe. Much of this is mirrored in the parameter descriptions, keeping it short of a 5.
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 ('Spend the single-use grant request_action gave you') and immediately distinguishes it from the sibling that issues grants. The one-action/one-redemption scope is spelled out, so an agent knows exactly what this tool does differently from request_action.
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 explicit timing ('immediately before you perform the allowed action'), the gating rule ('act only if the answer is redeemed'), and the failure-handling branch ('any answer but redeemed means do not act') with per-code guidance. It also names the alternative (request_action) and when to re-ask with a new idempotency_key on expiry.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
register_automationRegister an automationAIdempotentInspect
Tell Maplith about an automation your human's business runs in its own systems, so the map knows what depends on each object. Give its name, the system it runs in, and the map objects it reads and writes, at least one, spelled as the map spells them; list_automations shows what is registered. An unknown object name is refused, with the names not found. Add what you know: status (active, paused, never_run, unknown), when it last ran and how that run ended, the team that owns it, its number of steps (modules). Registering the same name in the same system again updates that entry, so call it again to report how it is running; leave reads and writes out to keep the objects. An entry a person confirmed keeps its name, team and objects. It writes an entry in the map only, never runs or connects to the automation; the call is logged. Needs: an autonomous key.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | What the business calls it, at most 200 characters. | |
| team | No | The team that owns it, if known. A team, not a person. | |
| reads | No | Objects of this map it reads, as the map spells them. At most 50. | |
| status | No | Whether it is running. Default for a new entry: unknown. | |
| system | Yes | Where it runs, e.g. the platform or scheduler, at most 100 characters. | |
| writes | No | Objects of this map it writes or changes, as the map spells them. At most 50. | |
| modules | No | How many steps it has, if known. | |
| last_run_at | No | ISO 8601 timestamp of its last run, if known. | |
| last_status | No | How its last run ended, if known: succeeded or failed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: documents the refusal path for unknown object names with the returned not-found names, the upsert-by-name/system identity rule, the guard that human-confirmed entries keep name/team/objects, that it only writes a map entry and never runs the automation, that the call is logged, and that an autonomous key is required.
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?
Front-loaded with the purpose, then requirements, then optional enrichment, then mutation semantics. Dense but each clause carries distinct information; a couple of the long semicolon-chained sentences could be split.
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 9-parameter mutation tool with no output schema, the description covers required inputs, error behavior, idempotency/update semantics, preservation rules, side effects, and auth needs. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline would be 3; the description adds a real constraint not visible in the schema — reads/writes need 'at least one' and must match map spelling — and enumerates status values and the optional fields (last run, ending, owner team, step count).
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 ('tell Maplith about / register an automation') and resource, plus the reason the map cares ('so the map knows what depends on each object'). Explicitly separates itself from list_automations, which is described as the read path.
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?
Covers when to call (reporting an automation, including re-reporting status), what the alternative is ('list_automations shows what is registered'), and the upsert condition ('same name in the same system again updates that entry'). Also specifies the partial-update rule: omit reads/writes to preserve them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
request_actionAsk before actingAIdempotentInspect
Ask Maplith whether you may perform an operation in your human's systems, BEFORE you act, or take back a request of yours that still waits; op says which, ask when left out. op ask: name the catalogue operation (system + operation), the target, params, an explained reason and your idempotency_key. The answer is allowed (act with your own credentials, redeeming the grant with redeem_action_grant first), pending (do not act; show approve_url; an admin decides in the app or in Slack; ask again with the identical request and idempotency_key after their decision) or denied (do not act; why says what to tell your human). No policy: denied; for one the workspace's catalogue declares, the answer says where an admin adds one, and gives propose_policy, the call to ask for it. Maplith never performs the action and never sees your credentials: it decides and keeps the log. op withdraw takes back a request of yours that still waits for a person, when it no longer needs one: pass its request_id and a one-sentence reason the person reads; it becomes withdrawn (nobody decides it, nothing is done, it stays in the log with your reason), only your own, while it waits; needed after all, ask again with a new idempotency_key. list_requests shows what you asked, and record_action records the outcome once you have acted. Examples and the reason format: maplith://docs/mcp. To change rules, use op proposal with proposal, reason and idempotency_key; no operation policy is needed, and a whole-map admin approves, even for an autonomous key. rule_from_finding: a new rule, on once approved. rule_update: a fix to rule_id (new name and/or definition). rule_retire: rule_id no longer fits. watch_from_rule: a live check of a rule that is on. Only objects this key sees, join intermediates included. Never permission to act in another system. Grammar: maplith://docs/signals-and-rules.
| Name | Required | Description | Default |
|---|---|---|---|
| op | No | ask: request an external operation. withdraw: take back a waiting request. proposal: a rule change for a person; needs proposal, reason and idempotency_key. | |
| params | No | The operation's params, e.g. { "amount_dkk": 299 }. | |
| reason | No | op ask: plain lead, then What it does:, Problem:, Value:, each label starting its own line (no invented savings). Technical references in Details:. Total ≤500 characters. See maplith://docs/mcp. op withdraw: why it no longer needs a person, in one sentence, at most 200 characters. | |
| system | No | op ask: the system, as named in the catalogue, e.g. "payments". | |
| target | No | What you act on: its kind as the catalogue names it, and its id in your human's system. | |
| proposal | No | op proposal: the change a whole-map admin approves. | |
| operation | No | The operation, as named in the catalogue, e.g. "issue_refund". | |
| signal_id | No | op ask: the signal that started this, if any. | |
| request_id | No | op withdraw: the request_id request_action returned, or list_requests lists. | |
| idempotency_key | No | op ask: your own key for this request (letters, digits, . _ : -). Asking again with the same key for the same request returns the first answer; the same key for a different request is denied. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it explains that Maplith never performs the action and never sees credentials, that answers can be allowed, pending, or denied, and what each answer means operationally. It also discloses idempotency_key reuse behavior, approval via approve_url or Slack, and that denials may include a propose_policy path.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core instruction is front-loaded, but the description is a long, dense block with many semicolon-separated clauses and embedded policy details. Much of the content is relevant, yet the structure makes it harder to scan and it repeats some schema-level proposal details.
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 complex multi-operation tool with ten nested parameters and no output schema, the description covers the important answer states, approval flow, withdrawal constraints, denial behavior, and references to external documentation. An agent has enough context to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaningful cross-parameter semantics: op defaults to ask, withdraw requires a request_id and one-sentence reason, and idempotency_key reuse can return the first answer or be denied. It also explains proposal kinds and the reason format, though some proposal detail overlaps the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: asking Maplith for permission before acting, withdrawing a waiting request, or proposing a rule change. It explicitly distinguishes this from redeem_action_grant, list_requests, and record_action, so an agent can identify the tool's role without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance: ask before acting, do not act while pending or denied, withdraw only while a request still waits and no longer needs a person, and use proposal for rule changes. It also names alternatives such as redeem_action_grant, list_requests, and record_action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
routeRoute between objectsARead-onlyInspect
Find the shortest verified route between two objects, hop by hop. Per hop: an executable join_spec (leftFile.leftColumn = rightFile.rightColumn, real names; null when the map could not test that hop), the edge's verb and cardinality in the direction the map stores them, strength, coverage and caveats, each object's system, work_done_in (where agents reported working on it) and the PII fields on the path. Use it before fetching data in your human's own systems: it says where to look, by which columns, and how far to trust each step; the map never returns the data itself. Name both objects in any case; the answer uses the map's spelling. Coverage is side-labelled: verified_rate measures join_spec.leftFile rows (blank keys miss), child_coverage child rows finding parents, parent_coverage parents with children; null means unmeasured, and child_key_coverage counts only non-blank keys. Untested hops say so. Each hop has a basis (declared, citing declared_by; measured; guessed), and guessed hops are used only when nothing else connects (guessed_only). Contradictory inferred parent directions are withheld; pinned shapes stay with a shape_conflict warning. A hop that is wrong or missing goes to join_review (op flag).
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Target object name, e.g. "shipment" | |
| from | Yes | Start object name, e.g. "order" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only establish read-only/non-destructive safety; the description adds substantial behavioral context the annotations cannot: exact per-hop return payload (join_spec with real column names, null when untested), coverage semantics for each metric, basis provenance (declared/measured/guessed), guessed_only fallback rules, and withholding/warning behavior for contradictory or pinned shapes.
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?
Purpose is front-loaded and nearly every clause carries operational meaning (coverage definitions, basis rules, escalation). The main weakness is structure: the 'Per hop:' sentence is a long run-on packing six distinct return fields, which would be clearer as a list.
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?
No output schema exists, so the description carries the full burden of explaining the return shape, and it does so field by field (join_spec, verb, cardinality, strength, coverage, system, work_done_in, PII). It also covers edge cases an agent would otherwise guess at: null coverage, untested hops, guessed-only hops, shape conflicts.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents from/to. The description adds a small amount of naming semantics ('the answer uses the map's spelling', 'name both objects in any case'), but nothing about format, casing rules, or validation beyond that. Baseline 3 is appropriate.
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?
Opens with a specific verb+resource ('Find the shortest verified route between two objects, hop by hop') and immediately distinguishes itself from data-fetching siblings by stating the map 'never returns the data itself.' An agent can tell this apart from fetch, search, get_object, and join_review without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly prescribes when to use it ('Use it before fetching data in your human's own systems') and names the escalation path when a hop is wrong or missing ('goes to join_review (op flag)'). It also gives the calling precondition ('Name both objects in any case').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchSearch the mapARead-onlyInspect
Find items on the map by text: objects and fields, findings, processes, metrics, decision statements and approved playbooks, matched case-insensitively. Use it when you do not know the name of what you need; for a task in words call get_task_context, which resolves the affected objects and their rules in one call, and for an object you can name call get_object. Each result has an id for fetch (object:, finding:, process:, metric:, statement:, playbook:). Relations are not searched: use get_object or route. Use ask for an explanation. Results share a 50-document budget across kinds with true per-kind counts; truncated says when more matched. Matching and scope: maplith://docs/mcp.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Words to look for, matched as a case-insensitive substring of names and texts exactly as written: one term or phrase, not a list of keywords or a boolean expression, e.g. "VAT" or "return policy". Spaces and hyphens differ, so "where is my order" misses "where-is-my-order"; one word ("paid") finds more than several ("amount paid total"). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/destructive annotations, it discloses the 50-document shared budget, that per-kind counts are true, and that a 'truncated' flag signals more matches — all non-obvious result behaviors. It also states the matching behavior (case-insensitive) and the scope boundary that relations are excluded.
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?
Front-loaded with purpose, then routing alternatives, then result-id formats for chaining to fetch — dense but each clause carries information. The trailing 'Matching and scope: maplith://docs/mcp' pointer is terse to the point of being opaque, but it is a single clause and does not distract from the core guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by describing result shape (per-kind id formats usable with fetch), the truncation signal, and the result-count budget. Nothing an agent needs to call the tool and interpret its output correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the detailed substring-matching semantics already live in the schema. The description still adds value by reinforcing case-insensitive matching and pointing at the docs URI for matching and scope, though it does not restate the one-term-not-boolean guidance that the schema carries.
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?
Opens with a specific verb and resource ('Find items on the map by text') and enumerates the kinds searched (objects/fields, findings, processes, metrics, statements, playbooks). It explicitly differentiates itself from the sibling tools an agent would otherwise confuse it with (get_task_context, get_object, route, ask).
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 an explicit trigger ('use it when you do not know the name of what you need') and pairs each alternative with the condition that selects it: get_task_context for a task in words, get_object for a nameable object, route for relations, ask for explanations. When-not guidance is stated ('Relations are not searched').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
submit_sourcesUpload source filesAInspect
Upload export files into your human's workspace to build or rebuild their map; then call build_map. files: [{path, content, encoding?}]. path starts with the system folder (shopify/orders.csv, dinero/postings.csv): the folder name becomes the system in the map, so leave out a shared root folder. content is the file as text (CSV, JSON, JSONL, Markdown, VTT, mbox) or, with encoding base64, an Excel workbook (.xlsx, up to 20 sheets and 50,000 rows per sheet, each sheet a CSV) or a PDF (its text layer, first 100 pages; a scanned PDF is listed as unreadable). Images, audio, video and archives are refused. Up to 100 files and 5 MB per call, 2 MB per file; call again with the returned upload_id to add more (300 files / 80 MB per upload); an upload not built within 24 hours is deleted. If you cannot read a system directly, ask your human to export into one shared folder, one subfolder per system; too large to pass through you, your human uploads the folder on Data sources › Scans. Needs: a key with upload consent.
| Name | Required | Description | Default |
|---|---|---|---|
| files | Yes | Files to add: relative path with a system folder, content as text or base64. | |
| upload_id | No | Continue an upload: the id a previous submit_sources call returned. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnlyHint=false, destructiveHint=false, idempotentHint=false): discloses quotas (100 files, 5 MB per call, 2 MB per file, 300 files / 80 MB per upload), a 24-hour deletion lifecycle for unbuilt uploads, refused media types, the 20-sheet/50,000-row Excel expansion, PDF text-layer-only extraction with the scanned-PDF failure mode, and the upload-consent key requirement. That is the behavioral detail an agent needs before calling.
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?
Front-loaded with purpose and the next call, then constraints in rough priority order. It is dense and semicolon-chained rather than cleanly sectioned, but nearly every clause carries operational information (formats, limits, lifecycle, fallbacks) rather than 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?
For a two-parameter upload tool with no output schema, the description supplies the full operating picture: prerequisites (upload consent key), size and count ceilings, expiry, unsupported types, failure handling, and the required follow-up call. Nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: the leading folder name becomes the system in the map, a shared root folder must be omitted, and the accepted content formats and encoding pairing are spelled out. It stops short of clarifying edge cases like path collisions or how upload_id interacts with a fresh files array.
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?
Opens with a specific verb and resource ('Upload export files into your human's workspace to build or rebuild their map') and immediately names the follow-up sibling, build_map. An agent can distinguish this from build_map and list_sources 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit sequencing ('then call build_map'), an incremental-add path ('call again with the returned upload_id'), and two concrete fallbacks: ask the human to export into one shared folder with one subfolder per system, or have them upload via Data sources › Scans when files are too large. When-to-use, when-not, and alternatives are all present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suggest_featureSuggest a feature or report a bugAIdempotentInspect
Tell Maplith what its own MCP server lacks or gets wrong; a problem in your human's data is a finding, not a suggestion. kind improvement (default): the map lacks a tool, field or answer shape; filed in Maplith's tracker, you get its URL. kind bug: a Maplith tool failed, answered wrongly or contradicts its docs; give tool, problem, expected and got, and it reaches Maplith as your human's report with a reference and follow_url. Capability only, never data: no records, values, names, credentials or identifiers. Maplith tries to mask what slips through; the text leaves the workspace. A few per workspace per day.
| Name | Required | Description | Default |
|---|---|---|---|
| got | No | bug: what it answered or its error text; no data values. | |
| kind | No | improvement (default): a capability the map lacks. bug: a Maplith tool failed, answered wrongly or contradicts its docs. | |
| tool | No | bug: the tool name. | |
| title | Yes | One line: the capability (e.g. "Expose field-level lineage") or what went wrong. | |
| problem | No | bug: error (it failed), wrong_answer, contradicts_docs, or incomplete (it left out what the docs say it carries). | |
| expected | No | bug: what the tool should have answered; no data values. | |
| description | No | improvement: what it is and why. | |
| error_class | No | bug: its error code, if any. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial context beyond annotations: submissions are filed externally, the text leaves the workspace, Maplith tries to mask leaked data, and a follow-up URL or reference is returned. It also discloses a per-workspace daily rate limit. These details matter for a write/submission tool with openWorldHint=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is dense but front-loaded, starting with the core purpose and then covering kind, privacy, and rate limits. Every clause carries operational meaning, though the semicolon-heavy style makes some sentences harder to scan than necessary.
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 an 8-parameter submission tool with no output schema, the description covers the essential behavior: what gets filed, what data must not be included, where the text goes, what reference or follow-up URL is returned, and the rate limit. An agent has enough to call it correctly and safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents each parameter. The description adds cross-field guidance, especially that bug reports should bundle tool, problem, expected, and got, and it reinforces the capability-only constraint across all inputs. It stops short of adding 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?
The description states a specific action: tell Maplith what its own MCP server lacks or gets wrong. It immediately distinguishes this from reporting a data problem by saying such a problem is a finding, not a suggestion. An agent can tell this apart from sibling tools like list_findings or answer_question.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly routes the agent by kind: improvement for missing capability, bug for a failed or wrong Maplith tool. It also gives a clear exclusion: problems in the human's data belong in findings, not here. The default kind and the bug-specific required inputs are stated directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
take_signalTake a signalAIdempotentInspect
Say you are working on a signal, so no other agent does the same work: it moves from open to in_progress, held by your key until held_until (24 hours unless you ask for 1 to 72); taking it again renews the hold. Pass the signal's created_at as signal_version exactly as list_signals or get_task_context returned it: you take the signal you read, never one a scan has rewritten since. Refused when another agent holds it, when someone else planned it and the plan is not past its date, when it waits on a person, or when it is done. With plan: true you pick it up for later: planned by your key with an optional due date (within the workspace's cap, by default 7 days for urgent, 30 for attention, 90 for info), and no other agent takes or plans it until then; the workspace limits how often one episode is planned. Finish with record_action (the answer's then names the call); to give it up, record outcome needs_human. If you report nothing, the hold runs out and the signal goes back to open. It changes nothing in any system. Needs: a key that may act, with approval or autonomously.
| Name | Required | Description | Default |
|---|---|---|---|
| due | No | With plan: when you will have handled it, an ISO 8601 date or date and time: within the workspace’s severity cap (defaults: urgent 7 days, attention 30 days, info 90 days). Without a date: seven days or the shorter workspace cap. | |
| plan | No | Plan it for later instead of taking it now: planned by your key until due. | |
| hours | No | How long to hold it, 1 to 72. Default 24. Not with plan. | |
| signal_id | Yes | The signal from list_signals or get_task_context. | |
| signal_version | Yes | The signal's created_at exactly as list_signals or get_task_context returned it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations by disclosing hold duration and its default, renewal on re-take, expiration behavior when you report nothing, a per-episode planning rate limit, and severity-based planning caps. 'It changes nothing in any system' plus the key/permission requirement ('a key that may act, with approval or autonomously') fill in the auth and side-effect profile the annotations only gesture at.
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?
Purpose and state transition are front-loaded, and every clause carries operational information. It is dense and semicolon-chained, though, so the refusal list and planning rules are harder to scan than they need to be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still covers the full lifecycle an agent needs: how to acquire, how long it holds, how it expires, how to release, how to complete, and what blocks acquisition. Nothing required to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the schema baseline is 3, but the description adds rationale the schema lacks: signal_version is an optimistic-concurrency guard ('you take the signal you read, never one a scan has rewritten since') and hours is mutually exclusive with plan, with the renewal semantics behind repeat calls. That is meaningful meaning beyond field-level text.
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 ('take' a 'signal') and the exact state transition it causes (open -> in_progress, held by your key). It is immediately distinguishable from list_signals (read) and record_action (finish) named in the same text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: use it to claim work now, use plan: true to pick it up for later, use record_action to finish, and record outcome needs_human to release. It enumerates the exact refusal conditions (held by another, planned by someone else and not past date, waiting on a person, done) so the agent can pre-check instead of guessing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_finding_statusUpdate finding statusAIdempotentInspect
Change a finding's lifecycle status: open, planned, automated or dismissed. Use it when your human has decided what a finding is (list_findings gives the finding_id); use record_action for work on a signal. The change is logged. Needs: a key that may act; with approval the change waits for an admin, autonomous applies it at once.
| Name | Required | Description | Default |
|---|---|---|---|
| status | Yes | The new status: open (back to unaddressed), planned (someone will address it), automated (an automation handles it), dismissed (not a problem here). | |
| finding_id | Yes | Finding id from list_findings |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses that the change is logged, that the caller needs a key authorized to act, and that approval mode makes the change wait for an admin while autonomous mode applies it immediately. This adds the permission and approval semantics the annotations do not cover, and nothing contradicts idempotentHint/destructiveHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences with the lifecycle action front-loaded and no filler, though the telegraphic 'Needs: a key that may act' phrasing is slightly compressed and takes a re-read. Overall efficient for the amount of routing and permission context it packs in.
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?
Covers purpose, sourcing of the id, alternative tool, logging, authorization, and the approval-vs-autonomous outcome. No output schema exists, but the description gives enough about what happens after the call (logged; may wait for approval) that an agent can invoke it correctly.
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 enum values are already explained in the schema, so the description adds little parameter meaning beyond repeating the four statuses. The only extra hint, that finding_id comes from list_findings, is also present in the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (change) plus resource (finding's lifecycle status) and enumerates the four target states, so scope is unambiguous. It also explicitly separates itself from record_action, which handles work on a signal rather than the finding's status.
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 an explicit trigger ("when your human has decided what a finding is"), names the alternative tool and the condition that selects it (record_action for work on a signal), and tells the agent where the finding_id comes from (list_findings). Both when-to-use and the alternative routing are spelled out.
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 tool update
- Changed
request_action7 fields changed- changed
Input schema / properties / op / descriptionPrevious value: -"ask: request an external operation. withdraw: take back a waiting request. proposal: suggest a rule or live check for a person; needs proposal, reason and idempotency_key."New value: +"ask: request an external operation. withdraw: take back a waiting request. proposal: a rule change for a person; needs proposal, reason and idempotency_key." - changed
Input schema / properties / proposal / descriptionPrevious value: -"op proposal: the rule or live check you suggest, for a whole-map admin to approve."New value: +"op proposal: the change a whole-map admin approves." - removed
Input schema / properties / proposal / properties / kind / descriptionRemoved value: -"rule_from_finding: a new rule, saved switched off. watch_from_rule: a live check of an enabled rule." - changed
Input schema / properties / proposal / properties / kind / enumPrevious value: -[ - "rule_from_finding", - "watch_from_rule" -]New value: +[ + "rule_from_finding", + "rule_update", + "rule_retire", + "watch_from_rule" +] - added
Input schema / properties / proposal / properties / reasonAdded value: +{ + "description": "rule_retire: why, one sentence of ≤160 characters.", + "maxLength": 200, + "type": "string" +} - changed
Input schema / properties / proposal / properties / rule_id / descriptionPrevious value: -"An enabled rule id for a live check."New value: +"The rule to fix, retire or check live." - added
Input schema / properties / proposal / properties / rule_versionAdded value: +{ + "description": "As read.", + "type": "integer" +}
2 tool updates
- Changed
answer_question13 fields changed- changed
Input schema / properties / answers / descriptionPrevious value: -"field_identity: one entry per column, each answered once: accept the suggestion, or name the answer (and the field_id with same_as)."New value: +"field_identity: each column once." - changed
Input schema / properties / answers / items / properties / accept_suggestion / descriptionPrevious value: -"true to take Maplith's suggestion for this column."New value: +"true takes Maplith's suggestion." - changed
Input schema / properties / answers / items / properties / answer / descriptionPrevious value: -"same_as: this column is the field named by field_id. new: a field the map has not seen. other_table: the whole file is another table than Maplith assumed (pass it alone, once)."New value: +"same_as: the field named by field_id. new: a field the map has not seen. other_table: the whole file is another table (alone, once)." - changed
Input schema / properties / answers / items / properties / field_version_id / descriptionPrevious value: -"The column, as get_task_context lists it."New value: +"The column, as listed." - changed
Input schema / properties / columns / descriptionPrevious value: -"grain: one or two of the columns the question lists, or [] for none."New value: +"grain: one or two of the listed columns, or []." - changed
Input schema / properties / dialect / descriptionPrevious value: -"schema_dialect: the dialect the file shows, postgresql or mysql."New value: +"schema_dialect: what the file shows." - added
Input schema / properties / itemsAdded value: +{ + "description": "auto_detected: each item once.", + "items": { + "additionalProperties": false, + "properties": { + "answer": { + "description": "not_right: not worked on (there). same_as: the type is the map object in same_as.", + "enum": [ + "confirm", + "not_right", + "same_as" + ], + "type": "string" + }, + "item_id": { + "description": "From fieldwork_objects or work_done_in.", + "type": "string" + }, + "same_as": { + "description": "With same_as: the map object.", + "type": "string" + } + }, + "required": [ + "item_id", + "answer" + ], + "type": "object" + }, + "maxItems": 100, + "minItems": 1, + "type": "array" +} - changed
Input schema / properties / kind / descriptionPrevious value: -"Which question: field_identity (a field_identity_unsure signal; pass question_id and answers), grain (grain_unsure; signal_id, columns, reason), schema_dialect (schema_dialect_unsure; signal_id, dialect, reason) or lineage_direction (lineage_direction_unsure; signal_id, original, reason)."New value: +"field_identity takes question_id and answers; grain signal_id, columns, reason; schema_dialect signal_id, dialect, reason; lineage_direction signal_id, original, reason; auto_detected items, reason." - changed
Input schema / properties / kind / enumPrevious value: -[ - "field_identity", - "grain", - "schema_dialect", - "lineage_direction" -]New value: +[ + "field_identity", + "grain", + "schema_dialect", + "lineage_direction", + "auto_detected" +] - changed
Input schema / properties / original / descriptionPrevious value: -"lineage_direction: the file that holds the original, one of payload.options."New value: +"lineage_direction: one of payload.options." - changed
Input schema / properties / question_id / descriptionPrevious value: -"field_identity: the question_id from get_task_context's field_identity block, or the signal's payload."New value: +"field_identity: from get_task_context's field_identity block." - changed
Input schema / properties / reason / descriptionPrevious value: -"For grain, schema_dialect and lineage_direction: what you checked in the file or in your human's own systems; 10 to 500 characters, no data values."New value: +"What you checked in the file or your human's own systems; no data values." - changed
Input schema / properties / signal_id / descriptionPrevious value: -"For grain, schema_dialect and lineage_direction: the signal from list_signals or get_task_context."New value: +"The signal from list_signals or get_task_context."
- Changed
record_action1 field changed- changed
Input schema / properties / work / properties / objects / descriptionPrevious value: -"Object name → non-personal case reference. Also name the client or channel the work was for, never a person. Empty is a count without a process case. For a key that sees the whole map, a name the map lacks is kept as a proposal for a person, never added on its own."New value: +"Object name → non-personal case reference. Also name the client or channel the work was for, never a person. Empty is a count without a process case. For a key that sees the whole map, a name the map lacks goes on the map as auto-detected once reports name it three times over two days."
1 tool update
- Changed
list_signals1 field changed- changed
Input schema / properties / kinds / items / enumPrevious value: -[ - "finding_added", - "finding_resolved", - "finding_changed", - "process_deviation", - "process_silent", - "structure_changed", - "metric_threshold", - "metric_trend", - "link_dead", - "external", - "rule_fired", - "rule_cleared", - "rule_broken", - "map_rolled_back", - "watch_silent", - "cpr_file_names", - "join_review", - "fix_approved", - "agents_paused", - "agents_resumed", - "setup_gap", - "routine_due", - "automation_failed", - "ci_failed", - "deploy_failed", - "security_alert", - "dmarc_drift", - "support_case_opened", - "field_identity_unsure", - "field_meaning_changed", - "thread_started", - "schema_dialect_unsure", - "lineage_direction_unsure", - "grain_unsure", - "map_confidence_dropped" -]New value: +[ + "finding_added", + "finding_resolved", + "finding_changed", + "process_deviation", + "process_silent", + "structure_changed", + "metric_threshold", + "metric_trend", + "link_dead", + "external", + "rule_fired", + "rule_cleared", + "rule_broken", + "map_rolled_back", + "watch_silent", + "cpr_file_names", + "join_review", + "fix_approved", + "agents_paused", + "agents_resumed", + "setup_gap", + "routine_due", + "automation_failed", + "ci_failed", + "deploy_failed", + "security_alert", + "dmarc_drift", + "support_case_opened", + "field_identity_unsure", + "field_meaning_changed", + "thread_started", + "schema_dialect_unsure", + "lineage_direction_unsure", + "grain_unsure", + "map_confidence_dropped", + "unblocked" +]
2 tool updates
- Changed
list_findings2 fields changed- changed
Input schema / properties / status / descriptionPrevious value: -"Only findings in this state: open (not yet addressed), planned (someone plans to address it), automated (an automation handles it), dismissed (judged not a problem here). Omit for every status."New value: +"Only findings in this state: open (not yet addressed), planned (someone plans to address it), automated (an automation handles it), dismissed (judged not a problem here), approved (a person approved the fix). Omit for every status." - changed
Input schema / properties / status / enumPrevious value: -[ - "open", - "planned", - "automated", - "dismissed" -]New value: +[ + "open", + "planned", + "automated", + "dismissed", + "approved" +]
- Changed
list_signals1 field changed- changed
Input schema / properties / kinds / items / enumPrevious value: -[ - "finding_added", - "finding_resolved", - "finding_changed", - "process_deviation", - "process_silent", - "structure_changed", - "metric_threshold", - "metric_trend", - "link_dead", - "external", - "rule_fired", - "rule_cleared", - "rule_broken", - "map_rolled_back", - "watch_silent", - "cpr_file_names", - "join_review", - "agents_paused", - "agents_resumed", - "setup_gap", - "routine_due", - "automation_failed", - "ci_failed", - "deploy_failed", - "security_alert", - "dmarc_drift", - "support_case_opened", - "field_identity_unsure", - "field_meaning_changed", - "thread_started", - "schema_dialect_unsure", - "lineage_direction_unsure", - "grain_unsure", - "map_confidence_dropped" -]New value: +[ + "finding_added", + "finding_resolved", + "finding_changed", + "process_deviation", + "process_silent", + "structure_changed", + "metric_threshold", + "metric_trend", + "link_dead", + "external", + "rule_fired", + "rule_cleared", + "rule_broken", + "map_rolled_back", + "watch_silent", + "cpr_file_names", + "join_review", + "fix_approved", + "agents_paused", + "agents_resumed", + "setup_gap", + "routine_due", + "automation_failed", + "ci_failed", + "deploy_failed", + "security_alert", + "dmarc_drift", + "support_case_opened", + "field_identity_unsure", + "field_meaning_changed", + "thread_started", + "schema_dialect_unsure", + "lineage_direction_unsure", + "grain_unsure", + "map_confidence_dropped" +]
3 tool updates
- Changed
get_object1 field changed- added
Input schema / properties / contextAdded value: +{ + "description": "{\"client\": \"<company>\"} (never a person): adds its confirmed variation.", + "type": "object" +}
- Changed
get_task_context1 field changed- added
Input schema / properties / contextAdded value: +{ + "description": "{\"client\": \"<company>\"} (never a person): adds its confirmed variation.", + "type": "object" +}
- Changed
record_action1 field changed- changed
Input schema / properties / work / properties / objects / descriptionPrevious value: -"Object name → non-personal case reference. Empty is a count without a process case. For a key that sees the whole map, a name the map lacks is kept as a proposal for a person, never added on its own."New value: +"Object name → non-personal case reference. Also name the client or channel the work was for, never a person. Empty is a count without a process case. For a key that sees the whole map, a name the map lacks is kept as a proposal for a person, never added on its own."
5 tool updates
- Changed
draft_playbook1 field changed- changed
Input schema / properties / playbook_id / descriptionPrevious value: -"steps or time: the playbook, as get_task_context names it."New value: +"steps or time: the playbook, as get_task_context names it, or the id after playbook: in a search result."
- Changed
get_object1 field changed- changed
Input schema / properties / statements_only / descriptionPrevious value: -"Rules without other context."New value: +"Rules alone, {} when none apply; call again with it only when your client cut a long answer."
- Changed
get_task_context2 fields changed- changed
Input schema / properties / statements_only / descriptionPrevious value: -"Rules without other context."New value: +"Rules alone, {} when none apply; call again with it only when your client cut a long answer." - changed
Input schema / properties / task / properties / references / descriptionPrevious value: -"Object names, paths or URLs."New value: +"Map object names, file paths or URLs; never a record id such as an order number."
- Changed
request_action2 fields changed- changed
Input schema / properties / proposal / properties / definition / descriptionPrevious value: -"Rules grammar: {per:{object,key},all:[conditions],any:[conditions]}. A condition: {term:{fn:SUM|COUNT|AVG|MIN|MAX|LAST,object,field?,at?,window?:{field,days:1..90}},op:=|!=|<|<=|>|>=,value:number} or other:term. Map names only; no suggested action."New value: +"Rules grammar: {per:{object,key},all:[conditions],any:[conditions]}. A condition: {term:{fn:SUM|COUNT|AVG|MIN|MAX|LAST,object,field?,at?,window?:{field,days:1..90}},op:=|!=|<|<=|>|>=,value:number} or other:term. Values are numbers: no text match (status = paid) and no date age; a window counts only rows dated in its last days. E.g. per product, under 5 in stock: {per:{object:\"product\",key:\"sku\"},all:[{term:{fn:\"SUM\",object:\"stock_item\",field:\"quantity\"},op:\"<\",value:5}]}. Map names only; no suggested action." - changed
Input schema / properties / reason / descriptionPrevious value: -"op ask: plain lead, then What it does:, Problem:, Value: (no invented savings). Technical references in Details:. Total ≤500 characters. See maplith://docs/mcp. op withdraw: why it no longer needs a person, in one sentence, at most 200 characters."New value: +"op ask: plain lead, then What it does:, Problem:, Value:, each label starting its own line (no invented savings). Technical references in Details:. Total ≤500 characters. See maplith://docs/mcp. op withdraw: why it no longer needs a person, in one sentence, at most 200 characters."
- Changed
search1 field changed- changed
Input schema / properties / query / descriptionPrevious value: -"Words to look for, matched as a case-insensitive substring of names and texts; one term or phrase, not a boolean expression, e.g. \"VAT\" or \"return policy\"."New value: +"Words to look for, matched as a case-insensitive substring of names and texts exactly as written: one term or phrase, not a list of keywords or a boolean expression, e.g. \"VAT\" or \"return policy\". Spaces and hyphens differ, so \"where is my order\" misses \"where-is-my-order\"; one word (\"paid\") finds more than several (\"amount paid total\")."
1 tool update
- Changed
request_action4 fields changed- added
Input schema / properties / proposal / descriptionAdded value: +"op proposal: the rule or live check you suggest, for a whole-map admin to approve." - added
Input schema / properties / proposal / properties / kind / descriptionAdded value: +"rule_from_finding: a new rule, saved switched off. watch_from_rule: a live check of an enabled rule." - added
Input schema / properties / proposal / properties / name / descriptionAdded value: +"A short name a person recognises." - added
Input schema / properties / proposal / properties / urgency / descriptionAdded value: +"How urgent a signal the rule raises: info, attention or urgent."
2 tool updates
- Changed
record_action2 fields changed- changed
Input schema / properties / work / properties / objects / descriptionPrevious value: -"Object name → non-personal case reference. Empty is a count without a process case."New value: +"Object name → non-personal case reference. Empty is a count without a process case. For a key that sees the whole map, a name the map lacks is kept as a proposal for a person, never added on its own." - added
Input schema / properties / work / properties / systemAdded value: +{ + "description": "The system you did the work in, as list_sources names it or as the product writes its name. Tells the next agent where this work happens; never a link, an address or a person.", + "maxLength": 60, + "type": "string" +}
- Changed
request_action2 fields changed- changed
Input schema / properties / op / descriptionPrevious value: -"ask: request an external operation. withdraw: take back a waiting request. proposal: suggest a rule or watch for a person; needs proposal, reason and idempotency_key."New value: +"ask: request an external operation. withdraw: take back a waiting request. proposal: suggest a rule or live check for a person; needs proposal, reason and idempotency_key." - changed
Input schema / properties / proposal / properties / rule_id / descriptionPrevious value: -"An enabled rule id for a watch."New value: +"An enabled rule id for a live check."
1 tool update
- Changed
draft_playbook7 fields changed- added
Input schema / properties / manual_minutesAdded value: +{ + "description": "time answer: only the person’s stated minutes, at most two decimal places.", + "maximum": 1000000, + "minimum": 0, + "type": "number" +} - changed
Input schema / properties / part / descriptionPrevious value: -"steps: the steps of a playbook Maplith wrote without them (playbook_id, steps, handoff, completion?). whole: a new playbook for a signal kind nothing handles (signal_kind, title, purpose, problem, value, trigger, steps, completion, exceptions?, licence?, signal_ids)."New value: +"time: optional person-stated manual time for a playbook (playbook_id, time_mode). steps: the steps of a playbook Maplith wrote without them (playbook_id, steps, handoff, completion?). whole: a new playbook for a signal kind nothing handles (signal_kind, title, purpose, problem, value, trigger, steps, completion, exceptions?, licence?, signal_ids)." - changed
Input schema / properties / part / enumPrevious value: -[ - "whole", - "steps" -]New value: +[ + "whole", + "steps", + "time" +] - changed
Input schema / properties / playbook_id / descriptionPrevious value: -"steps: the playbook, as get_task_context names it."New value: +"steps or time: the playbook, as get_task_context names it." - added
Input schema / properties / time_basisAdded value: +{ + "description": "person_stated: the person explicitly gave these minutes or chose to skip; never an estimate.", + "enum": [ + "person_stated" + ], + "type": "string" +} - added
Input schema / properties / time_modeAdded value: +{ + "description": "time: status first; ask claims the one question. answer or skip records the person’s explicit response.", + "enum": [ + "status", + "ask", + "answer", + "skip" + ], + "type": "string" +} - added
Input schema / properties / time_statement_idAdded value: +{ + "description": "time: latest statement token from status; null before the first answer.", + "type": [ + "string", + "null" + ] +}
2 tool updates
- Changed
record_action1 field changed- changed
Input schema / properties / work / descriptionPrevious value: -"Work with no signal/request; object names exactly as the map shows. References name things (edition, page, order), never people. No task, resolution, episode or signal_version."New value: +"Work with no signal/request; object names exactly as the map shows. References name things (edition, page, order), never people. Repeats can become a draft for an admin at the next scan. No task, resolution, episode or signal_version."
- Changed
request_action3 fields changed- changed
Input schema / properties / op / descriptionPrevious value: -"ask (the default): ask whether you may do one operation; needs system, operation, target, params, reason and idempotency_key. withdraw: take back one of your requests that still waits; needs request_id and reason."New value: +"ask: request an external operation. withdraw: take back a waiting request. proposal: suggest a rule or watch for a person; needs proposal, reason and idempotency_key." - changed
Input schema / properties / op / enumPrevious value: -[ - "ask", - "withdraw" -]New value: +[ + "ask", + "withdraw", + "proposal" +] - added
Input schema / properties / proposalAdded value: +{ + "additionalProperties": false, + "properties": { + "definition": { + "description": "Rules grammar: {per:{object,key},all:[conditions],any:[conditions]}. A condition: {term:{fn:SUM|COUNT|AVG|MIN|MAX|LAST,object,field?,at?,window?:{field,days:1..90}},op:=|!=|<|<=|>|>=,value:number} or other:term. Map names only; no suggested action.", + "type": "object" + }, + "finding_id": { + "description": "Optional visible finding for a rule.", + "type": "string" + }, + "kind": { + "enum": [ + "rule_from_finding", + "watch_from_rule" + ], + "type": "string" + }, + "mode": { + "description": "A: assistant checks on schedule; B: your system sends changes.", + "enum": [ + "A", + "B" + ], + "type": "string" + }, + "name": { + "maxLength": 120, + "type": "string" + }, + "rule_id": { + "description": "An enabled rule id for a watch.", + "type": "string" + }, + "urgency": { + "enum": [ + "info", + "attention", + "urgent" + ], + "type": "string" + } + }, + "required": [ + "kind" + ], + "type": "object" +}
6 tool updates
- Changed
list_signals1 field changed- added
Input schema / properties / orderAdded value: +{ + "description": "newest (default): newest first. urgency: urgent, then attention, then info, newest first within each; pass the same order with its cursor.", + "enum": [ + "newest", + "urgency" + ], + "type": "string" +}
- Removed
list_stated_relationships - Changed
record_action3 fields changed- changed
Input schema / properties / outcome / descriptionPrevious value: -"done: settled (with a resolution). needs_human: you got as far as you could; a person decides, and task says what they do next. skipped: it turned out not to matter (with a resolution)."New value: +"With work: done or skipped, without a resolution. On a signal, done: settled (with a resolution). needs_human: you got as far as you could; a person decides, and task says what they do next. skipped: it turned out not to matter (with a resolution)." - changed
Input schema / properties / signal_version / descriptionPrevious value: -"The signal's created_at exactly as list_signals or get_task_context returned it, so Maplith knows which version of the signal your summary is about. Required when your key is limited to part of the map: if you leave it out, or a scan re-stamped the signal after you read it, nothing is recorded and you are told to read the signal again. When you pass a request_id whose request named no signal there is no version to name: pass an empty string. Every scan that emits a signal again moves its version, whether or not anything about the signal changed, so read it again and look before you record. For a key that sees the whole map the record is still kept in those cases, but is hidden from keys limited to part of the map, and those keys keep seeing the signal as not acted: list_signals with unacted: true hands it to them until someone records against its current created_at."New value: +"The signal's created_at exactly as list_signals or get_task_context returned it, so Maplith knows which version of the signal your summary is about. When recording a signal, a key limited to part of the map must send signal_version: if you leave it out, or a scan re-stamped the signal after you read it, nothing is recorded and you are told to read the signal again. When you pass a request_id whose request named no signal there is no version to name: pass an empty string. Omit signal_version with work. Every scan that emits a signal again moves its version, whether or not anything about the signal changed, so read it again and look before you record. For a key that sees the whole map the record is still kept in those cases, but is hidden from keys limited to part of the map, and those keys keep seeing the signal as not acted: list_signals with unacted: true hands it to them until someone records against its current created_at." - added
Input schema / properties / workAdded value: +{ + "additionalProperties": false, + "description": "Work with no signal/request; object names exactly as the map shows. References name things (edition, page, order), never people. No task, resolution, episode or signal_version.", + "properties": { + "at": { + "description": "ISO timestamp with timezone, within the last 90 days, never future; default now.", + "maxLength": 40, + "type": "string" + }, + "kind": { + "description": "Short work kind, e.g. newsletter.published.", + "maxLength": 60, + "pattern": "^[a-z][a-z0-9_]*(?:\\.[a-z][a-z0-9_]*)*$", + "type": "string" + }, + "objects": { + "additionalProperties": { + "maxLength": 80, + "minLength": 1, + "type": "string" + }, + "description": "Object name → non-personal case reference. Empty is a count without a process case.", + "maxProperties": 5, + "type": "object" + } + }, + "required": [ + "kind", + "objects" + ], + "type": "object" +}
- Removed
record_dmarc_rung - Changed
request_action7 fields changed- changed
Input schema / properties / idempotency_key / descriptionPrevious value: -"Your own key for this request (letters, digits, . _ : -). Asking again with the same key for the same request returns the first answer; the same key for a different request is denied."New value: +"op ask: your own key for this request (letters, digits, . _ : -). Asking again with the same key for the same request returns the first answer; the same key for a different request is denied." - added
Input schema / properties / opAdded value: +{ + "description": "ask (the default): ask whether you may do one operation; needs system, operation, target, params, reason and idempotency_key. withdraw: take back one of your requests that still waits; needs request_id and reason.", + "enum": [ + "ask", + "withdraw" + ], + "type": "string" +} - changed
Input schema / properties / reason / descriptionPrevious value: -"Plain lead, then What it does:, Problem:, Value: (no invented savings). Technical references in Details:. Total ≤500 characters. See maplith://docs/mcp."New value: +"op ask: plain lead, then What it does:, Problem:, Value: (no invented savings). Technical references in Details:. Total ≤500 characters. See maplith://docs/mcp. op withdraw: why it no longer needs a person, in one sentence, at most 200 characters." - added
Input schema / properties / request_idAdded value: +{ + "description": "op withdraw: the request_id request_action returned, or list_requests lists.", + "type": "string" +} - changed
Input schema / properties / signal_id / descriptionPrevious value: -"The signal that started this, if any."New value: +"op ask: the signal that started this, if any." - changed
Input schema / properties / system / descriptionPrevious value: -"The system, as named in the catalogue, e.g. \"payments\"."New value: +"op ask: the system, as named in the catalogue, e.g. \"payments\"." - changed
Input schema / requiredPrevious value: -[ - "system", - "operation", - "target", - "params", - "reason", - "idempotency_key" -]New value: +[]
- Removed
withdraw_request
12 tool updates
- Changed
configure_metric1 field changed- changed
Input schema / properties / name / descriptionPrevious value: -"The metric name, as list_metrics gives it."New value: +"The metric name, as get_metric lists it."
- Added
draft_playbook - Removed
draft_playbook_steps - Removed
estimate_scan - Removed
flag_join - Changed
get_metric2 fields changed- changed
Input schema / properties / name / descriptionPrevious value: -"Metric name from list_metrics"New value: +"The metric to read, as the list spells it. Omit it to list every metric." - removed
Input schema / requiredRemoved value: -[ - "name" -]
- Changed
get_process2 fields changed- changed
Input schema / properties / object_type / descriptionPrevious value: -"Central object of the process, e.g. \"order\""New value: +"Central object of the process to read, as the list spells it, e.g. \"order\". Omit it to list every process." - removed
Input schema / requiredRemoved value: -[ - "object_type" -]
- Added
join_review - Removed
list_metrics - Removed
list_processes - Removed
propose_playbook - Removed
report_join_check
Publisher details
- Operator
- Maplith ApS · Publisher source
- Operator website
- https://maplith.com
- Vendor relationship
- First-party
- Documentation
- https://maplith.com/docs/mcp
- Trust center
- https://maplith.com/security
- Restrictions
- Requires a Maplith account with a workspace and a map. Sign-in is OAuth with the Maplith account; each agent sees only what a workspace admin has granted its key.
Related MCP Connectors
Your company's brain for AI agents. Cited, permission-aware knowledge across every system.
End-to-end agent-managed company brain. Docs, diagrams, plans, databases, agents, Knowledge Graph.
Company brain for AI agents — temporal knowledge graph search, exploration, and durable memory.
The second brain your AI agents share. It builds itself from your work and keeps itself current.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnd-to-end agent-managed company brain. Humans and any MCP agent co-author living docs (Markdown + extensions), 40+ visual diagrams (Mermaid, BPMN, D2, PlantUML, ELK, Excalidraw), plans, and a self-learning Knowledge Graph. 163 tools across 16 categories. Auth: OAuth 2.1 or API key. Lean, secure, affordable — from individuals to enterprise.MIT

monday MCP Serverofficial
AlicenseAqualityCmaintenanceEnable AI agents to work reliably - giving them secure access to structured data, tools to take action, and the context needed to make smart decisions.853,342 npm436MIT- FlicenseNot gradedqualityDmaintenanceEnables AI tools to share a company-structured context graph for consistent project knowledge across the team.-
- AlicenseNot gradedqualityBmaintenanceA frontier knowledge base that’s minimal extensible and agent-native. Built to keep your team’s shared context current and inspectable.1,718Apache 2.0
Glama MCP Gateway
Add one secure layer between your agents and this server.