PCFHub

Find Power Apps PCF controls, read their docs, and validate pcfhub.json manifests.

我該用這個嗎

品質與安全性

A
說明品質
100%
結構描述完整度
97%
命名品質
100%
汙染風險
100%
權限相符程度
100%
協定合規性
100%

根據工具定義與協定合規性的自動化分析。

上下文成本

~3,989Token(工具定義)
~4.9 KB典型回應大小
顯著的注意力影響(128k 上下文的 3.12%)

這是每次將伺服器的工具載入模型上下文時所消耗的約略 token 數量。數量越高,可用於其他工作的注意力就越少。

安裝

一鍵安裝

將以下內容加入你的 `claude_desktop_config.json` 檔案:

{
  "mcpServers": {
    "pcfhub": {
      "url": "https://pcfhub.dev/mcp"
    }
  }
}

遠端端點

https://pcfhub.dev/mcpstreamable-http

它能做什麼

工具清單

工具(8)

🟢 唯讀🟡 寫入🔴 刪除⚪ 未知
🟢search(query, limit)

Full-text search across every published PCF control and its documentation, ranked by relevance. Use it when you know what a control should do but not what it is called; use list_components instead to filter by category, tag, author or control type, and get_component when you already have a slug. Returns control and documentation hits, 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.

輸入結構描述

{
  "type": "object",
  "properties": {
    "query": {
      "description": "What to look for, in plain words: \"barcode scanner\", \"kanban\", \"date range\".",
      "type": "string"
    },
    "limit": {
      "description": "How many results to return. Defaults to 10.",
      "minimum": 1,
      "maximum": 20,
      "type": "integer"
    }
  },
  "required": [
    "query"
  ]
}

輸出結構描述

{
  "type": "object",
  "properties": {
    "query": {
      "description": "The query as it was searched.",
      "type": "string"
    },
    "correctedQuery": {
      "description": "Set only when nothing matched the query and these are results for a corrected spelling of it.",
      "type": [
        "string",
        "null"
      ]
    },
    "total": {
      "description": "How many results matched, which may be more than were returned.",
      "type": "integer"
    },
    "hits": {
      "items": {
        "properties": {
          "type": {
            "description": "A control, or a page of its documentation.",
            "enum": [
              "component",
              "doc_page"
            ],
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "componentSlug": {
            "description": "Pass to get_component or get_doc_page.",
            "type": "string"
          },
          "componentName": {
            "type": "string"
          },
          "section": {
            "description": "On a doc 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 doc hit, the section as the site titles it — \"Installation\"; null on a component hit.",
            "type": [
              "string",
              "null"
            ]
          },
          "snippet": {
            "description": "The matching text, with the site's highlight markup stripped.",
            "type": [
              "string",
              "null"
            ]
          },
          "url": {
            "description": "Absolute URL of the page, for citing.",
            "type": "string"
          }
        },
        "type": "object",
        "required": [
          "type",
          "title",
          "componentSlug",
          "componentName",
          "url"
        ]
      },
      "type": "array"
    }
  },
  "required": [
    "query",
    "total",
    "hits"
  ]
}
🟢list_components(query, category, tags, author, control_type, ...)

Browse the PCFHub catalog by category, tag, author, control type, host or text, paged and sorted. Use it to enumerate or narrow the catalog; use search for a plain-language question about what a control should do, and get_component for one control in full. Filters take slugs, which list_taxonomy supplies. Nothing here fails on bad input: an unrecognised sort falls back to the default, and filters matching nothing return an empty page — so read `total` and `sort` from the result rather than assuming the filters applied.

輸入結構描述

{
  "type": "object",
  "properties": {
    "query": {
      "description": "Words to match against names, taglines and descriptions.",
      "type": "string"
    },
    "category": {
      "description": "A category slug, from list_taxonomy.",
      "type": "string"
    },
    "tags": {
      "description": "Tag slugs, from list_taxonomy. A control must carry every tag given.",
      "items": {
        "type": "string"
      },
      "type": "array"
    },
    "author": {
      "description": "An author slug, from list_taxonomy.",
      "type": "string"
    },
    "control_type": {
      "description": "field binds one column on a form; dataset renders a view; virtual is a React control; grid_customizer changes how an editable grid renders cells.",
      "enum": [
        "field",
        "dataset",
        "virtual",
        "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"
    },
    "sort": {
      "description": "Defaults to relevance when there is a query, newest otherwise.",
      "enum": [
        "relevance",
        "newest",
        "popular",
        "name",
        "updated"
      ],
      "type": "string"
    },
    "page": {
      "description": "Defaults to 1.",
      "minimum": 1,
      "type": "integer"
    },
    "per_page": {
      "description": "Defaults to 24; at most 48.",
      "minimum": 1,
      "maximum": 48,
      "type": "integer"
    }
  }
}

輸出結構描述

{
  "type": "object",
  "properties": {
    "page": {
      "description": "The page returned.",
      "type": "integer"
    },
    "perPage": {
      "type": "integer"
    },
    "lastPage": {
      "description": "The highest page number for these filters.",
      "type": "integer"
    },
    "total": {
      "description": "Controls matching the filters, across every page.",
      "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"
    },
    "components": {
      "items": {
        "properties": {
          "slug": {
            "description": "Pass to get_component.",
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "tagline": {
            "type": [
              "string",
              "null"
            ]
          },
          "controlType": {
            "enum": [
              "field",
              "dataset",
              "virtual",
              "grid_customizer"
            ],
            "type": "string"
          },
          "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 been released yet.",
            "type": [
              "string",
              "null"
            ]
          },
          "category": {
            "description": "Category slug.",
            "type": "string"
          },
          "author": {
            "description": "Author slug.",
            "type": "string"
          },
          "downloadCount": {
            "type": "integer"
          },
          "url": {
            "description": "Absolute URL of the control's page.",
            "type": "string"
          }
        },
        "type": "object",
        "required": [
          "slug",
          "name",
          "controlType",
          "hosts",
          "category",
          "author",
          "downloadCount",
          "url"
        ]
      },
      "type": "array"
    }
  },
  "required": [
    "page",
    "perPage",
    "lastPage",
    "total",
    "sort",
    "components"
  ]
}
🟢get_component(slug, version, include_versions, include_related)

Everything about one control by its slug: what it does, its control type, license and repository, the current release's properties, and 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, which this does not return. An unknown slug, or a version the control never released, returns an error naming the tool to call instead. include_versions and include_related each cost an extra query, so leave them off unless you need the release history or similar controls.

輸入結構描述

{
  "type": "object",
  "properties": {
    "slug": {
      "description": "The control's slug, e.g. \"pcf-tag-list\".",
      "type": "string"
    },
    "version": {
      "description": "A specific release. Defaults to the latest stable one.",
      "type": "string"
    },
    "include_versions": {
      "description": "Also return every release. Costs an extra query; leave off unless needed.",
      "type": "boolean"
    },
    "include_related": {
      "description": "Also return similar controls. Costs an extra query; leave off unless needed.",
      "type": "boolean"
    }
  },
  "required": [
    "slug"
  ]
}

輸出結構描述

{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string"
    },
    "name": {
      "type": "string"
    },
    "tagline": {
      "type": [
        "string",
        "null"
      ]
    },
    "summaryMd": {
      "description": "The author's longer description, as Markdown.",
      "type": [
        "string",
        "null"
      ]
    },
    "controlType": {
      "type": "string"
    },
    "controlTypeDescription": {
      "description": "What that control type means, in a sentence.",
      "type": "string"
    },
    "hosts": {
      "description": "Where this control runs: canvas apps, model-driven apps, or both.",
      "items": {
        "enum": [
          "canvas",
          "model-driven"
        ],
        "type": "string"
      },
      "type": "array"
    },
    "tier": {
      "description": "free, or a paid tier.",
      "type": "string"
    },
    "isArchived": {
      "description": "True when the control is no longer maintained.",
      "type": "boolean"
    },
    "licenseSpdx": {
      "description": "SPDX identifier, e.g. \"MIT\".",
      "type": [
        "string",
        "null"
      ]
    },
    "repositoryUrl": {
      "type": [
        "string",
        "null"
      ]
    },
    "homepageUrl": {
      "type": [
        "string",
        "null"
      ]
    },
    "supportUrl": {
      "description": "Where to report a problem with the control.",
      "type": [
        "string",
        "null"
      ]
    },
    "downloadCount": {
      "type": "integer"
    },
    "publishedAt": {
      "description": "ISO 8601.",
      "type": [
        "string",
        "null"
      ]
    },
    "author": {
      "properties": {
        "slug": {
          "type": "string"
        },
        "name": {
          "type": "string"
        },
        "githubLogin": {
          "type": [
            "string",
            "null"
          ]
        },
        "isVerified": {
          "type": "boolean"
        }
      },
      "type": "object",
      "required": [
        "slug",
        "name"
      ]
    },
    "category": {
      "properties": {
        "slug": {
          "type": "string"
        },
        "name": {
          "type": "string"
        }
      },
      "type": "object",
      "required": [
        "slug",
        "name"
      ]
    },
    "tags": {
      "items": {
        "properties": {
          "slug": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "type": "object",
        "required": [
          "slug",
          "name"
        ]
      },
      "type": "array"
    },
    "currentVersion": {
      "description": "The release described, or null where nothing has been published yet.",
      "properties": {
        "version": {
          "type": "string"
        },
        "isPrerelease": {
          "type": "boolean"
        },
        "isLatest": {
          "type": "boolean"
        },
        "framework": {
          "description": "How the control is built, e.g. \"react_virtual\".",
          "type": "string"
        },
        "minPlatformVersion": {
          "type": [
            "string",
            "null"
          ]
        },
        "releaseNotesMd": {
          "type": [
            "string",
            "null"
          ]
        },
        "releasedAt": {
          "description": "ISO 8601.",
          "type": [
            "string",
            "null"
          ]
        },
        "properties": {
          "description": "Every property the control exposes, including the columns a dataset control binds.",
          "items": {
            "properties": {
              "name": {
                "description": "The property's logical name, as bound in the maker.",
                "type": "string"
              },
              "displayName": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "description": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "kind": {
                "description": "input, output, dataset, dataset_column or feature.",
                "type": "string"
              },
              "usage": {
                "description": "input, output or bound. Null on a feature.",
                "type": [
                  "string",
                  "null"
                ]
              },
              "type": {
                "description": "The Power Platform type, e.g. \"SingleLine.Text\", \"TwoOptions\", \"DataSet\".",
                "type": "string"
              },
              "isRequired": {
                "type": "boolean"
              },
              "defaultValue": {
                "type": [
                  "string",
                  "null"
                ]
              }
            },
            "type": "object",
            "required": [
              "name",
              "type",
              "isRequired"
            ]
          },
          "type": "array"
        }
      },
      "type": [
        "object",
        "null"
      ],
      "required": [
        "version",
        "isPrerelease"
      ]
    },
    "versions": {
      "description": "Empty unless include_versions was set.",
      "type": "array"
    },
    "related": {
      "description": "Empty unless include_related was set.",
      "type": "array"
    },
    "downloads": {
      "description": "Empty where the control has no published release.",
      "items": {
        "properties": {
          "kind": {
            "description": "managed_solution or unmanaged_solution.",
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "fileName": {
            "type": "string"
          },
          "size": {
            "description": "Human-readable, e.g. \"14.8 KB\".",
            "type": [
              "string",
              "null"
            ]
          },
          "requiresEntitlement": {
            "description": "True where the file is paid for and the download needs an entitlement.",
            "type": "boolean"
          },
          "url": {
            "description": "Absolute URL of the counted download route. Use this rather than any storage URL.",
            "type": "string"
          }
        },
        "type": "object",
        "required": [
          "kind",
          "label",
          "fileName",
          "requiresEntitlement",
          "url"
        ]
      },
      "type": "array"
    },
    "url": {
      "description": "Absolute URL of the control's page, for citing.",
      "type": "string"
    }
  },
  "required": [
    "slug",
    "name",
    "controlType",
    "hosts",
    "isArchived",
    "downloads",
    "url"
  ]
}
🟢list_doc_sections(slug)

The documentation sections one control publishes — overview, installation, canvas, model_driven, examples, limitations and so on — 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 with no documentation and a slug that does not exist return the same error on purpose, so fall back to search rather than concluding the slug is wrong.

輸入結構描述

{
  "type": "object",
  "properties": {
    "slug": {
      "description": "The control's slug, e.g. \"pcf-tag-list\".",
      "type": "string"
    }
  },
  "required": [
    "slug"
  ]
}

輸出結構描述

{
  "type": "object",
  "properties": {
    "slug": {
      "description": "The control the sections belong to.",
      "type": "string"
    },
    "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"
          }
        },
        "type": "object",
        "required": [
          "section",
          "title",
          "url"
        ]
      },
      "type": "array"
    }
  },
  "required": [
    "slug",
    "sections"
  ]
}
🟢get_doc_page(slug, section, version)

Read one documentation section of a control as Markdown — installation steps, canvas or 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 to that release rather 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.

輸入結構描述

{
  "type": "object",
  "properties": {
    "slug": {
      "description": "The control's slug, e.g. \"pcf-tag-list\".",
      "type": "string"
    },
    "section": {
      "description": "Which section to read.",
      "enum": [
        "overview",
        "installation",
        "canvas",
        "model_driven",
        "api",
        "examples",
        "limitations",
        "faq",
        "migration",
        "changelog"
      ],
      "type": "string"
    },
    "version": {
      "description": "Documentation pinned to a specific release. Defaults to the current documentation.",
      "type": "string"
    }
  },
  "required": [
    "slug",
    "section"
  ]
}

輸出結構描述

{
  "type": "object",
  "properties": {
    "componentSlug": {
      "type": "string"
    },
    "componentName": {
      "type": "string"
    },
    "version": {
      "description": "The release this documentation describes.",
      "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"
    },
    "title": {
      "type": "string"
    },
    "description": {
      "type": [
        "string",
        "null"
      ]
    },
    "contentMd": {
      "description": "The page as Markdown, with its frontmatter removed. Empty when the page has no content.",
      "type": "string"
    },
    "sourceUrl": {
      "description": "The file in the author's repository this was compiled from.",
      "type": [
        "string",
        "null"
      ]
    },
    "updatedAt": {
      "description": "ISO 8601.",
      "type": [
        "string",
        "null"
      ]
    },
    "url": {
      "description": "Absolute URL of the page, for citing.",
      "type": "string"
    }
  },
  "required": [
    "componentSlug",
    "componentName",
    "isVersionPinned",
    "section",
    "title",
    "contentMd",
    "url"
  ]
}
🟢list_taxonomy(kind)

The vocabulary list_components filters by: the category tree, the tags in use, the authors with a published control, or the hosts a control can run in, each with its slug and a count. Use it to turn a name a person used into a slug; it returns no controls, so pass the slug to list_components to see them. Not paged — categories come back as a full tree and authors as a full list, while tags are capped at the 500 most used.

輸入結構描述

{
  "type": "object",
  "properties": {
    "kind": {
      "description": "Which list to return.",
      "enum": [
        "categories",
        "tags",
        "authors",
        "hosts"
      ],
      "type": "string"
    }
  },
  "required": [
    "kind"
  ]
}

輸出結構描述

{
  "type": "object",
  "properties": {
    "kind": {
      "description": "Which list this is.",
      "enum": [
        "categories",
        "tags",
        "authors",
        "hosts"
      ],
      "type": "string"
    },
    "items": {
      "items": {
        "properties": {
          "slug": {
            "description": "Pass to list_components as its category, tag, author or host filter.",
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "componentsCount": {
            "description": "How many published controls this covers.",
            "type": "integer"
          },
          "description": {
            "description": "Categories only.",
            "type": [
              "string",
              "null"
            ]
          },
          "children": {
            "description": "Child categories, in the same shape. Categories only.",
            "type": "array"
          },
          "githubLogin": {
            "description": "Authors only.",
            "type": [
              "string",
              "null"
            ]
          },
          "isVerified": {
            "description": "Authors only.",
            "type": "boolean"
          }
        },
        "type": "object",
        "required": [
          "slug",
          "name",
          "componentsCount"
        ]
      },
      "type": "array"
    }
  },
  "required": [
    "kind",
    "items"
  ]
}
🟢list_releases(limit)

The most recent releases across every control on PCFHub, newest first: which control, which version, whether 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.

輸入結構描述

{
  "type": "object",
  "properties": {
    "limit": {
      "description": "How many releases. Defaults to 20.",
      "minimum": 1,
      "maximum": 50,
      "type": "integer"
    }
  }
}

輸出結構描述

{
  "type": "object",
  "properties": {
    "releases": {
      "description": "Newest first.",
      "items": {
        "properties": {
          "componentSlug": {
            "description": "Pass to get_component.",
            "type": "string"
          },
          "componentName": {
            "type": "string"
          },
          "version": {
            "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"
          }
        },
        "type": "object",
        "required": [
          "componentSlug",
          "componentName",
          "version",
          "isPrerelease",
          "url"
        ]
      },
      "type": "array"
    }
  },
  "required": [
    "releases"
  ]
}
🟢validate_manifest(manifest)

Check a pcfhub.json against the rules PCFHub applies when it publishes a control: the schema version, 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 a release is tagged. An invalid manifest is an ordinary result — valid false, with errors that block publishing and warnings that do not, each carrying the JSON pointer it applies to — so read the result rather than retrying. Only an empty, unreadable or oversized manifest (over 64 KB) is an error.

輸入結構描述

{
  "type": "object",
  "properties": {
    "manifest": {
      "description": "The full contents of pcfhub.json, as JSON text.",
      "type": "string"
    }
  },
  "required": [
    "manifest"
  ]
}

輸出結構描述

{
  "type": "object",
  "properties": {
    "valid": {
      "description": "False when there is at least one error. Warnings alone leave it true.",
      "type": "boolean"
    },
    "schemaVersion": {
      "description": "The manifest schema version it was checked against.",
      "type": "integer"
    },
    "errors": {
      "description": "Must be fixed; publishing refuses the manifest until they are.",
      "items": {
        "properties": {
          "pointer": {
            "description": "RFC 6901 JSON pointer to the part of the manifest at fault, e.g. \"/demo/presets/0\".",
            "type": "string"
          },
          "message": {
            "type": "string"
          }
        },
        "type": "object",
        "required": [
          "pointer",
          "message"
        ]
      },
      "type": "array"
    },
    "warnings": {
      "description": "Do not block publishing, but reach the author through their own CI.",
      "items": {
        "properties": {
          "pointer": {
            "description": "RFC 6901 JSON pointer to the part of the manifest at fault, e.g. \"/demo/presets/0\".",
            "type": "string"
          },
          "message": {
            "type": "string"
          }
        },
        "type": "object",
        "required": [
          "pointer",
          "message"
        ]
      },
      "type": "array"
    }
  },
  "required": [
    "valid",
    "schemaVersion",
    "errors",
    "warnings"
  ]
}

社群

為此伺服器評分

證據

近期觀測

已驗證未記錄版本8 個工具
已驗證未記錄版本8 個工具
已驗證未記錄版本8 個工具