feat(coding-agent): enabled MCP Markdown result rendering by default

mcp.renderMarkdownResults now defaults to true; set false to keep raw
text. Non-JSON detection and structured JSON-tree rendering unchanged.
This commit is contained in:
can1357
2026-07-23 11:54:21 +02:00
parent 80ec1cb6ae
commit 38efea12ed
3 changed files with 17 additions and 19 deletions
+1 -3
View File
@@ -6,13 +6,11 @@
- Added per-call `model` selection to the `task` tool, including per-item batch selectors, fallback chains, and explicit reasoning suffixes.
- Added Firecrawl keyless mode: explicitly selecting `firecrawl` as the web-search provider now works without `FIRECRAWL_API_KEY` by calling the Firecrawl REST API without an `Authorization` header; the automatic provider chain remains credential-gated (#4332).
- Added `mcp.renderMarkdownResults` (enabled by default): non-JSON MCP text results render as Markdown in the terminal transcript; set it to `false` to keep raw text.
### Changed
- Adjusted retry fallback handling to recognize discovery-only and runtime extension providers, preventing spurious unknown-provider warnings.
### Added
- Added an opt-in `mcp.renderMarkdownResults` setting that renders non-JSON MCP text results as Markdown in the terminal transcript.
### Fixed
@@ -3961,7 +3961,7 @@ export const SETTINGS_SCHEMA = {
"mcp.renderMarkdownResults": {
type: "boolean",
default: false,
default: true,
ui: {
tab: "tools",
group: "Discovery & MCP",
@@ -29,7 +29,7 @@ describe("ToolExecutionComponent custom renderer failures", () => {
});
afterEach(() => {
settings.set("mcp.renderMarkdownResults", false);
settings.set("mcp.renderMarkdownResults", true);
});
it("falls back to the custom tool label when a renderCall child component throws during render", () => {
@@ -120,21 +120,10 @@ describe("MCP result Markdown rendering", () => {
});
afterEach(() => {
settings.set("mcp.renderMarkdownResults", false);
});
it("keeps Markdown syntax literal by default", () => {
const component = renderMCPResult(
{ content: [{ type: "text", text: "**bold result**" }], details },
{ expanded: true, isPartial: false },
theme,
);
expect(visibleText(component.render(80))).toContain("**bold result**");
});
it("renders inline Markdown when the opt-in setting is enabled", () => {
settings.set("mcp.renderMarkdownResults", true);
});
it("renders inline Markdown by default", () => {
const component = renderMCPResult(
{ content: [{ type: "text", text: "**bold result** and `code`" }], details },
{ expanded: true, isPartial: false },
@@ -147,6 +136,17 @@ describe("MCP result Markdown rendering", () => {
expect(rendered).not.toContain("`code`");
});
it("keeps Markdown syntax literal when the setting is disabled", () => {
settings.set("mcp.renderMarkdownResults", false);
const component = renderMCPResult(
{ content: [{ type: "text", text: "**bold result**" }], details },
{ expanded: true, isPartial: false },
theme,
);
expect(visibleText(component.render(80))).toContain("**bold result**");
});
it("preserves structured JSON rendering when Markdown is enabled", () => {
settings.set("mcp.renderMarkdownResults", true);
const component = renderMCPResult(