Skip to main content
Glama

Check a draft

check_draft
Idempotent

Requires a TechFabric engineer's Microsoft sign-in (scope blog.write). The final verification publish_draft needs. With id: the full checks on your saved draft (judge, slop classifier, fact-check), about a minute; call it after lint_draft passes, never to iterate. Each call waits up to 25 seconds and then reports progress: call it again, never two at once, for the answer (nothing runs twice; a client with the tasks extension gets a task). Right after submit_draft it waits while the draft is filed. Without id it checks markdown and files nothing, which publish_draft doesn't count. On next_action confirm, send first_hand_to_confirm back as first_hand: the engineer confirms, never you.

Input Schema

NameRequiredDescriptionDefault
idNoA draft of yours (the idea id from submit_draft): checks its saved text, the final verification publish_draft needs
kindNoWhat the draft is: "post" (the default, a blog post) or "case-study" (content/case-studies, at /case-studies/<slug>). A case study's frontmatter is title, description, sector, stack, track (ai, migration or other) and client when the client register approves naming them or the engineer says the client agreed (client_confirmed); its body opens with ## Challenge, ## Strategy, ## Solution and ## Results, each with a bold one-line statement first. See the editorial_rules resource.post
imagesNo
sourcesNoThe engineer's own words the draft's claims come from, as text. For a post: what the engineer told you about their own work (what they built, measured, saw and decided, and any result, client or number they gave you), quoted as they said it, and their notes; the fact-check treats these as the author's own account of the work, so a first-hand sentence they don't back is a finding. Never write them yourself: ask the engineer. For a case study: the engineer's own notes and the project's records (README, changelog, metrics they gave you) its numbers come from. Every number in the case study is checked against these; one that isn't here is a finding. A source is not an approval: a client's metric also needs the client register's approval. Ask the engineer for outcome numbers; never invent them. At most 100,000 characters.
markdownNoThe whole post: frontmatter (title, description at least) and body. With id: optional, and must be the saved text
post_typeNoOnly with markdown (a check of text not filed): The post type, which sets the opening rule and how hard the fact-check reads it. story (the default): work someone at TechFabric did. The opening has TechFabric doing that work by paragraph two, and every claim gets the full fact-check. perspective: a talk or conference the author attended, a conversation with an industry leader, others' work, or our view of what's possible. TechFabric's view by paragraph two ("we think", "we'd", "I believe" count). What a speaker or another company said is attributed in the sentence ("In her demo, ...") and must match what the author provided; forward-looking views need no source. whats-new: a new feature in AI, Databricks or related tech, and how it could help future projects. Open on what changed (its date and source), then our view. Product facts (name, preview or GA, date, what it does) are checked against the vendor's docs or release notes; forward-looking views need no source. personal: the author's own essay or position, in the first person, about where the work or the industry is going and what people should do. Opening and fact-check as perspective, and the only type that may take the memo register: conviction carried as "I believe" and the reader addressed as "you" throughout, up to three bold thesis sentences, one "this is not X" thesis reframe and a closing call to act (other types keep every slop rule, though a perspective opening may still state its view as "we think" or "I believe"). Never for an engineer explaining a feature or their own project. Choose personal only when the engineer writes in their own voice about a position, never for an engineer explaining a feature or their project. Left out, it is story; an explainer is always whats-new. Not for a case study.
first_handNoFirst-hand claims only the engineer can source, which the fact-check flagged first_hand (first_hand_to_confirm): each the sentence exactly as quoted, with what it rests on. Sending it asks the engineer; it never confirms anything on your word. check_draft asks them in their client (an elicitation) where it can, otherwise answers with a question and a one-time confirmation: ask them that question, and only if they say yes, send it back as first_hand_confirmation with the same first_hand. submit_draft and update_draft answer with the question and confirmation too, which come back on check_draft with the id. Never a client's result: a number about a client needs the client's confirmation, as a source.
confirm_viaNoWith first_hand or first_hand_all: how the engineer is asked. Default: a form in their client where it can show one. "token": the question and a one-time confirmation instead, for a UI that asks them itself (an MCP App's button)
wait_secondsNoWithout the tasks extension: how long to wait for the result before answering with progress (default and most 25; a larger value, accepted for older agents, waits 25)
first_hand_allNoConfirm all listed: true asks the engineer to confirm, in one go, every first-hand claim the last check of this text listed (first_hand_to_confirm), instead of listing them in first_hand. The list is the server's, from that check: a client's result, a client's fact and a known error are never in it and come back apart (first_hand.excluded). It asks as first_hand does (one form showing every claim, or a question and a one-time confirmation to send back with first_hand_all: true); it never confirms anything on your word. Each claim is still recorded on its own under the engineer's name.
client_confirmedNoOnly when the engineer tells you they have the client's confirmation to name the client this draft names (its client:, or a client in its text the register doesn't approve). Recorded under the engineer's name with the draft and its text; never send it on your own judgement. It covers naming the client, not results: numbers still need sources.
first_hand_confirmationNoOnly after asking the engineer and hearing yes: the confirmation an earlier answer gave for exactly this first_hand (first_hand.confirmation). It works once, for ten minutes, for those claims in that text

Output Schema

NameRequiredDescriptionDefault
runYes
kindNo
nextYes
noteNo
errorNo
itemsYes
readyYesEvery item passed on this exact text
stageNo
stepsNoWhere the draft is, step by step (the same steps the progress notifications name): done, active (under way now), pending or failed
statusYesconfirmation_required: check_draft was sent first_hand and waits on the engineer (first_hand); nothing was checked
failingYes
missingNo
check_idYes
post_typeNoThe post type the draft carries (postType in its frontmatter; story when it has none). Not for a case study
first_handNoThe question to ask the engineer about first_hand (or first_hand_all), and its one-time confirmation
next_actionYesThe one next step. Do what instruction says; call is the tool and the arguments the server already knows
rewrite_planNo
could_not_runYes
fact_check_scopeNoOnly on a revision of a live post (revise_post): what the fact-check covered. scoped true: it read only the new or changed sentences; every sentence unchanged from the published post is verified, and so is every changed sentence whose facts the live post already states (carried_facts), so never ask the engineer to confirm or source one again (first_hand_to_confirm lists only what is new or changed in substance). scoped false: the published version couldn't be loaded (why), so every sentence was checked. Say note to the engineer as it is
first_hand_recordedNoThe first-hand claims the engineer confirmed on this call, recorded under their name
first_hand_to_confirmNoFirst-hand claims only the engineer can source: ask them to confirm each (first_hand), never confirm one yourself

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • changedInput schema / properties / post_type / description
      Previous value: -"Only with markdown (a check of text not filed): The post type, which sets the opening rule and how hard the fact-check reads it. story (the default): work someone at TechFabric did. The opening has TechFabric doing that work by paragraph two, and every claim gets the full fact-check. perspective: a talk or conference the author attended, a conversation with an industry leader, others' work, or our view of what's possible. TechFabric's view by paragraph two (\"we think\", \"we'd\", \"I believe\" count). What a speaker or another company said is attributed in the sentence (\"In her demo, ...\") and must match what the author provided; forward-looking views need no source. whats-new: a new feature in AI, Databricks or related tech, and how it could help future projects. Open on what changed (its date and source), then our view. Product facts (name, preview or GA, date, what it does) are checked against the vendor's docs or release notes; forward-looking views need no source. personal: the author's own essay or position, in the first person, about where the work or the industry is going and what people should do. Opening and fact-check as perspective, and the only type that may say \"I believe\", address the reader as \"you\", bold up to three thesis sentences, make one \"this is not X\" thesis reframe and close on a call to act. Never for an engineer explaining a feature or their own project. Choose personal only when the engineer writes in their own voice about a position, never for an engineer explaining a feature or their project. Left out, it is story; an explainer is always whats-new. Not for a case study."New value: +"Only with markdown (a check of text not filed): The post type, which sets the opening rule and how hard the fact-check reads it. story (the default): work someone at TechFabric did. The opening has TechFabric doing that work by paragraph two, and every claim gets the full fact-check. perspective: a talk or conference the author attended, a conversation with an industry leader, others' work, or our view of what's possible. TechFabric's view by paragraph two (\"we think\", \"we'd\", \"I believe\" count). What a speaker or another company said is attributed in the sentence (\"In her demo, ...\") and must match what the author provided; forward-looking views need no source. whats-new: a new feature in AI, Databricks or related tech, and how it could help future projects. Open on what changed (its date and source), then our view. Product facts (name, preview or GA, date, what it does) are checked against the vendor's docs or release notes; forward-looking views need no source. personal: the author's own essay or position, in the first person, about where the work or the industry is going and what people should do. Opening and fact-check as perspective, and the only type that may take the memo register: conviction carried as \"I believe\" and the reader addressed as \"you\" throughout, up to three bold thesis sentences, one \"this is not X\" thesis reframe and a closing call to act (other types keep every slop rule, though a perspective opening may still state its view as \"we think\" or \"I believe\"). Never for an engineer explaining a feature or their own project. Choose personal only when the engineer writes in their own voice about a position, never for an engineer explaining a feature or their project. Left out, it is story; an explainer is always whats-new. Not for a case study."
    • addedOutput schema / properties / post_type
      Added value: +{
      +  "description": "The post type the draft carries (postType in its frontmatter; story when it has none). Not for a case study",
      +  "enum": [
      +    "story",
      +    "perspective",
      +    "whats-new",
      +    "personal"
      +  ],
      +  "type": "string"
      +}
  2. Changed2 schema fields changed
    • addedInput schema / properties / post_type
      Added value: +{
      +  "description": "Only with markdown (a check of text not filed): The post type, which sets the opening rule and how hard the fact-check reads it. story (the default): work someone at TechFabric did. The opening has TechFabric doing that work by paragraph two, and every claim gets the full fact-check. perspective: a talk or conference the author attended, a conversation with an industry leader, others' work, or our view of what's possible. TechFabric's view by paragraph two (\"we think\", \"we'd\", \"I believe\" count). What a speaker or another company said is attributed in the sentence (\"In her demo, ...\") and must match what the author provided; forward-looking views need no source. whats-new: a new feature in AI, Databricks or related tech, and how it could help future projects. Open on what changed (its date and source), then our view. Product facts (name, preview or GA, date, what it does) are checked against the vendor's docs or release notes; forward-looking views need no source. personal: the author's own essay or position, in the first person, about where the work or the industry is going and what people should do. Opening and fact-check as perspective, and the only type that may say \"I believe\", address the reader as \"you\", bold up to three thesis sentences, make one \"this is not X\" thesis reframe and close on a call to act. Never for an engineer explaining a feature or their own project. Choose personal only when the engineer writes in their own voice about a position, never for an engineer explaining a feature or their project. Left out, it is story; an explainer is always whats-new. Not for a case study.",
      +  "enum": [
      +    "story",
      +    "perspective",
      +    "whats-new",
      +    "personal"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / fact_check_scope
      Added value: +{
      +  "description": "Only on a revision of a live post (revise_post): what the fact-check covered. scoped true: it read only the new or changed sentences; every sentence unchanged from the published post is verified, and so is every changed sentence whose facts the live post already states (carried_facts), so never ask the engineer to confirm or source one again (first_hand_to_confirm lists only what is new or changed in substance). scoped false: the published version couldn't be loaded (why), so every sentence was checked. Say note to the engineer as it is",
      +  "properties": {
      +    "carried": {
      +      "description": "Sentences unchanged from the published post, carried as verified",
      +      "type": "integer"
      +    },
      +    "carried_by_fact": {
      +      "description": "Changed sentences whose every fact the live post already states, carried as verified (1 November 2026)",
      +      "type": "integer"
      +    },
      +    "carried_facts": {
      +      "description": "Each changed sentence carried by fact, and the live post's sentences that state it",
      +      "items": {
      +        "properties": {
      +          "published": {
      +            "description": "The live post's sentences that state it",
      +            "type": "string"
      +          },
      +          "sentence": {
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "sentence",
      +          "published"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "carry_unread": {
      +      "description": "True when the read comparing changed sentences with the live post did not complete: run check_draft again before asking the engineer to confirm anything",
      +      "type": "boolean"
      +    },
      +    "changed": {
      +      "description": "New or changed sentences of the revision, carried by fact or checked",
      +      "type": "integer"
      +    },
      +    "checked": {
      +      "description": "New or changed sentences the fact-check checked (with carried_by_fact: those the live post doesn't already state)",
      +      "type": "integer"
      +    },
      +    "note": {
      +      "type": "string"
      +    },
      +    "published_at": {
      +      "description": "When the live text was published (the commit that last changed it on master)",
      +      "type": "string"
      +    },
      +    "published_commit": {
      +      "description": "That commit",
      +      "type": "string"
      +    },
      +    "revision": {
      +      "type": "boolean"
      +    },
      +    "scoped": {
      +      "type": "boolean"
      +    },
      +    "why": {
      +      "description": "scoped false: why the published version couldn't be loaded",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "revision",
      +    "scoped",
      +    "note"
      +  ],
      +  "type": "object"
      +}
  3. Changed1 schema field changed
    • addedOutput schema / properties / steps
      Added value: +{
      +  "description": "Where the draft is, step by step (the same steps the progress notifications name): done, active (under way now), pending or failed",
      +  "items": {
      +    "properties": {
      +      "id": {
      +        "type": "string"
      +      },
      +      "label": {
      +        "type": "string"
      +      },
      +      "state": {
      +        "enum": [
      +          "done",
      +          "active",
      +          "pending",
      +          "failed"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "id",
      +      "label",
      +      "state"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
  4. Changed13 schema fields changed
    • addedInput schema / properties / confirm_via
      Added value: +{
      +  "description": "With first_hand or first_hand_all: how the engineer is asked. Default: a form in their client where it can show one. \"token\": the question and a one-time confirmation instead, for a UI that asks them itself (an MCP App's button)",
      +  "enum": [
      +    "elicitation",
      +    "token"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / first_hand
      Added value: +{
      +  "description": "First-hand claims only the engineer can source, which the fact-check flagged first_hand (first_hand_to_confirm): each the sentence exactly as quoted, with what it rests on. Sending it asks the engineer; it never confirms anything on your word. check_draft asks them in their client (an elicitation) where it can, otherwise answers with a question and a one-time confirmation: ask them that question, and only if they say yes, send it back as first_hand_confirmation with the same first_hand. submit_draft and update_draft answer with the question and confirmation too, which come back on check_draft with the id. Never a client's result: a number about a client needs the client's confirmation, as a source.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "basis": {
      +        "description": "measured: we measured or ran it; our_product: how our own product works; client_told_us: what a client said (not their numbers); customers_ask: what our customers ask; we_did_it: what we built, saw or decided; own_work: first-hand, from the engineer's own work",
      +        "enum": [
      +          "measured",
      +          "our_product",
      +          "client_told_us",
      +          "customers_ask",
      +          "we_did_it",
      +          "own_work"
      +        ],
      +        "type": "string"
      +      },
      +      "claim": {
      +        "description": "The sentence, exactly as the fact-check quoted it",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "claim",
      +      "basis"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 10,
      +  "type": "array"
      +}
    • addedInput schema / properties / first_hand_all
      Added value: +{
      +  "description": "Confirm all listed: true asks the engineer to confirm, in one go, every first-hand claim the last check of this text listed (first_hand_to_confirm), instead of listing them in first_hand. The list is the server's, from that check: a client's result, a client's fact and a known error are never in it and come back apart (first_hand.excluded). It asks as first_hand does (one form showing every claim, or a question and a one-time confirmation to send back with first_hand_all: true); it never confirms anything on your word. Each claim is still recorded on its own under the engineer's name.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / first_hand_confirmation
      Added value: +{
      +  "description": "Only after asking the engineer and hearing yes: the confirmation an earlier answer gave for exactly this first_hand (first_hand.confirmation). It works once, for ten minutes, for those claims in that text",
      +  "type": "string"
      +}
    • addedOutput schema / properties / first_hand
      Added value: +{
      +  "description": "The question to ask the engineer about first_hand (or first_hand_all), and its one-time confirmation",
      +  "properties": {
      +    "all_listed": {
      +      "description": "first_hand_all: every claim the last check listed",
      +      "type": "boolean"
      +    },
      +    "claims": {
      +      "items": {
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "confirmation": {
      +      "type": "string"
      +    },
      +    "excluded": {
      +      "description": "first_hand_all: what the list leaves out (a client's result or fact, a known error) and why; never confirmed this way",
      +      "items": {
      +        "properties": {
      +          "claim": {
      +            "type": "string"
      +          },
      +          "why": {
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "expires_in_seconds": {
      +      "type": "integer"
      +    },
      +    "question": {
      +      "type": "string"
      +    },
      +    "status": {
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedOutput schema / properties / first_hand_recorded
      Added value: +{
      +  "description": "The first-hand claims the engineer confirmed on this call, recorded under their name",
      +  "items": {
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / first_hand_to_confirm
      Added value: +{
      +  "description": "First-hand claims only the engineer can source: ask them to confirm each (first_hand), never confirm one yourself",
      +  "items": {
      +    "properties": {
      +      "claim": {
      +        "type": "string"
      +      },
      +      "problem": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "claim",
      +      "problem"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / items / items / properties / notes
      Added value: +{
      +  "description": "Shown, never a failure: a claim the fact-check couldn't verify because it couldn't read the page it rests on, or a first-hand claim the engineer confirmed. Listed in the publish confirmation.",
      +  "items": {
      +    "properties": {
      +      "span": {
      +        "type": "string"
      +      },
      +      "text": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "text"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / next_action / description
      Added value: +"The one next step. Do what instruction says; call is the tool and the arguments the server already knows"
    • changedOutput schema / properties / next_action / properties / action / enum
      Previous value: -[
      -  "wait",
      -  "submit",
      -  "verify",
      -  "publish",
      -  "report",
      -  "rewrite"
      -]New value: +[
      +  "interview",
      +  "outline",
      +  "approve",
      +  "lint",
      +  "rewrite",
      +  "save",
      +  "submit",
      +  "verify",
      +  "wait",
      +  "answer",
      +  "confirm",
      +  "publish",
      +  "report",
      +  "done",
      +  "stop"
      +]
    • addedOutput schema / properties / next_action / properties / call
      Added value: +{
      +  "properties": {
      +    "arguments": {
      +      "type": "object"
      +    },
      +    "tool": {
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "tool",
      +    "arguments"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / status / description
      Added value: +"confirmation_required: check_draft was sent first_hand and waits on the engineer (first_hand); nothing was checked"
    • changedOutput schema / properties / status / enum
      Previous value: -[
      -  "running",
      -  "done",
      -  "error",
      -  "stalled"
      -]New value: +[
      +  "running",
      +  "done",
      +  "error",
      +  "stalled",
      +  "confirmation_required"
      +]
  5. Changed3 schema fields changed
    • addedOutput schema / properties / next_action
      Added value: +{
      +  "properties": {
      +    "action": {
      +      "enum": [
      +        "wait",
      +        "submit",
      +        "verify",
      +        "publish",
      +        "report",
      +        "rewrite"
      +      ],
      +      "type": "string"
      +    },
      +    "instruction": {
      +      "type": "string"
      +    },
      +    "rounds": {
      +      "properties": {
      +        "max": {
      +          "type": "integer"
      +        },
      +        "round": {
      +          "type": "integer"
      +        }
      +      },
      +      "required": [
      +        "round",
      +        "max"
      +      ],
      +      "type": "object"
      +    }
      +  },
      +  "required": [
      +    "action",
      +    "rounds",
      +    "instruction"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / rewrite_plan
      Added value: +{
      +  "items": {
      +    "properties": {
      +      "check": {
      +        "type": "string"
      +      },
      +      "fix": {
      +        "type": "string"
      +      },
      +      "passage": {
      +        "type": "string"
      +      },
      +      "problem": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "check",
      +      "passage",
      +      "problem",
      +      "fix"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "check_id",
      -  "run",
      -  "status",
      -  "ready",
      -  "failing",
      -  "could_not_run",
      -  "items",
      -  "next"
      -]New value: +[
      +  "check_id",
      +  "run",
      +  "status",
      +  "ready",
      +  "failing",
      +  "could_not_run",
      +  "items",
      +  "next",
      +  "next_action"
      +]
  6. Changed1 schema field changed
    • changedInput schema / properties / sources / description
      Previous value: -"A case study only: the engineer's own notes and the project's records (README, changelog, metrics they gave you) its numbers come from, as text, at most 100,000 characters. Every number in the case study is checked against these; one that isn't here is a finding. A source is not an approval: a client's metric also needs the client register's approval. Ask the engineer for outcome numbers; never invent them."New value: +"The engineer's own words the draft's claims come from, as text. For a post: what the engineer told you about their own work (what they built, measured, saw and decided, and any result, client or number they gave you), quoted as they said it, and their notes; the fact-check treats these as the author's own account of the work, so a first-hand sentence they don't back is a finding. Never write them yourself: ask the engineer. For a case study: the engineer's own notes and the project's records (README, changelog, metrics they gave you) its numbers come from. Every number in the case study is checked against these; one that isn't here is a finding. A source is not an approval: a client's metric also needs the client register's approval. Ask the engineer for outcome numbers; never invent them. At most 100,000 characters."
  7. Changed1 schema field changed
    • addedOutput schema / properties / items / items / properties / override
      Added value: +{
      +  "description": "On a check that failed or could not run: overridable, a wording check the engineer may publish past (publish_draft override, the editor's Publish anyway); hard, one that has to pass",
      +  "enum": [
      +    "overridable",
      +    "hard"
      +  ],
      +  "type": "string"
      +}
  8. Changed3 schema fields changed
    • addedInput schema / properties / id
      Added value: +{
      +  "description": "A draft of yours (the idea id from submit_draft): checks its saved text, the final verification publish_draft needs",
      +  "type": "string"
      +}
    • changedInput schema / properties / markdown / description
      Previous value: -"The whole post: frontmatter (title, description at least) and body"New value: +"The whole post: frontmatter (title, description at least) and body. With id: optional, and must be the saved text"
    • changedInput schema / required
      Previous value: -[
      -  "markdown"
      -]New value: +[]
  9. Changed2 schema fields changed
    • addedInput schema / properties / client_confirmed
      Added value: +{
      +  "description": "Only when the engineer tells you they have the client's confirmation to name the client this draft names (its client:, or a client in its text the register doesn't approve). Recorded under the engineer's name with the draft and its text; never send it on your own judgement. It covers naming the client, not results: numbers still need sources.",
      +  "type": "boolean"
      +}
    • changedInput schema / properties / kind / description
      Previous value: -"What the draft is: \"post\" (the default, a blog post) or \"case-study\" (content/case-studies, at /case-studies/<slug>). A case study's frontmatter is title, description, sector, stack, track (ai, migration or other) and client only when the client register approves naming them; its body opens with ## Challenge, ## Strategy, ## Solution and ## Results, each with a bold one-line statement first. See the editorial_rules resource."New value: +"What the draft is: \"post\" (the default, a blog post) or \"case-study\" (content/case-studies, at /case-studies/<slug>). A case study's frontmatter is title, description, sector, stack, track (ai, migration or other) and client when the client register approves naming them or the engineer says the client agreed (client_confirmed); its body opens with ## Challenge, ## Strategy, ## Solution and ## Results, each with a bold one-line statement first. See the editorial_rules resource."
  10. Changed1 schema field changed
    • changedInput schema / properties / wait_seconds / description
      Previous value: -"Without the tasks extension: how long to wait for the result before answering with progress (default 25)"New value: +"Without the tasks extension: how long to wait for the result before answering with progress (default and most 25; a larger value, accepted for older agents, waits 25)"
  11. Changed3 schema fields changed
    • addedInput schema / properties / kind
      Added value: +{
      +  "default": "post",
      +  "description": "What the draft is: \"post\" (the default, a blog post) or \"case-study\" (content/case-studies, at /case-studies/<slug>). A case study's frontmatter is title, description, sector, stack, track (ai, migration or other) and client only when the client register approves naming them; its body opens with ## Challenge, ## Strategy, ## Solution and ## Results, each with a bold one-line statement first. See the editorial_rules resource.",
      +  "enum": [
      +    "post",
      +    "case-study"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / sources
      Added value: +{
      +  "description": "A case study only: the engineer's own notes and the project's records (README, changelog, metrics they gave you) its numbers come from, as text, at most 100,000 characters. Every number in the case study is checked against these; one that isn't here is a finding. A source is not an approval: a client's metric also needs the client register's approval. Ask the engineer for outcome numbers; never invent them.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / kind
      Added value: +{
      +  "enum": [
      +    "post",
      +    "case-study"
      +  ],
      +  "type": "string"
      +}
  12. First observed

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint false, idempotent, non-destructive), the description discloses an auth prerequisite (Microsoft sign-in, scope blog.write), run time (~a minute) with a 25-second wait-then-progress pattern, that work is idempotent ("nothing runs twice"), task-extension behavior, and a wait after submit_draft. The first_hand confirmation flow is also spelled out, including that the engineer, not the agent, confirms.

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

Conciseness4/5

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

The content is dense but nearly every clause carries operational information, and the most important constraints (auth, sequencing, polling) come early. The telegraphic fragments and stacked colons ("The final verification publish_draft needs.", "never to iterate.") make it slower to parse than it needs to be.

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

Completeness4/5

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

For a 12-parameter tool with an output schema and annotations, the description covers the workflow position, timing, idempotency, and confirmation mechanics that an agent cannot infer. Remaining gaps are minor and mostly covered elsewhere: specific failure modes and what the check result body contains are left to the output schema.

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 92%, so the baseline is 3, and the description earns an upgrade by explaining the id vs no-id fork and the interplay between first_hand_to_confirm and the first_hand parameter. It does not, however, add much about kind, images, sources, or wait_seconds beyond what their schema strings already say.

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 full checks on your saved draft (judge, slop classifier, fact-check)" names the verb (check), the resource (a saved draft), and the three checks performed. It explicitly distinguishes itself from siblings: it is what "publish_draft needs" and must be run "after lint_draft passes," and it does a different, non-publishing check when called "without id."

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?

Sequencing and exclusions are explicit: run it after lint_draft passes, "never to iterate," and note that a no-id markdown check does not count toward publish_draft. It also states the polling contract (call again, never two at once) and what to do on next_action confirm, so the agent knows both when to call it and how to call it again.

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.