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