@tduncan / Nvidia-Optimization-Stack-VLLM Mirror · read-only / commits / 707b44cc28
Fork 0

A high-throughput and memory-efficient inference and serving engine for LLMs

Mirrored from https://github.com/tduncan-lum/Nvidia-Optimization-Stack---VLLM.git

Synced Nov 10, 04:00 UTC

[Refactor] [11/N] to simplify the mcp architecture (#32396)

Signed-off-by: chaunceyjiang <chaunceyjiang@gmail.com>

Chauncey committed Jan 15, 2026 at 18:49 UTC 707b44cc281ce5db8c079962795912b6c337a7f0
16 files changed +40 -38
tests/entrypoints/openai/responses/test_mcp_tools.py
+1 -1
@@ -7,7 +7,7 @@ import pytest_asyncio
7 from openai import OpenAI
8 from openai_harmony import ToolDescription, ToolNamespaceConfig
9
10 -from vllm.entrypoints.tool_server import MCPToolServer
10 +from vllm.entrypoints.mcp.tool_server import MCPToolServer
11
12 from ....utils import RemoteOpenAIServer
13
tests/entrypoints/openai/test_gptoss_structural_tags_integration.py
+1 -1
@@ -8,7 +8,7 @@ from unittest.mock import Mock
8
9 import pytest
10
11 -from vllm.entrypoints.tool_server import ToolServer
11 +from vllm.entrypoints.mcp.tool_server import ToolServer
12 from vllm.reasoning.gptoss_reasoning_parser import (
13 GptOssReasoningParser,
14 )
tests/entrypoints/openai/test_serving_responses.py
+2 -2
@@ -13,15 +13,15 @@ from openai.types.responses.tool import (
13 Tool,
14 )
15
16 -from vllm.entrypoints.context import ConversationContext
16 +from vllm.entrypoints.mcp.tool_server import ToolServer
17 from vllm.entrypoints.openai.engine.protocol import ErrorResponse
18 +from vllm.entrypoints.openai.responses.context import ConversationContext
19 from vllm.entrypoints.openai.responses.protocol import ResponsesRequest
20 from vllm.entrypoints.openai.responses.serving import (
21 OpenAIServingResponses,
22 _extract_allowed_tools_from_mcp_requests,
23 extract_tool_types,
24 )
24 -from vllm.entrypoints.tool_server import ToolServer
25 from vllm.inputs.data import TokensPrompt
26
27
tests/entrypoints/test_context.py
+3 -3
@@ -6,7 +6,7 @@ from unittest.mock import MagicMock, patch
6 import pytest
7 from openai_harmony import Author, Message, Role, StreamState, TextContent
8
9 -from vllm.entrypoints.context import (
9 +from vllm.entrypoints.openai.responses.context import (
10 HarmonyContext,
11 StreamingHarmonyContext,
12 TurnMetrics,
@@ -71,7 +71,7 @@ async def generate_mock_outputs(
71 def mock_parser():
72 """Set up a mock parser for tests."""
73 with patch(
74 - "vllm.entrypoints.context.get_streamable_parser_for_assistant"
74 + "vllm.entrypoints.openai.responses.context.get_streamable_parser_for_assistant"
75 ) as mock_parser_factory:
76 # Create a mock parser object
77 parser = MagicMock()
@@ -284,7 +284,7 @@ async def test_negative_tool_tokens_edge_case():
284 """Test edge case where calculation could result in negative tool
285 tokens. We should log an error and clamp the value to 0."""
286 # Use patch to check if logger.error was called
287 - with patch("vllm.entrypoints.context.logger.error") as mock_log:
287 + with patch("vllm.entrypoints.openai.responses.context.logger.error") as mock_log:
288 context = HarmonyContext(messages=[], available_tools=["browser"])
289
290 # First turn
tests/entrypoints/test_responses_utils.py
+1 -1
@@ -16,7 +16,7 @@ from openai.types.responses.response_reasoning_item import (
16 )
17
18 from vllm.entrypoints.constants import MCP_PREFIX
19 -from vllm.entrypoints.responses_utils import (
19 +from vllm.entrypoints.openai.responses.utils import (
20 _construct_single_message_from_response_item,
21 _maybe_combine_reasoning_and_tool_call,
22 construct_chat_messages_with_tool_call,
tests/v1/structured_output/test_gptoss_structural_tags.py
+1 -1
@@ -8,7 +8,7 @@ from unittest.mock import Mock
8
9 import pytest
10
11 -from vllm.entrypoints.tool_server import ToolServer
11 +from vllm.entrypoints.mcp.tool_server import ToolServer
12 from vllm.reasoning.gptoss_reasoning_parser import (
13 GptOssReasoningParser,
14 from_builtin_tool_to_tag,
vllm/entrypoints/mcp/__init__.py new
+2
@@ -0,0 +1,2 @@
1 +# SPDX-License-Identifier: Apache-2.0
2 +# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
vllm/entrypoints/mcp/tool.py renamed
+4 -4
@@ -15,7 +15,7 @@ from vllm.utils import random_uuid
15
16 if TYPE_CHECKING:
17 # Avoid circular import.
18 - from vllm.entrypoints.context import ConversationContext
18 + from vllm.entrypoints.openai.responses.context import ConversationContext
19
20 logger = init_logger(__name__)
21
@@ -81,7 +81,7 @@ class HarmonyBrowserTool(Tool):
81 logger.info_once("Browser tool initialized")
82
83 async def get_result(self, context: "ConversationContext") -> Any:
84 - from vllm.entrypoints.context import HarmonyContext
84 + from vllm.entrypoints.openai.responses.context import HarmonyContext
85
86 assert isinstance(context, HarmonyContext)
87 last_msg = context.messages[-1]
@@ -141,7 +141,7 @@ class HarmonyPythonTool(Tool):
141 logger.info_once("Code interpreter tool initialized")
142
143 async def get_result(self, context: "ConversationContext") -> Any:
144 - from vllm.entrypoints.context import HarmonyContext
144 + from vllm.entrypoints.openai.responses.context import HarmonyContext
145
146 assert isinstance(context, HarmonyContext)
147 last_msg = context.messages[-1]
@@ -155,7 +155,7 @@ class HarmonyPythonTool(Tool):
155 This function converts parsable context types to harmony and
156 back so we can use GPTOSS demo python tool
157 """
158 - from vllm.entrypoints.context import ParsableContext
158 + from vllm.entrypoints.openai.responses.context import ParsableContext
159
160 assert isinstance(context, ParsableContext)
161
vllm/entrypoints/mcp/tool_server.py renamed
+1 -1
@@ -6,7 +6,7 @@ from typing import TYPE_CHECKING, Any
6
7 from openai_harmony import ToolDescription, ToolNamespaceConfig
8
9 -from vllm.entrypoints.tool import HarmonyBrowserTool, HarmonyPythonTool, Tool
9 +from vllm.entrypoints.mcp.tool import HarmonyBrowserTool, HarmonyPythonTool, Tool
10 from vllm.logger import init_logger
11
12 logger = init_logger(__name__)
vllm/entrypoints/openai/api_server.py
+1 -1
@@ -36,6 +36,7 @@ from vllm.engine.protocol import EngineClient
36 from vllm.entrypoints.anthropic.serving import AnthropicServingMessages
37 from vllm.entrypoints.launcher import serve_http
38 from vllm.entrypoints.logger import RequestLogger
39 +from vllm.entrypoints.mcp.tool_server import DemoToolServer, MCPToolServer, ToolServer
40 from vllm.entrypoints.openai.chat_completion.serving import OpenAIServingChat
41 from vllm.entrypoints.openai.cli_args import make_arg_parser, validate_parsed_serve_args
42 from vllm.entrypoints.openai.completion.serving import OpenAIServingCompletion
@@ -62,7 +63,6 @@ from vllm.entrypoints.serve.elastic_ep.middleware import (
63 ScalingMiddleware,
64 )
65 from vllm.entrypoints.serve.tokenize.serving import OpenAIServingTokenization
65 -from vllm.entrypoints.tool_server import DemoToolServer, MCPToolServer, ToolServer
66 from vllm.entrypoints.utils import (
67 cli_env_setup,
68 log_non_default_args,
vllm/entrypoints/openai/engine/serving.py
+9 -9
@@ -31,12 +31,6 @@ from vllm.entrypoints.chat_utils import (
31 parse_chat_messages_futures,
32 resolve_chat_template_content_format,
33 )
34 -from vllm.entrypoints.context import (
35 - ConversationContext,
36 - HarmonyContext,
37 - ParsableContext,
38 - StreamingHarmonyContext,
39 -)
34 from vllm.entrypoints.logger import RequestLogger
35 from vllm.entrypoints.openai.chat_completion.protocol import (
36 ChatCompletionNamedToolChoiceParam,
@@ -54,10 +48,19 @@ from vllm.entrypoints.openai.engine.protocol import (
48 FunctionDefinition,
49 )
50 from vllm.entrypoints.openai.models.serving import OpenAIServingModels
51 +from vllm.entrypoints.openai.responses.context import (
52 + ConversationContext,
53 + HarmonyContext,
54 + ParsableContext,
55 + StreamingHarmonyContext,
56 +)
57 from vllm.entrypoints.openai.responses.protocol import (
58 ResponseInputOutputItem,
59 ResponsesRequest,
60 )
61 +from vllm.entrypoints.openai.responses.utils import (
62 + construct_input_messages,
63 +)
64 from vllm.entrypoints.openai.translations.protocol import (
65 TranscriptionRequest,
66 TranscriptionResponse,
@@ -85,9 +88,6 @@ from vllm.entrypoints.pooling.score.protocol import (
88 ScoreResponse,
89 )
90 from vllm.entrypoints.renderer import BaseRenderer, CompletionRenderer, RenderConfig
88 -from vllm.entrypoints.responses_utils import (
89 - construct_input_messages,
90 -)
91 from vllm.entrypoints.serve.disagg.protocol import GenerateRequest, GenerateResponse
92 from vllm.entrypoints.serve.tokenize.protocol import (
93 DetokenizeRequest,
vllm/entrypoints/openai/responses/context.py renamed
+3 -3
@@ -22,6 +22,8 @@ from vllm.entrypoints.chat_utils import (
22 ChatTemplateContentFormatOption,
23 )
24 from vllm.entrypoints.constants import MCP_PREFIX
25 +from vllm.entrypoints.mcp.tool import Tool
26 +from vllm.entrypoints.mcp.tool_server import ToolServer
27 from vllm.entrypoints.openai.engine.protocol import (
28 FunctionCall,
29 )
@@ -38,9 +40,7 @@ from vllm.entrypoints.openai.responses.protocol import (
40 ResponseRawMessageAndToken,
41 ResponsesRequest,
42 )
41 -from vllm.entrypoints.responses_utils import construct_tool_dicts
42 -from vllm.entrypoints.tool import Tool
43 -from vllm.entrypoints.tool_server import ToolServer
43 +from vllm.entrypoints.openai.responses.utils import construct_tool_dicts
44 from vllm.outputs import RequestOutput
45 from vllm.reasoning.abs_reasoning_parsers import ReasoningParser
46 from vllm.tokenizers import TokenizerLike
vllm/entrypoints/openai/responses/serving.py
+9 -9
@@ -64,14 +64,8 @@ from vllm.entrypoints.chat_utils import (
64 ChatCompletionMessageParam,
65 ChatTemplateContentFormatOption,
66 )
67 -from vllm.entrypoints.context import (
68 - ConversationContext,
69 - HarmonyContext,
70 - ParsableContext,
71 - SimpleContext,
72 - StreamingHarmonyContext,
73 -)
67 from vllm.entrypoints.logger import RequestLogger
68 +from vllm.entrypoints.mcp.tool_server import ToolServer
69 from vllm.entrypoints.openai.engine.protocol import (
70 DeltaMessage,
71 ErrorResponse,
@@ -94,6 +88,13 @@ from vllm.entrypoints.openai.parser.harmony_utils import (
88 parse_response_input,
89 render_for_completion,
90 )
91 +from vllm.entrypoints.openai.responses.context import (
92 + ConversationContext,
93 + HarmonyContext,
94 + ParsableContext,
95 + SimpleContext,
96 + StreamingHarmonyContext,
97 +)
98 from vllm.entrypoints.openai.responses.protocol import (
99 InputTokensDetails,
100 OutputTokensDetails,
@@ -108,13 +109,12 @@ from vllm.entrypoints.openai.responses.protocol import (
109 ResponseUsage,
110 StreamingResponsesResponse,
111 )
111 -from vllm.entrypoints.responses_utils import (
112 +from vllm.entrypoints.openai.responses.utils import (
113 construct_input_messages,
114 construct_tool_dicts,
115 extract_tool_types,
116 should_continue_final_message,
117 )
117 -from vllm.entrypoints.tool_server import ToolServer
118 from vllm.exceptions import VLLMValidationError
119 from vllm.inputs.data import TokensPrompt
120 from vllm.logger import init_logger
vllm/entrypoints/openai/responses/utils.py renamed
vllm/reasoning/abs_reasoning_parsers.py
+1 -1
@@ -8,7 +8,7 @@ from collections.abc import Callable, Sequence
8 from functools import cached_property
9 from typing import TYPE_CHECKING, Any
10
11 -from vllm.entrypoints.tool_server import ToolServer
11 +from vllm.entrypoints.mcp.tool_server import ToolServer
12 from vllm.logger import init_logger
13 from vllm.utils.collection_utils import is_list_of
14 from vllm.utils.import_utils import import_from_path
vllm/reasoning/gptoss_reasoning_parser.py
+1 -1
@@ -5,12 +5,12 @@ from collections.abc import Sequence
5
6 from transformers import PreTrainedTokenizerBase
7
8 +from vllm.entrypoints.mcp.tool_server import ToolServer
9 from vllm.entrypoints.openai.chat_completion.protocol import (
10 ChatCompletionRequest,
11 )
12 from vllm.entrypoints.openai.engine.protocol import DeltaMessage
13 from vllm.entrypoints.openai.parser.harmony_utils import parse_chat_output
13 -from vllm.entrypoints.tool_server import ToolServer
14 from vllm.logger import init_logger
15 from vllm.reasoning import ReasoningParser
16