FazBrowse GitHub Viewer
|
Trending
|
URL:
|
Home
Tools:
[Download Repo ZIP]
[View Raw Code]
[Original HTTPS Page]
python-sdk/src/mcp/client/websocket.py at main · DVampire/python-sdk · GitHub
DVampire
/
python-sdk
Public
forked from
modelcontextprotocol/python-sdk
Notifications
You must be signed in to change notification settings
Fork
0
Star
0
Code
Pull requests
0
Actions
Projects
Security and quality
0
Insights
Additional navigation options
Code
Pull requests
Actions
Projects
Security and quality
Insights
Expand file tree
Breadcrumbs
python-sdk
/
src
/
mcp
/
client
/
websocket.py
Copy path
More file actions
More file actions
Latest commit
History
History
History
89 lines (74 loc) · 3.35 KB
Breadcrumbs
python-sdk
/
src
/
mcp
/
client
/
websocket.py
Copy path
File metadata and controls
89 lines (74 loc) · 3.35 KB
Raw
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import
json
import
logging
from
collections
.
abc
import
AsyncGenerator
from
contextlib
import
asynccontextmanager
import
anyio
from
anyio
.
streams
.
memory
import
MemoryObjectReceiveStream
,
MemoryObjectSendStream
from
pydantic
import
ValidationError
from
websockets
.
asyncio
.
client
import
connect
as
ws_connect
from
websockets
.
typing
import
Subprotocol
import
mcp
.
types
as
types
logger
=
logging
.
getLogger
(
__name__
)
@
asynccontextmanager
async
def
websocket_client
(
url
:
str
,
)
->
AsyncGenerator
[
tuple
[
MemoryObjectReceiveStream
[
types
.
JSONRPCMessage
|
Exception
],
MemoryObjectSendStream
[
types
.
JSONRPCMessage
],
],
None
,
]:
"""
WebSocket client transport for MCP, symmetrical to the server version.
Connects to 'url' using the 'mcp' subprotocol, then yields:
(read_stream, write_stream)
- read_stream: As you read from this stream, you'll receive either valid
JSONRPCMessage objects or Exception objects (when validation fails).
- write_stream: Write JSONRPCMessage objects to this stream to send them
over the WebSocket to the server.
"""
# Create two in-memory streams:
# - One for incoming messages (read_stream, written by ws_reader)
# - One for outgoing messages (write_stream, read by ws_writer)
read_stream
:
MemoryObjectReceiveStream
[
types
.
JSONRPCMessage
|
Exception
]
read_stream_writer
:
MemoryObjectSendStream
[
types
.
JSONRPCMessage
|
Exception
]
write_stream
:
MemoryObjectSendStream
[
types
.
JSONRPCMessage
]
write_stream_reader
:
MemoryObjectReceiveStream
[
types
.
JSONRPCMessage
]
read_stream_writer
,
read_stream
=
anyio
.
create_memory_object_stream
(
0
)
write_stream
,
write_stream_reader
=
anyio
.
create_memory_object_stream
(
0
)
# Connect using websockets, requesting the "mcp" subprotocol
async
with
ws_connect
(
url
,
subprotocols
=
[
Subprotocol
(
"mcp"
)])
as
ws
:
async
def
ws_reader
():
"""
Reads text messages from the WebSocket, parses them as JSON-RPC messages,
and sends them into read_stream_writer.
"""
async
with
read_stream_writer
:
async
for
raw_text
in
ws
:
try
:
message
=
types
.
JSONRPCMessage
.
model_validate_json
(
raw_text
)
await
read_stream_writer
.
send
(
message
)
except
ValidationError
as
exc
:
# If JSON parse or model validation fails, send the exception
await
read_stream_writer
.
send
(
exc
)
async
def
ws_writer
():
"""
Reads JSON-RPC messages from write_stream_reader and
sends them to the server.
"""
async
with
write_stream_reader
:
async
for
message
in
write_stream_reader
:
# Convert to a dict, then to JSON
msg_dict
=
message
.
model_dump
(
by_alias
=
True
,
mode
=
"json"
,
exclude_none
=
True
)
await
ws
.
send
(
json
.
dumps
(
msg_dict
))
async
with
anyio
.
create_task_group
()
as
tg
:
# Start reader and writer tasks
tg
.
start_soon
(
ws_reader
)
tg
.
start_soon
(
ws_writer
)
# Yield the receive/send streams
yield
(
read_stream
,
write_stream
)
# Once the caller's 'async with' block exits, we shut down
tg
.
cancel_scope
.
cancel
()
Back
|
FazBrowse Home
|
New Git URL