Skip to main content
Glama

Lint a draft

lint_draft
Read-onlyIdempotent

Requires a TechFabric engineer's Microsoft sign-in (scope blog.write). The site's rule-based checks (slop, claims, known errors, voice, opening, title, description, FAQ, diagram, images, links, a case study's rules) on a post's Markdown, frontmatter included: about a second, free, filing nothing. Iterate with this, never with check_draft: rewrite each passage in rewrite_plan as its fix says and lint again until ready, then review the draft against the judge_rubric it returns. With id, it lints a draft of yours: its saved text, or the markdown you send as an edit to it.

Input Schema

NameRequiredDescriptionDefault
idNoA draft of yours (the id submit_draft returned). Alone: lints its saved text. With markdown: lints that edit as this draft (its kind, slug, images and sources) before you save it
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
slugNoThe draft's slug, when it has one already (get_status draft.slug); otherwise it comes from the title
imagesNoThe images the post refers to by name (names only; no data needed)
rubricNoAlso return judge_rubric while checks still fail (it comes anyway once they pass)
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
post_typeNoThe 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.

Output Schema

NameRequiredDescriptionDefault
idNo
kindNo
modeNoThe writing partner's edit mode (editorial/voices-of-techfabric.md): show the redlines, change only what the engineer accepts
nextYes
todoNoThe findings as the engineer's to-do list (the draft app's cards): each card's where, why in plain words and remedies
itemsYes
readyYesEvery rule-based check passes on this text
routeNo
savedNo
voiceNoHow every sentence is said (editorial/voices-of-techfabric.md, "Before you write a sentence"): follow it in the outline, the draft and every rewrite.
failingYes
redlinesNorewrite_plan as a redline for the engineer: each passage with its rule, reason, suggestion, state and options. The engineer decides; never hand back a rewritten post
post_typeNoThe post type the draft carries (postType in its frontmatter; story when it has none). Not for a case study
text_hashYes
next_actionYesThe one next step. Do what instruction says; call is the tool and the arguments the server already knows
judge_rubricNoWhat the model-read checks will ask of this draft: sent once the rule-based checks pass, or with rubric: true
redline_planNoWith id: what to propose with propose_edits, card by card (find, the limit), or what the engineer answers (confirm, ask_author)
rewrite_planYes
edit_instructionNoHow to show the redlines (edit mode)
judge_rubric_noteNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / post_type / description
      Previous value: -"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: +"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."
  2. Changed2 schema fields changed
    • addedInput schema / properties / post_type
      Added value: +{
      +  "description": "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 / 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"
      +}
  3. Changed1 schema field changed
    • addedOutput schema / properties / voice
      Added value: +{
      +  "description": "How every sentence is said (editorial/voices-of-techfabric.md, \"Before you write a sentence\"): follow it in the outline, the draft and every rewrite.",
      +  "type": "string"
      +}
  4. Changed3 schema fields changed
    • addedOutput schema / properties / edit_instruction
      Added value: +{
      +  "description": "How to show the redlines (edit mode)",
      +  "type": "string"
      +}
    • addedOutput schema / properties / mode
      Added value: +{
      +  "description": "The writing partner's edit mode (editorial/voices-of-techfabric.md): show the redlines, change only what the engineer accepts",
      +  "enum": [
      +    "edit"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / redlines
      Added value: +{
      +  "description": "rewrite_plan as a redline for the engineer: each passage with its rule, reason, suggestion, state and options. The engineer decides; never hand back a rewritten post",
      +  "items": {
      +    "properties": {
      +      "holds_publish": {
      +        "type": "boolean"
      +      },
      +      "n": {
      +        "type": "number"
      +      },
      +      "options": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "passage": {
      +        "type": "string"
      +      },
      +      "reason": {
      +        "type": "string"
      +      },
      +      "rule": {
      +        "type": "string"
      +      },
      +      "state": {
      +        "enum": [
      +          "apply",
      +          "confirm accuracy",
      +          "check"
      +        ],
      +        "type": "string"
      +      },
      +      "suggestion": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "n",
      +      "passage",
      +      "rule",
      +      "reason",
      +      "state",
      +      "holds_publish",
      +      "options"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
  5. Changed2 schema fields changed
    • addedOutput schema / properties / redline_plan
      Added value: +{
      +  "description": "With id: what to propose with propose_edits, card by card (find, the limit), or what the engineer answers (confirm, ask_author)",
      +  "items": {
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / todo
      Added value: +{
      +  "description": "The findings as the engineer's to-do list (the draft app's cards): each card's where, why in plain words and remedies",
      +  "properties": {
      +    "cards": {
      +      "items": {
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "total": {
      +      "type": "integer"
      +    }
      +  },
      +  "required": [
      +    "cards",
      +    "total"
      +  ],
      +  "type": "object"
      +}
  6. Changed4 schema fields changed
    • changedInput schema / properties / id / description
      Previous value: -"Instead of markdown: a draft of yours (the idea id). Lints its saved text at once, a save still being committed included, with its own kind, slug, images and sources"New value: +"A draft of yours (the id submit_draft returned). Alone: lints its saved text. With markdown: lints that edit as this draft (its kind, slug, images and sources) before you save it"
    • changedInput schema / properties / markdown / description
      Previous value: -"The whole post: frontmatter (title, description at least) and body. Or leave it out and send id"New value: +"The whole post: frontmatter (title, description at least) and body"
    • addedInput schema / properties / rubric
      Added value: +{
      +  "description": "Also return judge_rubric while checks still fail (it comes anyway once they pass)",
      +  "type": "boolean"
      +}
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "https://json-schema.org/draft/2020-12/schema",
      +  "properties": {
      +    "failing": {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "id": {
      +      "type": "string"
      +    },
      +    "items": {
      +      "items": {
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "judge_rubric": {
      +      "description": "What the model-read checks will ask of this draft: sent once the rule-based checks pass, or with rubric: true",
      +      "type": "object"
      +    },
      +    "judge_rubric_note": {
      +      "type": "string"
      +    },
      +    "kind": {
      +      "type": "string"
      +    },
      +    "next": {
      +      "type": "string"
      +    },
      +    "next_action": {
      +      "description": "The one next step. Do what instruction says; call is the tool and the arguments the server already knows",
      +      "properties": {
      +        "action": {
      +          "enum": [
      +            "interview",
      +            "outline",
      +            "approve",
      +            "lint",
      +            "rewrite",
      +            "save",
      +            "submit",
      +            "verify",
      +            "wait",
      +            "answer",
      +            "confirm",
      +            "publish",
      +            "report",
      +            "done",
      +            "stop"
      +          ],
      +          "type": "string"
      +        },
      +        "call": {
      +          "properties": {
      +            "arguments": {
      +              "type": "object"
      +            },
      +            "tool": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "tool",
      +            "arguments"
      +          ],
      +          "type": "object"
      +        },
      +        "instruction": {
      +          "type": "string"
      +        },
      +        "rounds": {
      +          "properties": {
      +            "max": {
      +              "type": "integer"
      +            },
      +            "round": {
      +              "type": "integer"
      +            }
      +          },
      +          "required": [
      +            "round",
      +            "max"
      +          ],
      +          "type": "object"
      +        }
      +      },
      +      "required": [
      +        "action",
      +        "rounds",
      +        "instruction"
      +      ],
      +      "type": "object"
      +    },
      +    "ready": {
      +      "description": "Every rule-based check passes on this text",
      +      "type": "boolean"
      +    },
      +    "rewrite_plan": {
      +      "items": {
      +        "properties": {
      +          "check": {
      +            "type": "string"
      +          },
      +          "fix": {
      +            "type": "string"
      +          },
      +          "passage": {
      +            "type": "string"
      +          },
      +          "problem": {
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "check",
      +          "passage",
      +          "problem",
      +          "fix"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "route": {
      +      "type": "string"
      +    },
      +    "saved": {
      +      "type": "boolean"
      +    },
      +    "text_hash": {
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "ready",
      +    "failing",
      +    "items",
      +    "text_hash",
      +    "rewrite_plan",
      +    "next_action",
      +    "next"
      +  ],
      +  "type": "object"
      +}
  7. 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."
  8. Changed3 schema fields changed
    • addedInput schema / properties / id
      Added value: +{
      +  "description": "Instead of markdown: a draft of yours (the idea id). Lints its saved text at once, a save still being committed included, with its own kind, slug, images and sources",
      +  "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. Or leave it out and send id"
    • changedInput schema / required
      Previous value: -[
      -  "markdown"
      -]New value: +[]
  9. Added

TDQS

A4.3/5.0
Behavior4/5

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

Adds context beyond the annotations: Microsoft sign-in with blog.write scope, roughly a second, no credits, and no filing (consistent with readOnly/idempotent). It also discloses that lint results arrive as rewrite_plan and that judge_rubric comes back once checks pass, which the annotations alone don't say. Only slight gap is that failure behaviour beyond the plan is left implicit.

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?

Compact and mostly front-loaded, but it opens on the auth prerequisite rather than the purpose, and the check list is a dense parenthetical. The iterate/never-with-check_draft sentence earns its place; nothing is clearly wasteful.

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

Completeness4/5

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

With an output schema present, return values need not be explained, and the description covers auth, cost, side effects, the alternative tool and the iteration loop. What's missing is marginal: how failures are surfaced or how the plan is ordered.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents id, kind, slug, images, rubric, sources, markdown and post_type in depth. The description only restates the id behaviour (saved text vs. markdown-as-edit) and adds no syntax or format detail beyond the schema, which is the baseline case.

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

Purpose5/5

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

States a specific verb and resource: the site's rule-based checks (slop, claims, known errors, voice, opening, title, description, FAQ, diagram, images, links, case-study rules) run on a post's Markdown including frontmatter. It also explicitly names the sibling it is not (check_draft), so an agent can distinguish it 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?

Gives an explicit routing rule — "Iterate with this, never with check_draft" — plus the loop: rewrite each passage in rewrite_plan as its fix says, lint again until ready, then review against judge_rubric. This is when-to-use, when-not-to-use and the alternative, all stated.

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.