diff --git a/src/fetch/src/mcp_server_fetch/server.py b/src/fetch/src/mcp_server_fetch/server.py index b42c7b1f6b..aa17f68534 100644 --- a/src/fetch/src/mcp_server_fetch/server.py +++ b/src/fetch/src/mcp_server_fetch/server.py @@ -42,6 +42,9 @@ def extract_content_from_html(html: str) -> str: ret["content"], heading_style=markdownify.ATX, ) + title = (ret.get("title") or "").strip() + if title: + content = f"# {title}\n\n{content}" return content diff --git a/src/fetch/tests/test_server.py b/src/fetch/tests/test_server.py index 96c1cb38c7..0e4df747d3 100644 --- a/src/fetch/tests/test_server.py +++ b/src/fetch/tests/test_server.py @@ -67,6 +67,39 @@ def test_simple_html(self): # readabilipy may extract different parts depending on the content assert "test paragraph" in result + @patch("mcp_server_fetch.server.readabilipy.simple_json.simple_json_from_html_string") + def test_includes_page_title(self, mock_readability): + """Test that page title is included in the output.""" + mock_readability.return_value = { + "title": "My Page Title", + "content": "
Some content here.
", + } + result = extract_content_from_html("") + assert result.startswith("# My Page Title") + assert "Some content here" in result + + @patch("mcp_server_fetch.server.readabilipy.simple_json.simple_json_from_html_string") + def test_no_title_still_works(self, mock_readability): + """Test that pages without a title still return content.""" + mock_readability.return_value = { + "title": None, + "content": "Content without a title tag.
", + } + result = extract_content_from_html("") + assert "Content without a title" in result + assert not result.startswith("# ") + + @patch("mcp_server_fetch.server.readabilipy.simple_json.simple_json_from_html_string") + def test_empty_title_not_prepended(self, mock_readability): + """Test that empty/whitespace-only titles are not prepended.""" + mock_readability.return_value = { + "title": " ", + "content": "Body text.
", + } + result = extract_content_from_html("") + assert not result.startswith("# ") + assert "Body text" in result + def test_html_with_links(self): """Test that links are converted to markdown.""" html = """