TechFabric
For TechFabric engineers to write posts and case studies from their coding agent; anyone can read
使うべきか
品質と安全性
検出事項(3)
- HIGH
- MEDIUMlint_draft 内
- INFOlint_draft 内
ツール定義とプロトコルへの準拠に関する自動分析に基づいています。
コンテキストコスト
これは、サーバーのツールがモデルのコンテキストに読み込まれるたびに消費されるおおよそのトークン数です。数が多いほど、ほかのタスクに使える注意が減ります。
インストール
ワンクリックインストール
これを `claude_desktop_config.json` ファイルに追加してください:
{
"mcpServers": {
"techfabric": {
"url": "https://www.techfabric.com/mcp"
}
}
}リモートエンドポイント
https://www.techfabric.com/mcpstreamable-httpできること
ツール一覧
ツール(13)
🟢search(query, type, limit)
Search TechFabric's published site: blog posts, service and solution pages, case studies, city pages and events. Returns each match's title, URL, summary, date, author and type, best first. Read a result in full with get_page.
入力スキーマ
{
"type": "object",
"properties": {
"query": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "What to look for, in plain words"
},
"type": {
"type": "string",
"enum": [
"post",
"service",
"solution",
"case_study",
"city",
"event",
"page"
],
"description": "Only this kind of page: post, service, solution, case_study, city, event or page"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 25,
"description": "How many results (default 10)"
}
},
"required": [
"query"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}出力スキーマ
{
"type": "object",
"properties": {
"query": {
"type": "string"
},
"type": {
"type": [
"string",
"null"
]
},
"total": {
"type": "integer"
},
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"title": {
"type": "string"
},
"url": {
"type": "string"
},
"summary": {
"type": "string"
},
"date": {
"type": [
"string",
"null"
]
},
"author": {
"type": [
"string",
"null"
]
},
"type": {
"type": "string",
"enum": [
"post",
"service",
"solution",
"case_study",
"city",
"event",
"page"
]
},
"score": {
"type": "number"
}
},
"required": [
"title",
"url",
"summary",
"date",
"author",
"type",
"score"
]
}
}
},
"required": [
"query",
"type",
"total",
"results"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢get_page(url_or_slug)
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.
入力スキーマ
{
"type": "object",
"properties": {
"url_or_slug": {
"type": "string",
"minLength": 1,
"maxLength": 500,
"description": "A techfabric.com URL, a path such as /services/databricks, or a post's slug"
}
},
"required": [
"url_or_slug"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}出力スキーマ
{
"type": "object",
"properties": {
"url": {
"type": "string"
},
"canonical": {
"type": "string"
},
"type": {
"type": "string",
"enum": [
"post",
"service",
"solution",
"case_study",
"city",
"event",
"page"
]
},
"title": {
"type": "string",
"description": "The page's heading"
},
"metaTitle": {
"type": "string",
"description": "The page's <title>, as search results show it"
},
"description": {
"type": "string"
},
"date": {
"type": [
"string",
"null"
]
},
"updated": {
"type": [
"string",
"null"
]
},
"author": {
"type": [
"string",
"null"
]
},
"tags": {
"type": "array",
"items": {
"type": "string"
}
},
"faqs": {
"type": "array",
"items": {
"type": "object",
"properties": {
"question": {
"type": "string"
},
"answer": {
"type": "string"
}
},
"required": [
"question",
"answer"
]
}
},
"markdown": {
"type": "string",
"description": "The page as Markdown, without the site's navigation"
}
},
"required": [
"url",
"canonical",
"type",
"title",
"metaTitle",
"description",
"date",
"updated",
"author",
"tags",
"faqs",
"markdown"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢list_posts(tag, author, since, limit)
TechFabric's blog posts, newest first, optionally only those with a tag, by an author, or dated on or after a day.
入力スキーマ
{
"type": "object",
"properties": {
"tag": {
"type": "string",
"description": "Only posts with this tag (its name or slug, e.g. Databricks)"
},
"author": {
"type": "string",
"description": "Only posts by this author (name or slug, e.g. Preetham Reddy)"
},
"since": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Only posts dated on or after this day, YYYY-MM-DD"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"description": "How many posts (default 20)"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}出力スキーマ
{
"type": "object",
"properties": {
"total": {
"type": "integer"
},
"posts": {
"type": "array",
"items": {
"type": "object",
"properties": {
"title": {
"type": "string"
},
"url": {
"type": "string"
},
"summary": {
"type": "string"
},
"date": {
"type": "string"
},
"updated": {
"type": "string"
},
"author": {
"type": "string"
},
"tags": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"title",
"url",
"summary",
"date",
"author",
"tags"
]
}
}
},
"required": [
"total",
"posts"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢get_services
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.
入力スキーマ
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}出力スキーマ
{
"type": "object",
"properties": {
"total": {
"type": "integer"
},
"services": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"url": {
"type": "string"
},
"kind": {
"type": "string",
"enum": [
"service",
"solution",
"databricks",
"ai",
"cloud",
"software",
"accelerator",
"product"
]
},
"metaTitle": {
"type": "string"
},
"summary": {
"type": "string"
}
},
"required": [
"name",
"url",
"kind",
"metaTitle",
"summary"
]
}
},
"indexes": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"total",
"services",
"indexes"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟡get_brief
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.
入力スキーマ
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}出力スキーマ
{
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"claimed",
"none"
]
},
"day": {
"type": "string",
"description": "The publishing day, in Phoenix"
},
"reason": {
"type": "string",
"description": "Why there is no brief today (status none)"
},
"brief_id": {
"type": "string"
},
"claimed_until": {
"type": "string"
},
"author": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"role": {
"type": [
"string",
"null"
]
}
},
"required": [
"name",
"role"
]
},
"kind": {
"type": "string",
"enum": [
"news",
"search-gap",
"backlog"
]
},
"topic": {
"type": "string"
},
"angle": {
"type": "string"
},
"why_this_topic": {
"type": "string"
},
"target_query": {
"type": [
"string",
"null"
]
},
"sources": {
"type": "array",
"items": {
"type": "object",
"properties": {
"title": {
"type": "string"
},
"url": {
"type": "string"
}
},
"required": [
"title",
"url"
]
}
},
"internal_links": {
"type": "array",
"items": {
"type": "object",
"properties": {
"title": {
"type": "string"
},
"url": {
"type": "string"
}
},
"required": [
"title",
"url"
]
}
},
"editorial_rules": {
"type": "string",
"description": "The editorial_rules resource's URI: the only copy of the rules"
},
"first_hand": {
"type": "string"
},
"steps": {
"type": "array",
"items": {
"type": "string"
}
},
"next": {
"type": "string"
}
},
"required": [
"status",
"day",
"next"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢lint_draft(markdown, images, kind, sources, slug)
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. Call it as often as you like; it files nothing. Iterate with this, never with check_draft.
入力スキーマ
{
"type": "object",
"properties": {
"markdown": {
"type": "string",
"description": "The whole post: frontmatter (title, description at least) and body"
},
"images": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "The file name the post refers to the image by, e.g. pipeline.png"
},
"data": {
"type": "string",
"description": "The image's bytes, base64 (PNG, JPEG, WebP or GIF, at most 10 MB). Required by submit_draft; check_draft needs only the name."
},
"alt": {
"type": "string",
"description": "What the image shows, for its alt text and caption"
}
},
"required": [
"name"
],
"additionalProperties": false
},
"maxItems": 10,
"description": "The images the post refers to by name (names only; no data needed)"
},
"kind": {
"type": "string",
"enum": [
"post",
"case-study"
],
"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 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."
},
"sources": {
"type": "string",
"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."
},
"slug": {
"type": "string",
"description": "The draft's slug, when it has one already (get_status draft.slug); otherwise it comes from the title"
}
},
"required": [
"markdown"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}🟡check_draft(markdown, id, images, kind, sources, ...)
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.
入力スキーマ
{
"type": "object",
"properties": {
"markdown": {
"type": "string",
"description": "The whole post: frontmatter (title, description at least) and body. With id: optional, and must be the saved text"
},
"id": {
"type": "string",
"description": "A draft of yours (the idea id from submit_draft): checks its saved text, the final verification publish_draft needs"
},
"images": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "The file name the post refers to the image by, e.g. pipeline.png"
},
"data": {
"type": "string",
"description": "The image's bytes, base64 (PNG, JPEG, WebP or GIF, at most 10 MB). Required by submit_draft; check_draft needs only the name."
},
"alt": {
"type": "string",
"description": "What the image shows, for its alt text and caption"
}
},
"required": [
"name"
],
"additionalProperties": false
},
"maxItems": 10
},
"kind": {
"type": "string",
"enum": [
"post",
"case-study"
],
"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 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."
},
"sources": {
"type": "string",
"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."
},
"client_confirmed": {
"type": "boolean",
"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."
},
"wait_seconds": {
"type": "integer",
"minimum": 0,
"maximum": 50,
"description": "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)"
}
},
"required": [],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}出力スキーマ
{
"type": "object",
"properties": {
"check_id": {
"type": "string"
},
"kind": {
"type": "string",
"enum": [
"post",
"case-study"
]
},
"run": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"running",
"done",
"error",
"stalled"
]
},
"ready": {
"type": "boolean",
"description": "Every item passed on this exact text"
},
"failing": {
"type": "array",
"items": {
"type": "string"
}
},
"could_not_run": {
"type": "array",
"items": {
"type": "string"
}
},
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"label": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"queued",
"running",
"pass",
"fail",
"error"
],
"description": "error: it could not run"
},
"why": {
"type": "string"
},
"findings": {
"type": "array",
"items": {
"type": "object",
"properties": {
"text": {
"type": "string"
},
"span": {
"type": "string"
}
},
"required": [
"text"
]
}
},
"override": {
"type": "string",
"enum": [
"overridable",
"hard"
],
"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"
}
},
"required": [
"id",
"label",
"status"
]
}
},
"stage": {
"type": "string"
},
"error": {
"type": "string"
},
"missing": {
"type": "array",
"items": {
"type": "object",
"properties": {
"need": {
"type": "string"
},
"detail": {
"type": "string"
}
},
"required": [
"need",
"detail"
]
}
},
"note": {
"type": "string"
},
"next": {
"type": "string"
}
},
"required": [
"check_id",
"run",
"status",
"ready",
"failing",
"could_not_run",
"items",
"next"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟡submit_draft(title, markdown, images, kind, sources, ...)
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.
入力スキーマ
{
"type": "object",
"properties": {
"title": {
"type": "string",
"description": "The post's working title"
},
"markdown": {
"type": "string",
"description": "The whole post, with its frontmatter (title, description at least): it becomes the draft as sent"
},
"images": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "The file name the post refers to the image by, e.g. pipeline.png"
},
"data": {
"type": "string",
"description": "The image's bytes, base64 (PNG, JPEG, WebP or GIF, at most 10 MB). Required by submit_draft; check_draft needs only the name."
},
"alt": {
"type": "string",
"description": "What the image shows, for its alt text and caption"
}
},
"required": [
"name"
],
"additionalProperties": false
},
"maxItems": 10
},
"kind": {
"type": "string",
"enum": [
"post",
"case-study"
],
"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 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."
},
"sources": {
"type": "string",
"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."
},
"client_confirmed": {
"type": "boolean",
"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."
},
"brief_id": {
"type": "string",
"description": "The brief_id get_brief returned, when the post is from today's brief: it marks the brief done"
}
},
"required": [
"title",
"markdown"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}🔴update_draft(id, markdown, base_sha, kind, sources, ...)
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 version you edited (base_sha from get_status), and never while it is open in the browser editor. The job commits it and rebuilds the preview; 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.
入力スキーマ
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The idea id"
},
"markdown": {
"type": "string",
"description": "The whole post, with its frontmatter"
},
"base_sha": {
"type": "string",
"description": "draft.base_sha from get_status: the version your edit started from"
},
"kind": {
"type": "string",
"enum": [
"post",
"case-study"
],
"default": "post",
"description": "Optional: the draft's kind, which is fixed when it is submitted. Sent, it must match (get_status says it)."
},
"sources": {
"type": "string",
"description": "A case study only: new sources, replacing the ones sent before (what its numbers are checked against)."
},
"client_confirmed": {
"type": "boolean",
"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."
}
},
"required": [
"id",
"markdown",
"base_sha"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}🟡get_status(id)
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_sha (for update_draft), 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.
入力スキーマ
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The idea id"
}
},
"required": [
"id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}出力スキーマ
{
"type": "object",
"properties": {
"id": {
"type": "string"
},
"kind": {
"type": "string",
"enum": [
"post",
"case-study"
]
},
"title": {
"type": "string"
},
"byline": {
"type": "string"
},
"state": {
"type": "string"
},
"meaning": {
"type": "string"
},
"note": {
"type": "string"
},
"draft": {
"type": [
"object",
"null"
],
"properties": {
"sha": {
"type": "string"
},
"slug": {
"type": "string"
},
"preview_url": {
"type": [
"string",
"null"
]
},
"editor_link": {
"type": [
"string",
"null"
],
"description": "Always null: the editor link is only in the engineer's email. publish_draft publishes from here, after the engineer confirms"
},
"failing": {
"type": "array",
"items": {
"type": "string"
}
},
"could_not_check": {
"type": "array",
"items": {
"type": "string"
}
},
"markdown": {
"type": [
"string",
"null"
]
},
"base_sha": {
"type": "string"
},
"why_no_markdown": {
"type": "string"
}
},
"required": [
"sha",
"slug",
"preview_url",
"editor_link",
"failing",
"could_not_check",
"markdown"
]
},
"last_check": {
"type": [
"object",
"null"
],
"properties": {
"run": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"running",
"done",
"error",
"stalled"
]
},
"ready": {
"type": "boolean",
"description": "Every item passed on this exact text"
},
"failing": {
"type": "array",
"items": {
"type": "string"
}
},
"could_not_run": {
"type": "array",
"items": {
"type": "string"
}
},
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"label": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"queued",
"running",
"pass",
"fail",
"error"
],
"description": "error: it could not run"
},
"why": {
"type": "string"
},
"findings": {
"type": "array",
"items": {
"type": "object",
"properties": {
"text": {
"type": "string"
},
"span": {
"type": "string"
}
},
"required": [
"text"
]
}
},
"override": {
"type": "string",
"enum": [
"overridable",
"hard"
],
"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"
}
},
"required": [
"id",
"label",
"status"
]
}
},
"stage": {
"type": "string"
},
"error": {
"type": "string"
},
"missing": {
"type": "array",
"items": {
"type": "object",
"properties": {
"need": {
"type": "string"
},
"detail": {
"type": "string"
}
},
"required": [
"need",
"detail"
]
}
},
"on_current_text": {
"type": "boolean"
}
},
"required": [
"run",
"status",
"ready",
"failing",
"could_not_run",
"items",
"on_current_text"
]
},
"live_url": {
"type": [
"string",
"null"
],
"description": "Where it is live, once published"
},
"revises": {
"type": "object",
"description": "A revision of a live post (revise_post): the post it replaces on publish, at the same URL and byline",
"properties": {
"slug": {
"type": "string"
},
"url": {
"type": "string"
},
"byline": {
"type": "string"
}
},
"required": [
"slug",
"url",
"byline"
]
},
"next": {
"type": "string"
}
},
"required": [
"id",
"title",
"byline",
"state",
"meaning",
"draft",
"last_check",
"next"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴publish_draft(id, confirmation, override, confirm_via)
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. 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.
入力スキーマ
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The idea id of your own draft"
},
"confirmation": {
"type": "string",
"description": "Only on the second call: the confirmation the first call returned, sent back after the engineer said yes"
},
"override": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 20,
"description": "Publish anyway: the failing check ids (as check_draft reports them, such as gate:buyer) the engineer chooses to publish past. Only wording and style checks; the hard set (the page working, claims, our own spend, secrets) always has to pass. Send the same list on the confirming call"
},
"confirm_via": {
"type": "string",
"enum": [
"elicitation",
"token"
],
"description": "How the engineer is asked. Default: elicitation where the client supports it. \"token\": the first call returns a one-time confirmation instead, for a UI (an MCP App's Publish button) that asks the engineer itself"
}
},
"required": [
"id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}🟡preview_draft(id)
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 (changes no text), 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.
入力スキーマ
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The idea id"
}
},
"required": [
"id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}🟡revise_post(post)
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.
入力スキーマ
{
"type": "object",
"properties": {
"post": {
"type": "string",
"description": "The live post to change: its URL (https://www.techfabric.com/blog/<slug>) or its slug"
}
},
"required": [
"post"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}コミュニティ
エビデンス