Every change Wellknown observed on this MCP server, newest first, with what it was before and what it became. Tool-surface changes carry the definition diff. Nothing here is edited after the fact.
Changed the definition of "get_component" and "list_components"
⟨18 unchanged words⟩ ,"name"],"type":"object"},"builtWith":{"description":"ai where an AI assistant wrote the code, ai-assisted where a person wrote it with one. Null where the author has not said.","enum":["ai","ai-assisted",null],"type":["string","null"]},"category":{"properties":{"name":{"type ⟨331 unchanged words⟩ ":"The author's longer description, as Markdown.","type":["string","null"]},"supportLevel":{"description":"maintained, or reference: a worked example not maintained for production. Null where the author has not said.","enum":["maintained","reference",null],"type":["string","null"]}, ⟨73 unchanged words⟩
⟨6 unchanged words⟩ "Author slug.","type":"string"},"builtWith":{"description":"ai where an AI assistant wrote the code, ai-assisted where a person wrote it with one. Null where the author has not said.","enum":["ai","ai-assisted",null],"type":["string","null"]},"category":{"description":"Category slug.","type ⟨50 unchanged words⟩ :"Pass to get_component.","type":"string"},"supportLevel":{"description":"maintained, or reference: a worked example not maintained for production. Null where the author has not said.","enum":["maintained","reference",null],"type":["string","null"]},"tagline":{"type":["string", ⟨88 unchanged words⟩
Changed the definition of "search"
⟨37 unchanged words⟩ :"string"},"section":{"description":"TheOndocumentationasectiondoc hit, the section key — \"installation\" — to pass to get_doc_page with componentSlug; null on a component hit.","type":["string","null"]},"sectionLabel":{"description":"On a dochit;hit, the section as the site titles it — \"Installation\"; null on a component hit.","type":[ ⟨27 unchanged words⟩ its documentation.","enum":["component","docdoc_page"],"type":"string"},"url": ⟨51 unchanged words⟩
Changed the definition of "validate_manifest"
⟨50 unchanged words⟩ version it was checked against.","type":"stringinteger"},"valid":{"description":"False when ⟨66 unchanged words⟩
Changed the definition of "get_component", "list_components" and "list_taxonomy"
⟨282 unchanged words⟩ "type":["string","null"]},"hosts":{"description":"Where this control runs: canvas apps, model-driven apps, or both.","items":{"enum":["canvas","model-driven"],"type":"string"},"type":"array"},"isArchived":{"description":"True when the control ⟨117 unchanged words⟩ ,"required":["slug","name","controlType","hosts","isArchived","downloads","url"],"type":"object"}
Browse the PCFHub catalog by category, tag, author, control type, host or text, paged and sorted. Use it ⟨68 unchanged words⟩
Verified owner set by dns_txt proof on pcfhub.dev
Certificate recorded, valid to 2026-11-07
Authorization not required
Changed the definition of "get_component", "get_doc_page", "list_components" and 5 more
⟨13 unchanged words⟩ , license and repository, the current release's properties(name,typeand download links for its solutions. Use it once search or list_components has given you a slug; use get_doc_page for installation and configuration instructions,usagewhich this does not return. An unknown slug,requiredor a version the control never released,description)returns an error naming the tool to call instead. include_versions anddownloadinclude_relatedlinkseachfor
Unknown → Live
First tool surface recorded: 8 tools (server version 1.0.0)
https://pcfhub.dev/mcp (mcp_streamable_http) — from mcp_registry, with the record
Showing the latest 11 events. The API returns up to 500 and filters by kind: ?kind=tool_surface_changed
⟨49 unchanged words⟩ ,"grid_customizer"],"type":"string"},"host":{"description":"Where the control has to run. A control supporting both hosts matches either.","enum":["canvas","model-driven"],"type":"string"},"page":{"description":"Defaults to 1.", ⟨70 unchanged words⟩
⟨24 unchanged words⟩ ,"downloadCount":{"type":"integer"},"hosts":{"description":"Where this control runs. Empty only where nobody has declared it.","items":{"enum":["canvas","model-driven"],"type":"string"},"type":"array"},"latestVersion":{"description":"Null where nothing has ⟨30 unchanged words⟩ ,"required":["slug","name","controlType","hosts","category","author","downloadCount","url ⟨68 unchanged words⟩
List categories, tags, authors orauthorshosts
⟨5 unchanged words⟩ the category tree, the tags in use,orthe authors with a published control, or the hosts a control can run in, each with its slug and a count. ⟨50 unchanged words⟩
⟨7 unchanged words⟩ "enum":["categories","tags","authors","hosts"],"type":"string"}},"required": ⟨3 unchanged words⟩
⟨51 unchanged words⟩ :"Pass to list_components as its category, tag, author orauthorhost filter.","type":"string"}},"required ⟨13 unchanged words⟩ ,"enum":["categories","tags","authors","hosts"],"type":"string"}},"required" ⟨4 unchanged words⟩
before
—after
{"properties":{"author":{"properties":{"githubLogin":{"type":["string","null"]},"isVerified":{"type":"boolean"},"name":{"type":"string"},"slug":{"type":"string"}},"required":["slug","name"],"type":"object"},"category":{"properties":{"name":{"type":"string"},"slug":{"type":"string"}},"required":["slug","name"],"type":"object"},"controlType":{"type":"string"},"controlTypeDescription":{"description":"What that control type means, in a sentence.","type":"string"},"currentVersion":{"description":"The release described, or null where nothing has been published yet.","properties":{"framework":{"description":"How the control is built, e.g. \"react_virtual\".","type":"string"},"isLatest":{"type":"boolean"},"isPrerelease":{"type":"boolean"},"minPlatformVersion":{"type":["string","null"]},"properties":{"description":"Every property the control exposes, including the columns a dataset control binds.","items":{"properties":{"defaultValue":{"type":["string","null"]},"description":{"type":["string","null"]},"displayName":{"type":["string","null"]},"isRequired":{"type":"boolean"},"kind":{"description":"input, output, dataset, dataset_column or feature.","type":"string"},"name":{"description":"The property's logical name, as bound in the maker.","type":"string"},"type":{"description":"The Power Platform type, e.g. \"SingleLine.Text\", \"TwoOptions\", \"DataSet\".","type":"string"},"usage":{"description":"input, output or bound. Null on a feature.","type":["string","null"]}},"required":["name","type","isRequired"],"type":"object"},"type":"array"},"releaseNotesMd":{"type":["string","null"]},"releasedAt":{"description":"ISO 8601.","type":["string","null"]},"version":{"type":"string"}},"required":["version","isPrerelease"],"type":["object","null"]},"downloadCount":{"type":"integer"},"downloads":{"description":"Empty where the control has no published release.","items":{"properties":{"fileName":{"type":"string"},"kind":{"description":"managed_solution or unmanaged_solution.","type":"string"},"label":{"type":"string"},"requiresEntitlement":{"description":"True where the file is paid for and the download needs an entitlement.","type":"boolean"},"size":{"description":"Human-readable, e.g. \"14.8 KB\".","type":["string","null"]},"url":{"description":"Absolute URL of the counted download route. Use this rather than any storage URL.","type":"string"}},"required":["kind","label","fileName","requiresEntitlement","url"],"type":"object"},"type":"array"},"homepageUrl":{"type":["string","null"]},"isArchived":{"description":"True when the control is no longer maintained.","type":"boolean"},"licenseSpdx":{"description":"SPDX identifier, e.g. \"MIT\".","type":["string","null"]},"name":{"type":"string"},"publishedAt":{"description":"ISO 8601.","type":["string","null"]},"related":{"description":"Empty unless include_related was set.","type":"array"},"repositoryUrl":{"type":["string","null"]},"slug":{"type":"string"},"summaryMd":{"description":"The author's longer description, as Markdown.","type":["string","null"]},"supportUrl":{"description":"Where to report a problem with the control.","type":["string","null"]},"tagline":{"type":["string","null"]},"tags":{"items":{"properties":{"name":{"type":"string"},"slug":{"type":"string"}},"required":["slug","name"],"type":"object"},"type":"array"},"tier":{"description":"free, or a paid tier.","type":"string"},"url":{"description":"Absolute URL of the control's page, for citing.","type":"string"},"versions":{"description":"Empty unless include_versions was set.","type":"array"}},"required":["slug","name","controlType","isArchived","downloads","url"],"type":"object"}⟨14 unchanged words⟩ model-driven configuration, examples, limitations. Use list_doc_sections first for the sections that control publishes; use get_component instead for the structured property reference. Passing a version returns the documentation pinned toseethatwhichreleasesectionsratherexist.than the current page. A section the control does not document returns an error pointing at list_doc_sections, and the Markdown comes back without the frontmatter the site keeps.
before
—after
{"properties":{"componentName":{"type":"string"},"componentSlug":{"type":"string"},"contentMd":{"description":"The page as Markdown, with its frontmatter removed. Empty when the page has no content.","type":"string"},"description":{"type":["string","null"]},"isVersionPinned":{"description":"True when a version was asked for, rather than the current documentation being returned.","type":"boolean"},"section":{"enum":["overview","installation","canvas","model_driven","api","examples","limitations","faq","migration","changelog"],"type":"string"},"sourceUrl":{"description":"The file in the author's repository this was compiled from.","type":["string","null"]},"title":{"type":"string"},"updatedAt":{"description":"ISO 8601.","type":["string","null"]},"url":{"description":"Absolute URL of the page, for citing.","type":"string"},"version":{"description":"The release this documentation describes.","type":["string","null"]}},"required":["componentSlug","componentName","isVersionPinned","section","title","contentMd","url"],"type":"object"}Browse the PCFHub catalogwithbyoptionalcategory,filters:tag,aauthor,textcontrolquery,typecategoryorslugtext,tagpagedslugs,andauthorsorted.slugUseanditcontroltotype.enumeratePaged;orreturnsnarroweachthecontrol'scatalog;slug,usename,searchtagline,for a plain-language question about what a controltypeshould do,latestandversionget_componentandforURL.oneUsecontrol in full. Filters take slugs, which list_taxonomytosupplies.discoverNothingvalidherecategoryfails on bad input: an unrecognised sort falls back to the default,tagand filters matching nothing return an empty page — so read `total` andauthor`sort`slugs.from the result rather than assuming the filters applied.
before
—after
{"properties":{"components":{"items":{"properties":{"author":{"description":"Author slug.","type":"string"},"category":{"description":"Category slug.","type":"string"},"controlType":{"enum":["field","dataset","virtual","grid_customizer"],"type":"string"},"downloadCount":{"type":"integer"},"latestVersion":{"description":"Null where nothing has been released yet.","type":["string","null"]},"name":{"type":"string"},"slug":{"description":"Pass to get_component.","type":"string"},"tagline":{"type":["string","null"]},"url":{"description":"Absolute URL of the control's page.","type":"string"}},"required":["slug","name","controlType","category","author","downloadCount","url"],"type":"object"},"type":"array"},"lastPage":{"description":"The highest page number for these filters.","type":"integer"},"page":{"description":"The page returned.","type":"integer"},"perPage":{"type":"integer"},"sort":{"description":"The sort actually applied, which is the default when none was given or the one given was not recognised.","type":"string"},"total":{"description":"Controls matching the filters, across every page.","type":"integer"}},"required":["page","perPage","lastPage","total","sort","components"],"type":"object"}The documentation sectionsaone controlhaspublishes — overview, installation, canvas, model_driven, examples, limitations and soon.onCall— each with its title and URL. Use it before get_doc_page to learn which sections that control actually has; it returns no page content, and get_component covers the property reference. A control withonenoofdocumentation and a slug that does not exist return thereturnedsamesectionserror on purpose, so fall back toreadsearchit.rather than concluding the slug is wrong.
before
—after
{"properties":{"sections":{"items":{"properties":{"section":{"description":"Pass to get_doc_page as its section argument.","type":"string"},"title":{"description":"The section's heading, as the author wrote it.","type":"string"},"url":{"description":"Absolute URL of the page.","type":"string"}},"required":["section","title","url"],"type":"object"},"type":"array"},"slug":{"description":"The control the sections belong to.","type":"string"}},"required":["slug","sections"],"type":"object"}⟨16 unchanged words⟩ it is a prerelease, and when it shipped. Use it for what has changed hub-wide; for one control's own history call get_component with include_versions instead. Bounded by limit, at most 50, and not paged — there is no cursor, so it cannot walk back beyond the newest 50.
before
—after
{"properties":{"releases":{"description":"Newest first.","items":{"properties":{"componentName":{"type":"string"},"componentSlug":{"description":"Pass to get_component.","type":"string"},"isPrerelease":{"type":"boolean"},"releasedAt":{"description":"ISO 8601, or null where the release carries no date.","type":["string","null"]},"url":{"description":"Absolute URL of the release.","type":"string"},"version":{"type":"string"}},"required":["componentSlug","componentName","version","isPrerelease","url"],"type":"object"},"type":"array"}},"required":["releases"],"type":"object"}The vocabulary list_components filters by: the category tree,everythetagtags in use, oreverytheauthorauthors with a published control—, each with its slug andhowamanycount.controlsUse ithas.toUseturn a name a person used into a slug; it returns no controls, so pass theslugsslug to list_components to see them. Not paged — categories come back asfiltersainfulllist_components.tree and authors as a full list, while tags are capped at the 500 most used.
before
—after
{"properties":{"items":{"items":{"properties":{"children":{"description":"Child categories, in the same shape. Categories only.","type":"array"},"componentsCount":{"description":"How many published controls this covers.","type":"integer"},"description":{"description":"Categories only.","type":["string","null"]},"githubLogin":{"description":"Authors only.","type":["string","null"]},"isVerified":{"description":"Authors only.","type":"boolean"},"name":{"type":"string"},"slug":{"description":"Pass to list_components as its category, tag or author filter.","type":"string"}},"required":["slug","name","componentsCount"],"type":"object"},"type":"array"},"kind":{"description":"Which list this is.","enum":["categories","tags","authors"],"type":"string"}},"required":["kind","items"],"type":"object"}Full-text search across every published PCF control and itsdocumentation.documentation, ranked by relevance. Use itfirstwhen you know what a control should do but not what it iscalled.called; use list_components instead to filter by category, tag, author or control type, and get_component when you already have a slug. Returnscomponentscontrol anddocdocumentationpageshits, each with a snippet and a URL. A query that matches nothing is an empty result rather than an error, and a misspelling may be answered with results for a corrected spelling, which the result states.
before
—after
{"properties":{"correctedQuery":{"description":"Set only when nothing matched the query and these are results for a corrected spelling of it.","type":["string","null"]},"hits":{"items":{"properties":{"componentName":{"type":"string"},"componentSlug":{"description":"Pass to get_component or get_doc_page.","type":"string"},"section":{"description":"The documentation section, on a doc hit; null on a component hit.","type":["string","null"]},"snippet":{"description":"The matching text, with the site's highlight markup stripped.","type":["string","null"]},"title":{"type":"string"},"type":{"description":"A control, or a page of its documentation.","enum":["component","doc"],"type":"string"},"url":{"description":"Absolute URL of the page, for citing.","type":"string"}},"required":["type","title","componentSlug","componentName","url"],"type":"object"},"type":"array"},"query":{"description":"The query as it was searched.","type":"string"},"total":{"description":"How many results matched, which may be more than were returned.","type":"integer"}},"required":["query","total","hits"],"type":"object"}Check a pcfhub.json against thecontentsrulesofPCFHub applies when it publishes apcfhub.jsoncontrol:againstthePCFHub'sschemarulesversion, the control block (namespace, constructor, type and framework), the demo's fidelity, bundle and presets, the media files it declares, and the release artifacts it expects to find. Use it while writing or reviewing that file, before arelease.releaseReturnsiswhethertagged.itAn invalid manifest is an ordinary result — valid false,pluswith errors that block publishing and warnings that do not, eachwithcarrying the JSON pointer it appliesto.to — so read the result rather than retrying. Only an empty, unreadable or oversized manifest (over 64 KB) is an error.
before
—after
{"properties":{"errors":{"description":"Must be fixed; publishing refuses the manifest until they are.","items":{"properties":{"message":{"type":"string"},"pointer":{"description":"RFC 6901 JSON pointer to the part of the manifest at fault, e.g. \"/demo/presets/0\".","type":"string"}},"required":["pointer","message"],"type":"object"},"type":"array"},"schemaVersion":{"description":"The manifest schema version it was checked against.","type":"string"},"valid":{"description":"False when there is at least one error. Warnings alone leave it true.","type":"boolean"},"warnings":{"description":"Do not block publishing, but reach the author through their own CI.","items":{"properties":{"message":{"type":"string"},"pointer":{"description":"RFC 6901 JSON pointer to the part of the manifest at fault, e.g. \"/demo/presets/0\".","type":"string"}},"required":["pointer","message"],"type":"object"},"type":"array"}},"required":["valid","schemaVersion","errors","warnings"],"type":"object"}