Skip to main content
Glama

Save an edit to your draft

update_draft
Destructive

Requires a TechFabric engineer's Microsoft sign-in (scope blog.write). Save a new version of your draft (state drafted): the whole Markdown, and base_hash, the hash of the version you edited (draft.base_hash from get_status, or your last update_draft's text_hash). Answers in a second or two; the preview rebuilds in the background. It runs no checks: lint_draft the edit first, then check_draft with the id. Refused if the draft changed since base_hash or is open in the browser editor. The engineer may also edit and save it in the draft app: start each edit from a fresh get_status. Never publishes.

Input Schema

NameRequiredDescriptionDefault
idYesThe idea id
kindNoOptional: the draft's kind, which is fixed when it is submitted. Sent, it must match (get_status says it).post
sourcesNoNew sources, replacing the ones sent before: the engineer's own words, which the fact-check reads a post's claims against, or a case study's numbers are checked against.
base_shaNoInstead of base_hash: draft.base_sha from get_status, the commit your edit started from
markdownYesThe whole post, with its frontmatter
base_hashNoThe hash of the version your edit started from: draft.base_hash from the get_status you edited from, or the text_hash your last update_draft returned. It stays good after that save is committed
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.
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.
app_instanceNoThe draft app only, never an agent: the view whose own unsaved edits this save is
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.

Output Schema

NameRequiredDescriptionDefault
idYes
nextYes
savedYes
stepsNoWhere the draft is, step by step (the same steps the progress notifications name): done, active (under way now), pending or failed
savingNo
statusNo
base_hashNo
post_typeNoThe post type the draft carries (postType in its frontmatter; story when it has none). Not for a case study
text_hashYesThe saved text's sha256: the next update_draft's base_hash
first_handNoWhen first_hand was sent: nothing is recorded here. The engineer is asked on check_draft with the id (in their client, where it can ask them), or, for update_draft in a client that can't, this carries the question and a one-time confirmation to hand back on check_draft only after they say yes
next_actionYesThe one next step. Do what instruction says; call is the tool and the arguments the server already knows
preview_urlNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields 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."
    • 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. Changed1 schema field 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"
      +}
  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. Changed1 schema field changed
    • addedInput schema / properties / app_instance
      Added value: +{
      +  "description": "The draft app only, never an agent: the view whose own unsaved edits this save is",
      +  "type": "string"
      +}
  5. Changed3 schema fields changed
    • changedInput schema / properties / base_hash / description
      Previous value: -"draft.base_hash from get_status (or the text_hash your last update_draft returned): the text your edit started from. It stays good after that save is committed"New value: +"The hash of the version your edit started from: draft.base_hash from the get_status you edited from, or the text_hash your last update_draft returned. It stays good after that save is committed"
    • 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"
      +}
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "https://json-schema.org/draft/2020-12/schema",
      +  "properties": {
      +    "base_hash": {
      +      "type": "string"
      +    },
      +    "first_hand": {
      +      "description": "When first_hand was sent: nothing is recorded here. The engineer is asked on check_draft with the id (in their client, where it can ask them), or, for update_draft in a client that can't, this carries the question and a one-time confirmation to hand back on check_draft only after they say yes",
      +      "type": "object"
      +    },
      +    "id": {
      +      "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"
      +    },
      +    "preview_url": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "saved": {
      +      "type": "boolean"
      +    },
      +    "saving": {
      +      "type": "boolean"
      +    },
      +    "status": {
      +      "type": "string"
      +    },
      +    "text_hash": {
      +      "description": "The saved text's sha256: the next update_draft's base_hash",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "id",
      +    "saved",
      +    "text_hash",
      +    "next_action",
      +    "next"
      +  ],
      +  "type": "object"
      +}
  6. Changed1 schema field changed
    • changedInput schema / properties / sources / description
      Previous value: -"A case study only: new sources, replacing the ones sent before (what its numbers are checked against)."New value: +"New sources, replacing the ones sent before: the engineer's own words, which the fact-check reads a post's claims against, or a case study's numbers are checked against."
  7. Changed3 schema fields changed
    • addedInput schema / properties / base_hash
      Added value: +{
      +  "description": "draft.base_hash from get_status (or the text_hash your last update_draft returned): the text your edit started from. It stays good after that save is committed",
      +  "type": "string"
      +}
    • changedInput schema / properties / base_sha / description
      Previous value: -"draft.base_sha from get_status: the version your edit started from"New value: +"Instead of base_hash: draft.base_sha from get_status, the commit your edit started from"
    • changedInput schema / required
      Previous value: -[
      -  "id",
      -  "markdown",
      -  "base_sha"
      -]New value: +[
      +  "id",
      +  "markdown"
      +]
  8. Changed1 schema field 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"
      +}
  9. Changed2 schema fields changed
    • addedInput schema / properties / kind
      Added value: +{
      +  "default": "post",
      +  "description": "Optional: the draft's kind, which is fixed when it is submitted. Sent, it must match (get_status says it).",
      +  "enum": [
      +    "post",
      +    "case-study"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / sources
      Added value: +{
      +  "description": "A case study only: new sources, replacing the ones sent before (what its numbers are checked against).",
      +  "type": "string"
      +}
  10. First observed

TDQS

A4.5/5.0
Behavior5/5

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

Goes well beyond the annotations: states the required sign-in and scope (blog.write), that the call is refused if the draft changed since base_hash or is open in the browser editor, that the preview rebuilds asynchronously, and that it never publishes. This gives the agent the failure modes and side effects that destructiveHint=true alone does not explain.

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

Conciseness4/5

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

Front-loaded with the auth requirement and the core payload (whole Markdown + base_hash), then failure modes, then concurrency. It is dense with parenthetical cross-references and the last two sentences overlap slightly, but every sentence carries operational information.

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 10-parameter mutation with an output schema, the description covers auth, required payload, staleness checks, concurrency with the human editor, ordering with lint_draft/check_draft, and the no-publish guarantee. Return values are covered by the output schema, so nothing essential is missing.

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 baseline is 3, but the description adds cross-tool provenance for base_hash (draft.base_hash from get_status, or the text_hash returned by the previous update_draft) that the schema only partly restates. The remaining parameters (first_hand, client_confirmed, app_instance) are documented in the schema rather than the description, which is acceptable here.

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

Purpose4/5

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

Specific verb and resource: 'Save a new version of your draft (state drafted): the whole Markdown, and base_hash'. 'The whole Markdown' implicitly contrasts with patch-style siblings like apply_edits, and 'Never publishes' rules out publish_draft/submit_draft. It never names the closest alternative (apply_edits/revise_post) explicitly, so the differentiation is inferred rather than stated.

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?

Explicit sequencing and alternatives: 'It runs no checks: lint_draft the edit first, then check_draft with the id', plus 'start each edit from a fresh get_status' after any in-app save. It also names the exact source of base_hash (get_status or the last update_draft's text_hash), so the agent knows what to call before and after.

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.