{"data":{"name":"com.techfabric/techfabric","title":"TechFabric","description":"Write TechFabric posts from your agent. Walk through posts, compare studies, check readiness.","version":"1.6.0","websiteUrl":"https://www.techfabric.com","repositoryUrl":"https://github.com/Fabric-Pro/techfabric-mcp","remotes":[{"type":"streamable-http","url":"https://www.techfabric.com/mcp"}],"packages":[],"status":"active","isLatest":true,"publishedAt":"2026-10-27T18:53:29.254Z","updatedAt":"2026-10-27T18:53:29.254Z","source":"official-registry","verification":"official","confidence":100,"stars":null,"sources":[{"source":"official-registry","sourceId":"com.techfabric/techfabric","verification":"official","confidence":100,"stars":null,"updatedAt":"2026-10-27T18:53:29.254Z","title":"TechFabric","description":"Write TechFabric posts from your agent. Walk through posts, compare studies, check readiness.","websiteUrl":"https://www.techfabric.com","repositoryUrl":"https://github.com/Fabric-Pro/techfabric-mcp"}],"toolIndex":{"tools":[{"serverName":"com.techfabric/techfabric","endpointFingerprint":"3c0bf3bae0a5d63d5b0dfea9def807bbc53701f656805ab6ec0c43873cd9c477","name":"apply_edits","title":"Apply the accepted changes","description":"Requires a TechFabric engineer's Microsoft sign-in (scope blog.write). The engineer's decision on a proposal (propose_edits): the changes they accepted are applied to the saved text and saved (as update_draft saves), the rule-based checks run at once and the full check starts in the background. Only what the engineer accepted, never your own choice. Never publishes.","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"The draft's id"},"proposal_id":{"type":"string","description":"The proposal's id, from propose_edits"},"accept":{"type":"array","items":{"type":"string"},"description":"The ids of the changes the engineer accepted"},"reject":{"type":"array","items":{"type":"string"},"description":"The ids of the changes the engineer rejected"}},"required":["id","proposal_id","accept"],"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false},"annotations":{"title":"Apply the accepted changes","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false},"definitionHash":"e806861c230d8f0ef23ee0732e8ce272fad047822ff10ee011b91eadec072abc","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-10-30T14:47:01.451Z","metadataTrust":"untrusted"},{"serverName":"com.techfabric/techfabric","endpointFingerprint":"3c0bf3bae0a5d63d5b0dfea9def807bbc53701f656805ab6ec0c43873cd9c477","name":"ask_author","title":"Ask you a question","description":"Requires a TechFabric engineer's Microsoft sign-in (scope blog.write). One question only the engineer can answer (what was measured, who it was for, what happened): returned for you to ask in chat (or, with form: true, asked in a form where the client shows one); call again with their answer, word for word. The answer is stored as one of the draft's sources, which the fact-check reads as their own words. Never answer it yourself.","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"The draft's id"},"question":{"type":"string","description":"One question only the engineer can answer, in plain words"},"passage":{"type":"string","description":"The sentence or section it is about, when there is one"},"answer":{"type":"string","description":"The engineer's answer, word for word, when you asked them in chat"},"form":{"type":"boolean","description":"true: in a client that shows forms, ask the engineer in a form. Left out, the question comes back for you to ask in chat"}},"required":["id","question"],"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false},"annotations":{"title":"Ask you a question","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"definitionHash":"c258eebd39c0bb2404e907127594e86c9c66a82f66a95e6acff128373e4b224c","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-10-30T14:47:01.451Z","metadataTrust":"untrusted"},{"serverName":"com.techfabric/techfabric","endpointFingerprint":"3c0bf3bae0a5d63d5b0dfea9def807bbc53701f656805ab6ec0c43873cd9c477","name":"assess_databricks_readiness","title":"Databricks readiness check","description":"Interactive: a Databricks readiness and migration check: eight multiple-choice questions (where the data runs now, how well the estate is known, access, deployment, failures, cost visibility, the team, the first use), scored by fixed points into five areas, with a readout: where to start, what to work on first, and links to TechFabric's own service pages, posts and Databricks Field Guide chapters, then the contact page with the matching topic. Call it without answers for the questions; with form: true, a client that shows forms asks them in one; a host with MCP Apps scores them in its view, and otherwise ask the reader in chat and send answers. The answers are scored and never stored or logged. For example: \"are we ready for Databricks\", \"assess our migration readiness\", \"where should we start with Databricks\".","inputSchema":{"type":"object","properties":{"answers":{"type":"object","additionalProperties":{"type":"string"},"description":"The reader's answers, { question id: option value } (the first call lists both). Leave out to get the questions"},"contact":{"type":"boolean","description":"The reader asked to talk to TechFabric about the readout: a client that can opens /contact for them to confirm (a URL elicitation)"},"form":{"type":"boolean","description":"true: in a client that shows forms and no MCP Apps view, ask the reader the questions in a form and return the readout. Send it only when the reader wants to answer in a form; left out, the questions come back unanswered"}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false},"annotations":{"title":"Databricks readiness check","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"definitionHash":"34382ad4ae76990a7c4442085d8d1969f900a21966348091e86e670c6bed2dc3","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-10-30T14:47:01.451Z","metadataTrust":"untrusted"},{"serverName":"com.techfabric/techfabric","endpointFingerprint":"3c0bf3bae0a5d63d5b0dfea9def807bbc53701f656805ab6ec0c43873cd9c477","name":"check_draft","title":"Check a draft","description":"Requires a TechFabric engineer's Microsoft sign-in (scope blog.write). The final verification publish_draft needs. With id: the full checks on your saved draft (judge, slop classifier, fact-check), about a minute; call it after lint_draft passes, never to iterate. Each call waits up to 25 seconds and then reports progress: call it again, never two at once, for the answer (nothing runs twice; a client with the tasks extension gets a task). Right after submit_draft it waits while the draft is filed. Without id it checks markdown and files nothing, which publish_draft doesn't count. On next_action confirm, send first_hand_to_confirm back as first_hand: the engineer confirms, never you.","inputSchema":{"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":"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."},"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."},"first_hand":{"type":"array","maxItems":10,"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":{"type":"object","properties":{"claim":{"type":"string","description":"The sentence, exactly as the fact-check quoted it"},"basis":{"type":"string","enum":["measured","our_product","client_told_us","customers_ask","we_did_it","own_work"],"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"}},"required":["claim","basis"],"additionalProperties":false}},"first_hand_all":{"type":"boolean","description":"Confirm all listed: true asks the engineer to confirm, in one go, every first-hand claim the last check of this text listed (first_hand_to_confirm), instead of listing them in first_hand. The list is the server's, from that check: a client's result, a client's fact and a known error are never in it and come back apart (first_hand.excluded). It asks as first_hand does (one form showing every claim, or a question and a one-time confirmation to send back with first_hand_all: true); it never confirms anything on your word. Each claim is still recorded on its own under the engineer's name."},"first_hand_confirmation":{"type":"string","description":"Only after asking the engineer and hearing yes: the confirmation an earlier answer gave for exactly this first_hand (first_hand.confirmation). It works once, for ten minutes, for those claims in that text"},"confirm_via":{"type":"string","enum":["elicitation","token"],"description":"With first_hand or first_hand_all: how the engineer is asked. Default: a form in their client where it can show one. \"token\": the question and a one-time confirmation instead, for a UI that asks them itself (an MCP App's button)"},"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},"annotations":{"title":"Check a draft","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"definitionHash":"ba554bb76ec85844601db96c2d65f709342d24f0ca9b2004c05fcfae58f172ff","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-10-30T14:47:01.451Z","metadataTrust":"untrusted"},{"serverName":"com.techfabric/techfabric","endpointFingerprint":"3c0bf3bae0a5d63d5b0dfea9def807bbc53701f656805ab6ec0c43873cd9c477","name":"check_outline","title":"Check an outline","description":"Requires a TechFabric engineer's Microsoft sign-in (scope blog.write). A read, about a millisecond, free: an outline (title options, the opening's two sentences, four to six sections with a line each, the diagram, the FAQ questions; a case study's four sections) against the title, opening, heading and FAQ rules, before any prose; the opening's device and first words are held to the last ten published posts (editorial/voices-of-techfabric.md). Fix what it finds and call again until ready; then show the engineer outline_markdown and draft only after their OK.","inputSchema":{"type":"object","properties":{"kind":{"type":"string","enum":["post","case-study","explainer"],"default":"post"},"titles":{"type":"array","items":{"type":"string"},"maxItems":5,"description":"Two or three title options, each one clause naming the subject."},"meta_title":{"type":"string","description":"A search title of 60 characters or fewer, only when a title runs longer."},"opening":{"type":"string","description":"The opening's first two sentences: the way this story opens (a device the last ten posts left free: editorial/voices-of-techfabric.md), with one concrete detail and TechFabric doing the work by the second sentence. Not for a case study."},"sections":{"type":"array","maxItems":12,"items":{"type":"object","properties":{"heading":{"type":"string"},"summary":{"type":"string","description":"One line: what the section tells the reader"}},"required":["heading"]},"description":"Four to six for a post; Challenge, Strategy, Solution and Results for a case study. The FAQ isn't one of them."},"diagram":{"type":"string","description":"What the diagram draws, step by step, and its point. Not for a case study."},"faqs":{"type":"array","items":{"type":"string"},"maxItems":12,"description":"Three or more questions a reader would search for. Not for a case study."},"reader":{"type":"string","description":"Who the post is for."},"unattended":{"type":"boolean","description":"true in a scheduled run with nobody to approve the outline: a passing outline goes straight to drafting."}},"required":["titles","sections"],"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false},"annotations":{"title":"Check an outline","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"definitionHash":"2ec660a7fa625406be05bb1d4a0d54f16bc540f4a2e94f924838a9ea03e72401","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-10-30T14:47:01.451Z","metadataTrust":"untrusted"},{"serverName":"com.techfabric/techfabric","endpointFingerprint":"3c0bf3bae0a5d63d5b0dfea9def807bbc53701f656805ab6ec0c43873cd9c477","name":"compare_case_studies","title":"Compare case studies","description":"Interactive: two or three of TechFabric's published case studies side by side: each one's challenge, strategy, solution and results, in its own words (the bold statement and the start of each section), with its client, sector and stack where the case study states them, and links to each section. Name them by slug or URL, or give a topic for the closest three; with neither, the list to choose from. Nothing is added that the case studies don't publish. For example: \"compare your case studies\", \"how did these two projects differ\", \"show me your Databricks projects side by side\".","inputSchema":{"type":"object","properties":{"case_studies":{"type":"array","minItems":1,"maxItems":3,"items":{"type":"string","minLength":1,"maxLength":300},"description":"Two or three case studies: each a slug (funko, canvass), a URL, or words of its title. Leave out for the list"},"topic":{"type":"string","maxLength":200,"description":"Instead of case_studies: the closest case studies to this, up to three"}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false},"annotations":{"title":"Compare case studies","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"definitionHash":"f65538c6b165f73a2fc75ff2d7bd0dbca5ca1f7a43454b5c69ba8b7c28bfdb67","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-10-30T14:47:01.451Z","metadataTrust":"untrusted"},{"serverName":"com.techfabric/techfabric","endpointFingerprint":"3c0bf3bae0a5d63d5b0dfea9def807bbc53701f656805ab6ec0c43873cd9c477","name":"explore_post","title":"Explore a post","description":"Interactive: walk through a published techfabric.com post or case study: its diagram (the Mermaid flowchart it publishes) as steps in the order it flows, each step tied to the section it's about, with that section's opening in the page's own words and a link to it. A page with no diagram steps through its sections. Takes a URL, a slug or a topic (the closest post or case study). In a host that renders MCP Apps it opens as a view to click through; the text is complete without it. For example: \"walk me through this post step by step\", \"show me how this works\", \"explain the diagram in this case study\".","inputSchema":{"type":"object","properties":{"post":{"type":"string","minLength":1,"maxLength":500,"description":"A post or case study: its URL, path or slug (case studies as case-studies/<slug>), or the topic to find one on"},"diagram":{"type":"integer","minimum":1,"maximum":20,"description":"Which of its diagrams, when it has more than one (default 1)"}},"required":["post"],"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false},"annotations":{"title":"Explore a post","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"definitionHash":"bb480543b47536b0b0cf26e7e3db7e27e3e25ac2156d46f33c0791e78cdc1abd","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-10-30T14:47:01.451Z","metadataTrust":"untrusted"},{"serverName":"com.techfabric/techfabric","endpointFingerprint":"3c0bf3bae0a5d63d5b0dfea9def807bbc53701f656805ab6ec0c43873cd9c477","name":"get_brief","title":"Today's brief","description":"Requires a TechFabric engineer's Microsoft sign-in (scope blog.write). Today's topic for a daily post, claimed for you for 24 hours (asking again returns the same one): the topic, angle, target search, sources, internal links, and the brief_id to pass to submit_draft. Status none, with the reason, when there is nothing today: stop there. No model is called. Ask the engineer for first-hand detail; never invent it.","inputSchema":{"type":"object","properties":{},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false},"annotations":{"title":"Today's brief","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"definitionHash":"27e93013770f051b07a4f7c16bb9388194e99f5a0602f61d3c8d04a6185491f7","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-10-30T14:47:01.451Z","metadataTrust":"untrusted"},{"serverName":"com.techfabric/techfabric","endpointFingerprint":"3c0bf3bae0a5d63d5b0dfea9def807bbc53701f656805ab6ec0c43873cd9c477","name":"get_brief_pool","title":"Brief pool","description":"Requires a TechFabric engineer's Microsoft sign-in (scope blog.write), and only the site owner's is accepted (the Fabric Agents brief automation runs as him). A read: the briefs proposed and not yet taken, the competitor-gap and backlog searches no post or idea covers yet, the 30 most recent posts and the ideas in flight. What the brief automation reads before it proposes. Deterministic, no model; it changes nothing.","inputSchema":{"type":"object","properties":{},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false},"annotations":{"title":"Brief pool","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"definitionHash":"8e90ccd93a3eee3fad912b9fc92590153a2c51c5f9f463e886a84b3c72bf0980","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-10-30T14:47:01.451Z","metadataTrust":"untrusted"},{"serverName":"com.techfabric/techfabric","endpointFingerprint":"3c0bf3bae0a5d63d5b0dfea9def807bbc53701f656805ab6ec0c43873cd9c477","name":"get_page","title":"Read a page","description":"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. Drafts are private: list_drafts lists a signed-in engineer's drafts; a TechFabric engineer connects with Microsoft (the client's Connect or Authenticate button) to list and write them.","inputSchema":{"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},"annotations":{"title":"Read a page","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"definitionHash":"8215eb8e5f1dbf401722480730b5d9e1dc193a3d8e5ad01ab5b00b9c03ace0ea","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-10-30T14:47:01.451Z","metadataTrust":"untrusted"},{"serverName":"com.techfabric/techfabric","endpointFingerprint":"3c0bf3bae0a5d63d5b0dfea9def807bbc53701f656805ab6ec0c43873cd9c477","name":"get_services","title":"What TechFabric offers","description":"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.","inputSchema":{"type":"object","properties":{},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false},"annotations":{"title":"What TechFabric offers","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"definitionHash":"dab316335e94756980b28c7e5a5db6bb637ea266dd7893d0a72fb67ef32dafae","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-10-30T14:47:01.451Z","metadataTrust":"untrusted"},{"serverName":"com.techfabric/techfabric","endpointFingerprint":"3c0bf3bae0a5d63d5b0dfea9def807bbc53701f656805ab6ec0c43873cd9c477","name":"get_status","title":"Where a draft stands","description":"Requires a TechFabric engineer's Microsoft sign-in (scope blog.write). Where one of your drafts stands (by its id; list_drafts lists them), with next_action: the single next step and the call to make. Also its saved Markdown and base_hash (for update_draft; read them again before each edit, as the engineer may have saved one in the draft app), what is failing, the last check, the preview link and, once published, live_url. A fact the blog writer waits on is in the status; form: true asks it as a form. Never the editor link: to edit in the browser, call open_editor. To show the engineer the draft itself (\"show me the preview\", \"show it here\"), call preview_draft, never fetch the preview link.","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"The idea id"},"form":{"type":"boolean","description":"true: when the blog writer waits on a fact only the engineer has, ask them in a form (a client that shows forms and no apps). Left out, the question is in the status for you to ask in chat"}},"required":["id"],"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false},"annotations":{"title":"Where a draft stands","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"definitionHash":"4acd94b4bc2e5817f422de685fec547aab5a0c0a9c12cc60e97ea1804407099d","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-10-30T14:47:01.451Z","metadataTrust":"untrusted"},{"serverName":"com.techfabric/techfabric","endpointFingerprint":"3c0bf3bae0a5d63d5b0dfea9def807bbc53701f656805ab6ec0c43873cd9c477","name":"lint_draft","title":"Lint a draft","description":"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.","inputSchema":{"type":"object","properties":{"markdown":{"type":"string","description":"The whole post: frontmatter (title, description at least) and body"},"id":{"type":"string","description":"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"},"rubric":{"type":"boolean","description":"Also return judge_rubric while checks still fail (it comes anyway once they pass)"},"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":"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."},"slug":{"type":"string","description":"The draft's slug, when it has one already (get_status draft.slug); otherwise it comes from the title"}},"required":[],"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false},"annotations":{"title":"Lint a draft","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"definitionHash":"038ae397e634ccb53c7636af781de0ab81666a7ca5c0bbd2c65438488eca48a1","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-10-30T14:47:01.451Z","metadataTrust":"untrusted"},{"serverName":"com.techfabric/techfabric","endpointFingerprint":"3c0bf3bae0a5d63d5b0dfea9def807bbc53701f656805ab6ec0c43873cd9c477","name":"lint_social","title":"Lint a LinkedIn post","description":"Requires a TechFabric engineer's Microsoft sign-in (scope blog.write). A read: the site's writing rules and the social rules on a LinkedIn post's text (the AI tells, the slop, claims, announcement openers, engagement bait, hashtags), its length, what shows before \"see more\", and, with post, whether it links the post. Rewrite each finding and lint again until ready. Posts nothing.","inputSchema":{"type":"object","properties":{"text":{"type":"string","description":"The LinkedIn post's text, as the engineer would post it (at most 10000 characters)"},"post":{"type":"string","description":"The published post it shares (its URL or slug): the text is checked for its link"}},"required":["text"],"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false},"annotations":{"title":"Lint a LinkedIn post","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"definitionHash":"b22e3b3b223d56649fa68695212e8cf4fbfb9c389b2ea2ac61f818c4dd44d064","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-10-30T14:47:01.451Z","metadataTrust":"untrusted"},{"serverName":"com.techfabric/techfabric","endpointFingerprint":"3c0bf3bae0a5d63d5b0dfea9def807bbc53701f656805ab6ec0c43873cd9c477","name":"list_drafts","title":"Your drafts","description":"Requires a TechFabric engineer's Microsoft sign-in (scope blog.write). Lists your drafts (blog posts, case studies and revisions of live posts), newest first: each one's id, title, kind, state (writing, question_for_you, drafted, checks_failing, ready_to_publish, published and the rest), created and updated dates, preview link and next_action. Filter by state, kind and creation date (created_after, created_before: \"yesterday\" is the day before the answer's today), and page with cursor. The editor may pass all for everyone's; the site owner, stale: true for his owner queue (drafts stuck over two days). Reads only. Then get_status with an id for one draft in detail.","inputSchema":{"type":"object","properties":{"state":{"type":"string","enum":["writing","preview_building","question_for_you","drafted","checking","checks_failing","ready_to_publish","publishing","published","stuck","closed","open","stale"],"description":"Only drafts in this state: writing, preview_building, question_for_you, drafted, checking, checks_failing, ready_to_publish, publishing, published, stuck, closed; or open, every one not yet published or closed; or stale, the site owner's queue (as stale: true). Leave it out for all"},"kind":{"type":"string","enum":["post","case-study","revision"],"description":"Only this kind: post, case-study, or revision (of a live post). Leave it out for all"},"created_after":{"type":"string","description":"Only drafts created at or after this: a date (YYYY-MM-DD, midnight UTC) or an ISO 8601 time with its offset. For yesterday: created_after yesterday's date and created_before today's (the answer's today is the server's date, UTC; pass times with the engineer's offset for their own day)"},"created_before":{"type":"string","description":"Only drafts created before this (not at it): a date (YYYY-MM-DD, midnight UTC) or an ISO 8601 time"},"all":{"type":"boolean","description":"The blog's editor only: everyone's drafts, not just yours. Refused for anyone else"},"stale":{"type":"boolean","description":"The site owner only, his owner queue: everyone's drafts with nothing from their author for more than two days (stuck, a question for them, held, drafted or failing checks; never an agent's explainer), oldest wait first. \"Show my owner queue\" is this. Refused for anyone else"},"limit":{"type":"integer","minimum":1,"maximum":50,"description":"How many to return, newest first (default 20)"},"cursor":{"type":"string","description":"The next_cursor from the previous page, with the same filters"}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false},"annotations":{"title":"Your drafts","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"definitionHash":"6c2b66ceecbd90747ddcb1f246dc6d087a7cc33db074578ad23cb00fa63e2f11","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-10-30T14:47:01.451Z","metadataTrust":"untrusted"},{"serverName":"com.techfabric/techfabric","endpointFingerprint":"3c0bf3bae0a5d63d5b0dfea9def807bbc53701f656805ab6ec0c43873cd9c477","name":"list_posts","title":"List blog posts","description":"TechFabric's published blog posts, newest first, optionally only those with a tag, by an author, or dated on or after a day. Drafts are private: list_drafts lists a signed-in engineer's drafts; a TechFabric engineer connects with Microsoft (the client's Connect or Authenticate button) to list and write them.","inputSchema":{"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},"annotations":{"title":"List blog posts","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"definitionHash":"7d5f5181f1387d569e3e776067c0f094d025466580e881b4e8dcfe75ce003410","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-10-30T14:47:01.451Z","metadataTrust":"untrusted"},{"serverName":"com.techfabric/techfabric","endpointFingerprint":"3c0bf3bae0a5d63d5b0dfea9def807bbc53701f656805ab6ec0c43873cd9c477","name":"open_editor","title":"Open in the browser editor","description":"Requires a TechFabric engineer's Microsoft sign-in (scope blog.write). When the engineer asks to open or edit a draft, or one of their published posts, in the browser: a link to the browser editor that works once and expires in 15 minutes. Show it to them as a link and say so; never open or fetch it yourself. id is one of their drafts; post (or a published draft's id) opens or finds the post's revision, as revise_post does. Only their own drafts and posts (the site owner: any). The editor link in their email is unchanged.","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"One of your drafts (list_drafts lists them). A published one opens its revision."},"post":{"type":"string","description":"Instead of id: one of your published posts, its URL or slug. Opens (or finds) its revision."}},"additionalProperties":false},"annotations":{"title":"Open in the browser editor","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"definitionHash":"74224197ab1820a84da620ace976a83de32ee791d2492b97c83da9c5a8320e83","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-10-30T14:47:01.451Z","metadataTrust":"untrusted"},{"serverName":"com.techfabric/techfabric","endpointFingerprint":"3c0bf3bae0a5d63d5b0dfea9def807bbc53701f656805ab6ec0c43873cd9c477","name":"place_image","title":"Put an image in the post","description":"Requires a TechFabric engineer's Microsoft sign-in (scope blog.write). A read: the Markdown for an image already uploaded to your draft, `![alt](name \"caption\")`, and with markdown the post with it in after the paragraph `after` names (or at the end) and the image rules read on it. Alt text is required (WCAG 2.1): without it, or with one that is the file name, \"screenshot\", the caption again, under 5 or over 250 characters, it returns the question to ask the engineer and no snippet: never write one yourself. decorative: true, only on the engineer's word, places a decorative image with empty alt. Saves nothing: save the post with update_draft.","inputSchema":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-f0-9]{8}$","description":"The draft's 8-character id (list_drafts lists yours)"},"name":{"type":"string","description":"The image's name, as the upload answered"},"alt":{"type":"string","description":"The engineer's own description of what it shows, 5 to 250 characters, not the file name, \"screenshot\" or the caption (WCAG 2.1); never yours. Refused, with the reason, when it doesn't serve"},"decorative":{"type":"boolean","description":"true only when the engineer says the image is purely decorative: no alt, no caption, and screen readers skip it"},"caption":{"type":"string","description":"A caption shown under it (optional, at most 140 characters)"},"markdown":{"type":"string","description":"The whole post: returned with the image in, and the image rules read on it"},"after":{"type":"string","description":"A few words of the paragraph the image goes after; left out, it goes at the end"}},"required":["id","name"],"additionalProperties":false},"annotations":{"title":"Put an image in the post","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"definitionHash":"bcbf94796301f8be5c39a5fa8463743ad0ed1a9653319c73b2bc629db3c2c7f4","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-10-30T14:47:01.451Z","metadataTrust":"untrusted"},{"serverName":"com.techfabric/techfabric","endpointFingerprint":"3c0bf3bae0a5d63d5b0dfea9def807bbc53701f656805ab6ec0c43873cd9c477","name":"post_performance","title":"How a post is doing","description":"Requires a TechFabric engineer's Microsoft sign-in (scope blog.write). A read: how one of your own published posts is doing in Google (the blog's editor: any post). Search Console's clicks, impressions, CTR and average position for the last 28 days against the 28 before, the searches it shows for, whether Google has indexed it, and what to improve, each with the numbers behind it. Without post: all your posts with their last 28 days. Searches from the US only, so totals are lower than Search Console's all-countries view; cached for six hours. No model is called and nothing changes: revise_post changes a live post, only after the engineer agrees.","inputSchema":{"type":"object","properties":{"post":{"type":"string","description":"One of your published posts: its URL (https://www.techfabric.com/blog/<slug>) or its slug. Leave it out for all your posts, with their last 28 days."}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false},"annotations":{"title":"How a post is doing","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true},"definitionHash":"ae4620e9acb6041aa3d42fbe3d77bd913956f5a31b2e6ff2539c35532236966c","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-10-30T14:47:01.451Z","metadataTrust":"untrusted"},{"serverName":"com.techfabric/techfabric","endpointFingerprint":"3c0bf3bae0a5d63d5b0dfea9def807bbc53701f656805ab6ec0c43873cd9c477","name":"preview_diagram","title":"Preview diagrams","description":"Requires a TechFabric engineer's Microsoft sign-in (scope blog.write). A read: every ```mermaid block in a post (or one mermaid source), as the site will treat it. For each: its lines in the post, its caption, whether the site's mermaid parses it (with the error and its line in the post when it doesn't), and the diagram rules' findings (a caption that states the point; no fact in a label the section's text doesn't say). In a host that renders MCP Apps it opens the diagrams drawn in the site's theme. Files nothing, calls no model; use it while drafting, then lint_draft the whole post.","inputSchema":{"type":"object","properties":{"markdown":{"type":"string","description":"The whole post, frontmatter included, or one mermaid source. At most 200,000 characters"}},"required":["markdown"],"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false},"annotations":{"title":"Preview diagrams","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"definitionHash":"fd4025a26ef58203d470b59d0837141b74eed21c95ec73a6bd678dfd21d2de4a","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-10-30T14:47:01.451Z","metadataTrust":"untrusted"},{"serverName":"com.techfabric/techfabric","endpointFingerprint":"3c0bf3bae0a5d63d5b0dfea9def807bbc53701f656805ab6ec0c43873cd9c477","name":"preview_draft","title":"Preview your draft","description":"Requires a TechFabric engineer's Microsoft sign-in (scope blog.write). Interactive: show one of your drafts here. Call it whenever the engineer asks to show, see or open the preview, to show it here, or what the draft looks like (for example: \"show me the preview\", \"show it here\", \"can I see the draft\", \"open the preview\", \"what does it look like\"). A read: the draft as techfabric.com renders it, with its last checks (each marked as one the engineer may publish past or one that must pass) and whether Publish may run, rendered inline as the draft app where the host shows MCP Apps. In any host its text starts with the preview link: show it to the engineer. Never fetch the preview link yourself or rebuild the page as an artifact or HTML: this is the preview.","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"The idea id"},"instance":{"type":"string","description":"The draft app only: its view's own id, with editing"},"editing":{"type":"boolean","description":"The draft app only, never an agent: true while the engineer has unsaved edits in its Edit tab (takes or renews the app's edit hold), false when they save, discard or leave it (lets go). It changes no text; with it the answer is the hold, not the preview"},"wait_seconds":{"type":"integer","minimum":0,"maximum":25,"description":"While the preview builds: how long to wait for it before answering (default 0, most 25)"}},"required":["id"],"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false},"annotations":{"title":"Preview your draft","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"definitionHash":"0db52854b74ce505a0ec3a96b5626f3b02fbdc39ff57b3ed561b1f9cf1c55a4f","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-10-30T14:47:01.451Z","metadataTrust":"untrusted"},{"serverName":"com.techfabric/techfabric","endpointFingerprint":"3c0bf3bae0a5d63d5b0dfea9def807bbc53701f656805ab6ec0c43873cd9c477","name":"propose_brief","title":"Propose a brief","description":"Requires a TechFabric engineer's Microsoft sign-in (scope blog.write), and only the site owner's is accepted (the Fabric Agents brief automation runs as him). Adds one brief to the pool get_brief offers engineers, first and matched to their work: topic, why (the evidence), angle, sources, target_query, for_author. Refused with the reason, nothing stored, when a live post or an idea in flight covers it, an open proposal already is it, or today's 3 are used; the same topic again is the same brief. Drafts and publishes nothing; no model.","inputSchema":{"type":"object","properties":{"topic":{"type":"string","description":"The post's subject in a few words (8 to 140 characters)"},"why":{"type":"string","description":"The evidence: the TechFabric work it comes from (a repository, a project, a published post), or the search data (query, monthly volume, who ranks). Never a guess"},"angle":{"type":"string","description":"What the post argues or shows, and for which reader"},"sources":{"type":"array","maxItems":5,"items":{"type":"object","properties":{"title":{"type":"string"},"url":{"type":"string","description":"https URL"}},"required":["title","url"],"additionalProperties":false}},"target_query":{"type":"string","description":"The search the post should answer, when there is one"},"for_author":{"type":"string","description":"An engineer from the author registry, when the work is theirs; leave out to offer it to whoever's work fits"}},"required":["topic","why","angle"],"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false},"annotations":{"title":"Propose a brief","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"definitionHash":"5bd1c5c71448712d402ab62b78cd99e4d3f9d799ef2a2e6a6b233bd2d6ad0373","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-10-30T14:47:01.451Z","metadataTrust":"untrusted"},{"serverName":"com.techfabric/techfabric","endpointFingerprint":"3c0bf3bae0a5d63d5b0dfea9def807bbc53701f656805ab6ec0c43873cd9c477","name":"propose_edits","title":"Propose a redline","description":"Requires a TechFabric engineer's Microsoft sign-in (scope blog.write). Propose changes to a filed draft as a redline the engineer decides on: each change a passage of the saved markdown (find, exactly as it is), what you propose instead (replace) and why (reason), at most 12 changes and 160 rewritten words each. Saves nothing. Show the engineer redline_text and send what they accept to apply_edits (or ask: true, a form where the client shows one). Use it for every fix to a filed draft, instead of update_draft.","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"The draft's id"},"base_hash":{"type":"string","description":"The saved text's hash the changes are against: draft.base_hash from get_status, or your last save's text_hash"},"changes":{"type":"array","minItems":1,"maxItems":12,"items":{"type":"object","properties":{"find":{"type":"string","description":"A passage of the saved markdown, exactly as it is (redline_plan's find)"},"replace":{"type":"string","description":"What you propose instead; \"\" removes the passage"},"reason":{"type":"string","description":"Why, in one plain sentence for the engineer: what the change fixes, no slogan"},"card":{"type":"string","description":"The to-do card it fixes (todo.cards[].id), when it fixes one"},"occurrence":{"type":"integer","minimum":1,"description":"Which occurrence of find, when it appears more than once"}},"required":["find","replace","reason"],"additionalProperties":false}},"ask":{"type":"boolean","description":"true: ask the engineer about each change in a form, where the client shows one (when no draft app is showing)"}},"required":["id","base_hash","changes"],"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false},"annotations":{"title":"Propose a redline","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"definitionHash":"f5965e50b553ffd1925bb7c4305919e1bc5ad52dae89795f2025490e70df2a0c","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-10-30T14:47:01.451Z","metadataTrust":"untrusted"},{"serverName":"com.techfabric/techfabric","endpointFingerprint":"3c0bf3bae0a5d63d5b0dfea9def807bbc53701f656805ab6ec0c43873cd9c477","name":"publish_draft","title":"Publish your draft","description":"Requires a TechFabric engineer's Microsoft sign-in (scope blog.write). Publish one of your drafts to techfabric.com, only after the engineer confirms, once check_draft with the id has passed on exactly the saved text. The first call publishes nothing: with the draft card showing it waits for the engineer's Publish there; else a form, or a one-time confirmation you send back only after their yes. Never in a scheduled or unattended run. override names wording checks the engineer chooses to publish past (never the hard set, the fact-check, slop, quality, opening or ending). confirm_via \"token\": always return the one-time confirmation instead of a form, for a UI that asks the engineer itself.","inputSchema":{"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},"annotations":{"title":"Publish your draft","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true},"definitionHash":"d776cb4a96834976b59c3b26da932ce522625c16d6f8bcf728d8864b2738fe8c","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-10-30T14:47:01.451Z","metadataTrust":"untrusted"},{"serverName":"com.techfabric/techfabric","endpointFingerprint":"3c0bf3bae0a5d63d5b0dfea9def807bbc53701f656805ab6ec0c43873cd9c477","name":"quiz_me","title":"Quiz me on a post","description":"Interactive: a multiple-choice quiz from a published post's own FAQs: each question is one of its FAQs, the right option is the post's answer, and the others are answers the site gives to other questions; no model writes them. Each has its answer, the post's explanation and a link. With form: true, a client that shows forms asks the questions in one and scores it; a host with MCP Apps scores it in its view; otherwise the text lists the questions and the key: ask the reader before revealing it, then send their letters as answers to score. A reader who kept a resume code (Keep my progress, in a host without Fabric's view state) picks up with resume alone. For example: \"quiz me on this post\", \"test what I learned\", \"check my understanding\".","inputSchema":{"type":"object","properties":{"post":{"type":"string","minLength":1,"maxLength":500,"description":"A post with FAQs: its URL or slug, or the topic to find one on. Not needed with resume"},"resume":{"type":"string","minLength":5,"maxLength":600,"pattern":"^kp1\\.[A-Za-z0-9_-]+$","description":"A resume code the reader kept from an earlier quiz (it starts kp1.): picks up where they left off. The code names its post, so nothing else is needed"},"answers":{"type":"array","maxItems":8,"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"description":"The reader's answers, one per question in order: a letter (A to D) or a 0-based index. Sent, the quiz comes back scored"},"form":{"type":"boolean","description":"true: in a client that shows forms and no MCP Apps view, ask the reader the questions in a form and return the score. Send it only when the reader wants to answer in a form; left out, the quiz comes back unanswered"}},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false},"annotations":{"title":"Quiz me on a post","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"definitionHash":"639e13e6f240282cf97515647854fd957bc8ecec7fdac3f9320fee8577adbba0","schemaStatus":"valid","origin":"official-registry","observedAt":"2026-10-30T14:47:01.451Z","metadataTrust":"untrusted"}],"endpoints":[{"endpointFingerprint":"3c0bf3bae0a5d63d5b0dfea9def807bbc53701f656805ab6ec0c43873cd9c477","protocol":"streamable-http","status":"indexed","toolCount":36,"observedAt":"2026-10-30T14:47:01.451Z"}],"authentication":"unknown"},"connectionConfigurations":{"status":"ready","authentication":"not embedded","clients":{"Claude Desktop":{"mcpServers":{"com.techfabric/techfabric":{"url":"https://www.techfabric.com/mcp"}}},"Cursor":{"mcpServers":{"com.techfabric/techfabric":{"url":"https://www.techfabric.com/mcp"}}},"VS Code":{"servers":{"com.techfabric/techfabric":{"type":"http","url":"https://www.techfabric.com/mcp"}}}}},"resourceType":"mcp-server","callable":true,"runtime":{"callable":true,"protocols":["mcp"]},"interfaces":[{"protocol":"mcp","transport":"streamable-http","url":"https://www.techfabric.com/mcp"}],"profile":{"apiVersion":"1","schemaVersion":"1","id":"mcp-server:com.techfabric%2Ftechfabric","resourceType":"mcp-server","canonicalUrl":"https://www.agentsjunction.com/api/v1/servers/com.techfabric%2Ftechfabric","name":"com.techfabric/techfabric","description":"Write TechFabric posts from your agent. Walk through posts, compare studies, check readiness.","interfaces":[{"protocol":"mcp","transport":"streamable-http","url":"https://www.techfabric.com/mcp"}],"capabilities":[],"identity":{"source":"official-registry","websiteUrl":"https://www.techfabric.com","repositoryUrl":"https://github.com/Fabric-Pro/techfabric-mcp","version":"1.6.0"},"verification":{"state":"official","confidence":100},"operations":{"resourceType":"mcp-server","name":"com.techfabric/techfabric","status":"online","lastCheckedAt":"2026-11-03T17:18:05.110Z","lastSuccessfulCheck":"2026-11-03T17:18:05.110Z","latencyMs":1379,"consecutiveFailures":0,"isStale":false,"checks":{"endpointReachable":true,"protocolValid":true,"agentCardValid":null,"mcpHandshakeValid":true},"lastSeen":null,"lastSuccessfulInteraction":null,"lastHealthCheck":"2026-11-03T17:18:05.110Z","source":{"type":"health-check","url":null},"observedAt":"2026-11-03T17:18:05.110Z"},"security":null,"timestamps":{"createdAt":"2026-10-27T18:53:29.254Z","updatedAt":"2026-10-27T18:53:29.254Z","observedAt":"2026-11-03T17:18:05.110Z"},"compatibility":{"serverVersion":"1.6.0","protocolVersions":[{"protocol":"mcp","version":null}]}}}}