Skip to content

Commit 3ec7bc9

Browse files
committed
fix: omit null fields from task results
1 parent 161834d commit 3ec7bc9

2 files changed

Lines changed: 20 additions & 1 deletion

File tree

src/mcp/server/experimental/task_result_handler.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ async def handle(
116116
related_task = RelatedTaskMetadata(task_id=task_id)
117117
related_task_meta: dict[str, Any] = {RELATED_TASK_METADATA_KEY: related_task.model_dump(by_alias=True)}
118118
if result is not None:
119-
result_data = result.model_dump(by_alias=True)
119+
result_data = result.model_dump(by_alias=True, mode="json", exclude_none=True)
120120
existing_meta: dict[str, Any] = result_data.get("_meta") or {}
121121
result_data["_meta"] = {**existing_meta, **related_task_meta}
122122
return GetTaskPayloadResult.model_validate(result_data)

tests/experimental/tasks/server/test_task_result_handler.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,25 @@ async def test_handle_returns_result_for_completed_task(
6767
assert "io.modelcontextprotocol/related-task" in response.meta
6868

6969

70+
@pytest.mark.anyio
71+
async def test_handle_omits_none_fields_from_result_payload(
72+
store: InMemoryTaskStore, queue: InMemoryTaskMessageQueue, handler: TaskResultHandler
73+
) -> None:
74+
task = await store.create_task(TaskMetadata(ttl=60000), task_id="test-task")
75+
await store.store_result(task.task_id, CallToolResult(content=[TextContent(type="text", text="Done!")]))
76+
await store.update_task(task.task_id, status="completed")
77+
78+
mock_session = Mock()
79+
mock_session.send_message = AsyncMock()
80+
81+
request = GetTaskPayloadRequest(params=GetTaskPayloadRequestParams(task_id=task.task_id))
82+
response = await handler.handle(request, mock_session, "req-1")
83+
84+
payload = response.model_dump(by_alias=True, mode="json")
85+
assert payload["content"] == [{"type": "text", "text": "Done!"}]
86+
assert "structuredContent" not in payload
87+
88+
7089
@pytest.mark.anyio
7190
async def test_handle_raises_for_nonexistent_task(
7291
store: InMemoryTaskStore, queue: InMemoryTaskMessageQueue, handler: TaskResultHandler

0 commit comments

Comments
 (0)