Bug in the official tutorial docs: Tool use example code lacks agentic loop, causing multi-turn calls to fail
Maintainer antworten meist innerhalb von 6 Tagen
Dieses Issue hat noch niemand übernommen.
Bewertung
- Schwierigkeit
- 3/5
- Geschätzter Aufwand
- 1-2 Tage
- Anfängerfreundlichkeit
- 76/100
- Issue-Typ
- Bug
- Klarheit
- Klar beschrieben
- Aktivitätsstatus
- Aktiv
- Tech-Stack
- python
- Bereich
- documentation
Rechercherichtung
Start with “The Query Processing Logic” in the MCP building tutorial at the linked build-client page, focusing on the async process_query function and its message handling. Confirm that repeated tool_use responses are processed with their tool results until a plain-text response is returned, including tool execution errors; the issue’s corrected snippet defines the expected behavior.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
The original example code (The Query Processing Logic in the MCP building tutorial site https://modelcontextprotocol.io/docs/2026-07-28/develop/build-client) has the following core issues:
- Single-turn Limitation: After the initial API call, the code only checks and processes tool_use blocks once. If Claude requests additional tool calls in its second response (e.g., needing to chain a second tool based on the output of the first), the original code fails to handle them—it simply ignores subsequent tool calls, causing complex multi-step tasks to fail.
- Lack of Agentic Loop Structure: It does not use a loop to continuously maintain conversation state. A correct implementation should, after each model response, check whether tool_use blocks are present; if so, execute the tools, append the results to the message history, and continue with the next API call—repeating this cycle until the model outputs a plain-text final answer.
The following corrected snippet resolves these issues by introducing a while True loop, correctly implementing a multi-turn tool-calling agent loop. Below is the corrected code version:
async def process_query(client, query: str) -> str:
messages = [
{"role": "user",
"content": query}
]
tool_list = await client.list_tools()
available_tools = [{
"name": tool.name,
"description": tool.description,
"input_schema": tool.input_schema,
} for tool in tool_list.tools]
final_texts = []
while True:
response = await anthropic.messages.create(
model=MODEL,
max_tokens=1000,
messages=messages,
tools=available_tools,
)
# Append the full assistant response back to the message history for context
messages.append({
"role": "assistant",
"content": response.content,
})
tool_uses = []
for block in response.content:
if block.type == "text":
final_texts.append(block.text)
elif block.type == "tool_use":
tool_uses.append(block)
# If no tool_use is requested, this is the final answer; exit the loop
if not tool_uses:
break
tool_results = []
for block in tool_uses:
try:
result = await client.call_tool(block.name, block.input)
tool_results.append({
"type": "tool_result",
"tool_use_id": block.id,
"content": format_tool_result(result), # Assumes format_tool_result is defined elsewhere
"is_error": bool(result.is_error),
})
except Exception as e:
# Tool execution errors must also be returned as tool_result to the model
tool_results.append({
"type": "tool_result",
"tool_use_id": block.id,
"content": f"Tool execution error: {e}",
"is_error": True,
})
# Feed the tool results back as a user message to continue the next turn
messages.append({
"role": "user",
"content": tool_results,
})
return "\n".join(final_texts)
(Note: format_tool_result is assumed to be a helper function that extracts text from the tool response, similar to "\n".join(block.text for block in result.content if isinstance(block, TextContent)) in the original code.)
- Vorherrschende Sprache
- TypeScript
- Sterne
- 1.2k
- Forks
- 692
- Ø Merge
- 4 T. 1 Std.
- Gemergte PRs (30 T.)
- 27
Entwicklungsumgebung
- Kein Dockerfile und keine Docker-Compose-Datei
- Keine Pull-Request-Vorlage
- Beitragsleitfaden lesen
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus modelcontextprotocol/quickstart-resources
-
Schwierigkeit 5/5 Über eine Woche Anfängerfreundlichkeit 25/100
modelcontextprotocol/quickstart-resources#199 ·
Maintainer antworten meist innerhalb von 6 Tagen
-
Schwierigkeit 3/5 1-2 Tage Anfängerfreundlichkeit 55/100
modelcontextprotocol/quickstart-resources#191 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 6 Tagen
-
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 45/100
modelcontextprotocol/quickstart-resources#190 ·
Maintainer antworten meist innerhalb von 6 Tagen
-
enhancement
Schwierigkeit 3/5 1-2 Tage Anfängerfreundlichkeit 55/100
modelcontextprotocol/quickstart-resources#46 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 6 Tagen
Alle Issues in modelcontextprotocol/quickstart-resources
Ähnliche Issues
-
"Contains" page watch never matches when its text has a trailing spaceEvtl. vergeben @RaphaelFakhri hat das heute übernommen. Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 77/100
CopilotKit/openmuse#184 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 88/100
Maintainer antworten meist innerhalb von 1 Tag
-
bug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 67/100
bootstrap-vue-next/bootstrap-vue-next#3357 ·
Maintainer antworten meist innerhalb von 1 Tag
-
[quality] tide.ts: six mutation survivors in the merge-queue gate, draft refusal, fork-403 workflow-file diagnosis and getPull's fork flag are unpinned by any testEvtl. vergeben @hivecommons-hive hat das heute übernommen. Offenagent/quality needs-kind stage/040-covered-by-pr testing
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 68/100
cncf/prow-github-actions#517 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 2 Tagen
-
Unsampled pageload span is profiled when profileLifecycle is 'trace' (browser UI profiling)Evtl. vergeben @Jxxunnn hat das heute übernommen. OffenBrowser Waiting for: Product Owner
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 82/100
getsentry/sentry-javascript#25497 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag