Skip to content

TechFabric

by techfabric.com · remote · no sign-in to list tools · v1.3.0 · published by com.techfabric

For TechFabric engineers to write posts and case studies from their coding agent; anyone can read

Deletes · 2Changes · 7

14 tools: 2 can delete or cancel things, 7 change things and 5 only read.

Scanned Oct 21, 2026

2 checks matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.

claude mcp add --transport http techfabric https://www.techfabric.com/mcp

Findings

Matches of fixed checks, with the text they matched.

2 warn
  • The server marks "get_brief" as not read-only (readOnlyHint: false), and its words say it reads.

    Matched text

    annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "get_brief" says "get": a word for reading.

    What this check looks for
  • The server marks "get_status" as not read-only (readOnlyHint: false), and its words say it reads.

    Matched text

    annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}; The name "get_status" says "get": a word for reading.

    What this check looks for

Tools

Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.

14 tools

Deletes or cancels 2Claude Code: deny
  • publish_draftRequires a TechFabric engineer's Microsoft sign-in (scope blog.write); an anonymous call is answered with the sign-in challenge.No findings

    Why it is in this group

    • The name "publish_draft" says "publish": a word for a change that another call does not undo.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Requires a TechFabric engineer's Microsoft sign-in (scope blog.write); an anonymous call is answered with the sign-in challenge. Publish one of your own drafts to techfabric.com, exactly as the browser editor's Publish does, and only after the engineer confirms. It needs check_draft with the id to have passed on exactly the saved text (any save after it needs a new check), no save in flight, and the draft not open in the browser editor. The first call publishes nothing: it asks the engineer "Publish '<title>' to techfabric.com now?" by elicitation where the client supports it; otherwise it returns a one-time confirmation (ten minutes, this exact text) that you send back as confirmation on a second call, only after asking the engineer that question and hearing yes. review_before_publishing returns the same confirmation as a read, which a host asks no approval for. Then the site merges and deploys it (a few minutes); get_status shows state published and live_url. A failed merge or deploy brings the draft back to drafted with what failed. When only wording and style checks failed, override names them to publish past (Publish anyway, as in the editor, and recorded); the hard set never. confirm_via "token" asks for the one-time confirmation instead of an elicitation, for a UI that asks the engineer itself.

    Annotations the server declares

    • title: Publish a draft
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: true
  • update_draftRequires a TechFabric engineer's Microsoft sign-in (scope blog.write); an anonymous call is answered with the sign-in challenge.No findings

    Why it is in this group

    • The name "update_draft" says "update": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Requires a TechFabric engineer's Microsoft sign-in (scope blog.write); an anonymous call is answered with the sign-in challenge. Save a new version of one of your own drafts, as the browser editor's Save does: only while it waits on you (state drafted), only on top of the text you edited (base_hash from get_status, or the text_hash your last update_draft returned), and never while it is open in the browser editor. It answers in a second or two, once the text is stored, with its text_hash and status "saved; preview rebuilding"; the commit and the preview follow in the background (get_status and the app show them). Nothing waits for that: lint_draft and check_draft with the id read the saved text at once. It runs no checks (lint_draft the text first; then check_draft with the id verifies the saved text, which publish_draft needs). A case study stays a case study (its kind is fixed at submit_draft) and may send new sources. Never publishes.

    Annotations the server declares

    • title: Update a draft
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: false
Changes things 7Claude Code: ask
  • check_draftRequires a TechFabric engineer's Microsoft sign-in (scope blog.write); an anonymous call is answered with the sign-in challenge.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    Requires a TechFabric engineer's Microsoft sign-in (scope blog.write); an anonymous call is answered with the sign-in challenge. The final verification: techfabric.com's full readiness checks (the browser editor's own Run checks: the draft's items and every site gate, the model-read ones by our judge, Clef, cached by text). With id, it checks your saved draft, and that run is what publish_draft needs: call it once, on the final text, after lint_draft passes and you've reviewed the draft against its judge_rubric. Without id, it checks a post's Markdown, with its frontmatter, or a case study's with kind "case-study" and its sources (its own checks: the four sections, the client rule, a source for every number, then the site's voice, slop and claims gates), filing nothing. A full check takes about five to ten minutes: a client with the tasks extension gets a task to poll; otherwise this waits up to wait_seconds, then returns progress, and the same markdown and images again reads on (nothing runs twice). Returns each item's status and findings, with the passage each finding is about.

    Annotations the server declares

    • title: Check a draft
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • get_briefRequires a TechFabric engineer's Microsoft sign-in (scope blog.write); an anonymous call is answered with the sign-in challenge.1 finding

    Why it is in this group

    • The name "get_brief" says "get": a word for reading.
    • The server marks it as not read-only (readOnlyHint: false).

    Findings

    • Warn

      The server marks "get_brief" as not read-only (readOnlyHint: false), and its words say it reads.

      Matched text

      annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "get_brief" says "get": a word for reading.

      What this check looks for
    Description, as the server wrote it
    Requires a TechFabric engineer's Microsoft sign-in (scope blog.write); an anonymous call is answered with the sign-in challenge. Today's topic for a daily draft, claimed for the signed-in engineer for 24 hours: a news story the content agent picked in the last two days, or a search we don't answer yet that matches the engineer's own work. Returns the topic, the angle, why it was chosen, the target search, sources, internal links to use, the editorial_rules URI and the brief_id to pass to submit_draft. Asking again the same day returns the same brief. When techfabric.com's pace (one automated post a day, three a week) is used up, today's brief has gone to a colleague, or nothing fits, it answers status none with the reason: stop there. No model is called. Ask the engineer for first-hand detail; never invent it.

    Annotations the server declares

    • title: Today's brief
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • get_statusRequires a TechFabric engineer's Microsoft sign-in (scope blog.write); an anonymous call is answered with the sign-in challenge.1 finding

    Why it is in this group

    • The name "get_status" says "get": a word for reading.
    • The server marks it as not read-only (readOnlyHint: false).

    Findings

    • Warn

      The server marks "get_status" as not read-only (readOnlyHint: false), and its words say it reads.

      Matched text

      annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}; The name "get_status" says "get": a word for reading.

      What this check looks for
    Description, as the server wrote it
    Requires a TechFabric engineer's Microsoft sign-in (scope blog.write); an anonymous call is answered with the sign-in challenge. One of your own drafts: its state, what is failing, the last check run, its current Markdown and base_hash (for update_draft; base_sha also works), the preview link, and once published its live_url. Never the editor link: the engineer has it by email. When the writer is waiting on a fact only you have, this asks you for it first.

    Annotations the server declares

    • title: Draft status
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • lint_draftRequires a TechFabric engineer's Microsoft sign-in (scope blog.write); an anonymous call is answered with the sign-in challenge.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Requires a TechFabric engineer's Microsoft sign-in (scope blog.write); an anonymous call is answered with the sign-in challenge. techfabric.com's rule-based checks (no model), run at once on the post's Markdown (frontmatter included) in about a second, at no cost: the draft's own items (diagram, depth, title and description, FAQ, placeholders, images, links) and the site gates (slop and banned words, claims and partner tiers, known errors, voice, opening, density, title, search snippet, diagrams, images, a case study's own rules). Each finding names its passage and what to do. Also returns judge_rubric: what the model-read checks will ask of this exact draft (the reader, each question, its threshold, the first screen the buyer test reads, the house opening pattern), for your own review. With id instead of markdown, it lints your saved draft's text, at once after update_draft. Call it as often as you like; it files nothing. Iterate with this, never with check_draft.

    Annotations the server declares

    • title: Lint a draft
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • review_before_publishingRequires a TechFabric engineer's Microsoft sign-in (scope blog.write); an anonymous call is answered with the sign-in challenge.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Requires a TechFabric engineer's Microsoft sign-in (scope blog.write); an anonymous call is answered with the sign-in challenge. A read (it changes nothing): everything publish_draft needs, checked now for one of your own drafts, and if it may be published, the question to ask the engineer ("Publish '<title>' to techfabric.com now?") with a one-time confirmation: ten minutes, this exact saved text and check run, used once. Only after the engineer says yes, call publish_draft with the same id, confirmation set to it (and the same override, if any). If it may not be published yet, it says why. The draft app's Publish button uses it, then asks the engineer itself.

    Annotations the server declares

    • title: Review before publishing
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • revise_postRequires a TechFabric engineer's Microsoft sign-in (scope blog.write); an anonymous call is answered with the sign-in challenge.No findings

    Why it is in this group

    • The name "revise_post" says "post": a word for a change.
    Description, as the server wrote it
    Requires a TechFabric engineer's Microsoft sign-in (scope blog.write); an anonymous call is answered with the sign-in challenge. Open a revision of a post that is already live on techfabric.com, to change it: only the post's author (its byline is the signed-in engineer's) or the blog's editor. Takes the post's URL or slug. Its first draft is the live text, on its own branch with its own preview, emailed to the engineer with the editor link; the result's first line is the preview. From there it is a draft like any other: get_status with the returned id gives its markdown and base_sha, then lint_draft (with slug), update_draft, check_draft with the id, and publish_draft, which asks the engineer to confirm. Publishing replaces the live post at the same URL under the same byline, keeps its publish date and shows Updated; the byline and the URL can't change in a revision, and a change made to the live post meanwhile is merged in, never overwritten. Asking again for the same post returns the revision already open.

    Annotations the server declares

    • title: Change a published post
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • submit_draftRequires a TechFabric engineer's Microsoft sign-in (scope blog.write); an anonymous call is answered with the sign-in challenge.No findings

    Why it is in this group

    • The name "submit_draft" says "submit": a word for a change.
    Description, as the server wrote it
    Requires a TechFabric engineer's Microsoft sign-in (scope blog.write); an anonymous call is answered with the sign-in challenge. File a post into techfabric.com's blog pipeline under the signed-in engineer's own byline. The post, frontmatter required (title and description at least), becomes the draft exactly as sent (no model rewrites or fact-checks it; your agent writes, repairs and checks the facts): the site renders its diagrams, puts its images in blog media, builds the preview and emails it with the editor and approve links. With kind "case-study" it files a case study at /case-studies/<slug> instead, with its sources; a client the register does not approve needs client_confirmed: true, the engineer's word that the client agreed. Run lint_draft first, until it passes. Never publishes: publish_draft does, after check_draft with the id passes and the engineer confirms. Returns the idea id; a client with the tasks extension gets a task that completes when the preview is up.

    Annotations the server declares

    • title: Submit a draft
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
Only reads 5Claude Code: allow
  • get_pageOne published page of www.techfabric.com as clean Markdown, with its title, search title (metaTitle), description, date, updated, author, tags, FAQs as question and answer pairs, a…No findings

    Why it is in this group

    • The name "get_page" says "get": a word for reading.
    Description, as the server wrote it
    One published page of www.techfabric.com as clean Markdown, with its title, search title (metaTitle), description, date, updated, author, tags, FAQs as question and answer pairs, and canonical URL. Takes a URL, a path or a post's slug. Only published, indexable pages.

    Annotations the server declares

    • title: Read a page
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • get_servicesEvery service, solution, Databricks, AI, cloud, software, accelerator and product page on techfabric.com: its name, URL, kind and summary, exactly as the live page states them.No findings

    Why it is in this group

    • The name "get_services" says "get": a word for reading.
    Description, as the server wrote it
    Every service, solution, Databricks, AI, cloud, software, accelerator and product page on techfabric.com: its name, URL, kind and summary, exactly as the live page states them. Read one in full with get_page.

    Annotations the server declares

    • title: List services
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • list_postsTechFabric's blog posts, newest first, optionally only those with a tag, by an author, or dated on or after a day.No findings

    Why it is in this group

    • The name "list_posts" says "list": a word for reading.
    Description, as the server wrote it
    TechFabric's blog posts, newest first, optionally only those with a tag, by an author, or dated on or after a day.

    Annotations the server declares

    • title: List blog posts
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • preview_draftRequires a TechFabric engineer's Microsoft sign-in (scope blog.write); an anonymous call is answered with the sign-in challenge.No findings

    Why it is in this group

    • The name "preview_draft" says "preview": a word for reading.
    Description, as the server wrote it
    Requires a TechFabric engineer's Microsoft sign-in (scope blog.write); an anonymous call is answered with the sign-in challenge. One of your own drafts as techfabric.com renders it (a read: it changes nothing), for the draft app (MCP Apps) in a host that shows apps: the page from its preview, its last check run with each check marked as one an author may publish past or one that must pass, and whether Publish may run. In any host, its text starts with the preview link: show that link to the engineer.

    Annotations the server declares

    • title: Preview a draft
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Install

Pinned to version 1.3.0. Values in angle brackets are yours to fill in.

claude mcp add --transport http techfabric https://www.techfabric.com/mcp

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__techfabric__search",
      "mcp__techfabric__get_page",
      "mcp__techfabric__list_posts",
      "mcp__techfabric__get_services",
      "mcp__techfabric__preview_draft"
    ],
    "ask": [
      "mcp__techfabric__get_brief",
      "mcp__techfabric__lint_draft",
      "mcp__techfabric__check_draft",
      "mcp__techfabric__submit_draft",
      "mcp__techfabric__get_status",
      "mcp__techfabric__review_before_publishing",
      "mcp__techfabric__revise_post"
    ],
    "deny": [
      "mcp__techfabric__update_draft",
      "mcp__techfabric__publish_draft"
    ]
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as techfabric. Review it before you use it.