Skip to main content
Glama

Ask before acting

request_action
Idempotent

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.

Input Schema

NameRequiredDescriptionDefault
opNoask: request an external operation. withdraw: take back a waiting request. proposal: a rule change for a person; needs proposal, reason and idempotency_key.
paramsNoThe operation's params, e.g. { "amount_dkk": 299 }.
reasonNoop 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.
systemNoop ask: the system, as named in the catalogue, e.g. "payments".
targetNoWhat you act on: its kind as the catalogue names it, and its id in your human's system.
proposalNoop proposal: the change a whole-map admin approves.
operationNoThe operation, as named in the catalogue, e.g. "issue_refund".
signal_idNoop ask: the signal that started this, if any.
request_idNoop withdraw: the request_id request_action returned, or list_requests lists.
idempotency_keyNoop 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.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed7 schema fields changed
    • changedInput schema / properties / op / description
      Previous 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."
    • changedInput schema / properties / proposal / description
      Previous 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."
    • removedInput schema / properties / proposal / properties / kind / description
      Removed value: -"rule_from_finding: a new rule, saved switched off. watch_from_rule: a live check of an enabled rule."
    • changedInput schema / properties / proposal / properties / kind / enum
      Previous value: -[
      -  "rule_from_finding",
      -  "watch_from_rule"
      -]New value: +[
      +  "rule_from_finding",
      +  "rule_update",
      +  "rule_retire",
      +  "watch_from_rule"
      +]
    • addedInput schema / properties / proposal / properties / reason
      Added value: +{
      +  "description": "rule_retire: why, one sentence of ≤160 characters.",
      +  "maxLength": 200,
      +  "type": "string"
      +}
    • changedInput schema / properties / proposal / properties / rule_id / description
      Previous value: -"An enabled rule id for a live check."New value: +"The rule to fix, retire or check live."
    • addedInput schema / properties / proposal / properties / rule_version
      Added value: +{
      +  "description": "As read.",
      +  "type": "integer"
      +}
  2. Changed2 schema fields changed
    • changedInput schema / properties / proposal / properties / definition / description
      Previous 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."
    • changedInput schema / properties / reason / description
      Previous 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."
  3. Changed4 schema fields changed
    • addedInput schema / properties / proposal / description
      Added value: +"op proposal: the rule or live check you suggest, for a whole-map admin to approve."
    • addedInput schema / properties / proposal / properties / kind / description
      Added value: +"rule_from_finding: a new rule, saved switched off. watch_from_rule: a live check of an enabled rule."
    • addedInput schema / properties / proposal / properties / name / description
      Added value: +"A short name a person recognises."
    • addedInput schema / properties / proposal / properties / urgency / description
      Added value: +"How urgent a signal the rule raises: info, attention or urgent."
  4. Changed2 schema fields changed
    • changedInput schema / properties / op / description
      Previous 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."
    • changedInput schema / properties / proposal / properties / rule_id / description
      Previous value: -"An enabled rule id for a watch."New value: +"An enabled rule id for a live check."
  5. Changed3 schema fields changed
    • changedInput schema / properties / op / description
      Previous 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."
    • changedInput schema / properties / op / enum
      Previous value: -[
      -  "ask",
      -  "withdraw"
      -]New value: +[
      +  "ask",
      +  "withdraw",
      +  "proposal"
      +]
    • addedInput schema / properties / proposal
      Added 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. Changed7 schema fields changed
    • changedInput schema / properties / idempotency_key / description
      Previous 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."
    • addedInput schema / properties / op
      Added 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"
      +}
    • changedInput schema / properties / reason / description
      Previous 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."
    • addedInput schema / properties / request_id
      Added value: +{
      +  "description": "op withdraw: the request_id request_action returned, or list_requests lists.",
      +  "type": "string"
      +}
    • changedInput schema / properties / signal_id / description
      Previous value: -"The signal that started this, if any."New value: +"op ask: the signal that started this, if any."
    • changedInput schema / properties / system / description
      Previous 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\"."
    • changedInput schema / required
      Previous value: -[
      -  "system",
      -  "operation",
      -  "target",
      -  "params",
      -  "reason",
      -  "idempotency_key"
      -]New value: +[]
  7. Changed1 schema field changed
    • addedInput schema / properties / target / description
      Added value: +"What you act on: its kind as the catalogue names it, and its id in your human's system."
  8. Changed1 schema field changed
    • changedInput schema / properties / reason / description
      Previous value: -"Why, in one or two sentences. Max 500 characters."New value: +"Plain lead, then What it does:, Problem:, Value: (no invented savings). Technical references in Details:. Total ≤500 characters. See maplith://docs/mcp."
  9. Added

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness3/5

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.

Completeness5/5

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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds 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.

Purpose5/5

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

The description states a specific verb and resource: 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.

Usage Guidelines5/5

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.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources