From 16a09f01519363dd4fb12f7bfe9818273ef2a6a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E7=B4=AB=E8=BE=B0?= <155808914+hxaxd@users.noreply.github.com> Date: Wed, 22 Jul 2026 01:48:40 +0800 Subject: [PATCH] Fix skill frontmatter with UTF-8 BOM (#4533) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with Codex --- .../server/providers/skills/_common.py | 2 ++ .../server/providers/test_skills_provider.py | 20 +++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/fastmcp_slim/fastmcp/server/providers/skills/_common.py b/fastmcp_slim/fastmcp/server/providers/skills/_common.py index d0e1177a5..340d289e5 100644 --- a/fastmcp_slim/fastmcp/server/providers/skills/_common.py +++ b/fastmcp_slim/fastmcp/server/providers/skills/_common.py @@ -39,6 +39,8 @@ def parse_frontmatter(content: str) -> tuple[dict[str, Any], str]: Returns: Tuple of (frontmatter dict, remaining content) """ + content = content.removeprefix("\ufeff") + if not content.startswith("---"): return {}, content diff --git a/tests/server/providers/test_skills_provider.py b/tests/server/providers/test_skills_provider.py index f57d4815c..b40d60864 100644 --- a/tests/server/providers/test_skills_provider.py +++ b/tests/server/providers/test_skills_provider.py @@ -92,6 +92,26 @@ This is my skill content. assert provider.skill_info.description == "A test skill" assert len(provider.skill_info.files) == 3 + def test_loads_frontmatter_from_utf8_bom_skill(self, tmp_path: Path): + skill_dir = tmp_path / "bom-skill" + skill_dir.mkdir() + (skill_dir / "SKILL.md").write_text( + "\ufeff---\n" + "name: bom-skill\n" + "description: Skill saved with a UTF-8 BOM\n" + "---\n" + "# BOM Skill\n", + encoding="utf-8", + ) + + provider = SkillProvider(skill_path=skill_dir) + + assert provider.skill_info.description == "Skill saved with a UTF-8 BOM" + assert provider.skill_info.frontmatter == { + "name": "bom-skill", + "description": "Skill saved with a UTF-8 BOM", + } + def test_raises_if_directory_missing(self, tmp_path: Path): with pytest.raises(FileNotFoundError, match="Skill directory not found"): SkillProvider(skill_path=tmp_path / "nonexistent")