Skip to content

Commit 166475c

Browse files
committed
Revert "Remove the examples' pydantic-settings usage instead of carrying the dependency"
This reverts commit c752b0e.
1 parent c752b0e commit 166475c

6 files changed

Lines changed: 99 additions & 4 deletions

File tree

examples/mcpserver/text_me.py

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
# /// script
2+
# dependencies = []
3+
# ///
4+
5+
"""MCPServer Text Me Server
6+
--------------------------------
7+
This defines a simple MCPServer server that sends a text message to a phone number via https://surgemsg.com/.
8+
9+
To run this example, create a `.env` file with the following values:
10+
11+
SURGE_API_KEY=...
12+
SURGE_ACCOUNT_ID=...
13+
SURGE_MY_PHONE_NUMBER=...
14+
SURGE_MY_FIRST_NAME=...
15+
SURGE_MY_LAST_NAME=...
16+
17+
Visit https://surgemsg.com/ and click "Get Started" to obtain these values.
18+
"""
19+
20+
from typing import Annotated
21+
22+
import httpx2
23+
from pydantic import BeforeValidator
24+
from pydantic_settings import BaseSettings, SettingsConfigDict
25+
26+
from mcp.server.mcpserver import MCPServer
27+
28+
29+
class SurgeSettings(BaseSettings):
30+
model_config: SettingsConfigDict = SettingsConfigDict(env_prefix="SURGE_", env_file=".env")
31+
32+
api_key: str
33+
account_id: str
34+
my_phone_number: Annotated[str, BeforeValidator(lambda v: "+" + v if not v.startswith("+") else v)]
35+
my_first_name: str
36+
my_last_name: str
37+
38+
39+
# Create server
40+
mcp = MCPServer("Text me")
41+
surge_settings = SurgeSettings() # type: ignore
42+
43+
44+
@mcp.tool(name="textme", description="Send a text message to me")
45+
def text_me(text_content: str) -> str:
46+
"""Send a text message to a phone number via https://surgemsg.com/"""
47+
with httpx2.Client() as client:
48+
response = client.post(
49+
"https://api.surgemsg.com/messages",
50+
headers={
51+
"Authorization": f"Bearer {surge_settings.api_key}",
52+
"Surge-Account": surge_settings.account_id,
53+
"Content-Type": "application/json",
54+
},
55+
json={
56+
"body": text_content,
57+
"conversation": {
58+
"contact": {
59+
"first_name": surge_settings.my_first_name,
60+
"last_name": surge_settings.my_last_name,
61+
"phone_number": surge_settings.my_phone_number,
62+
}
63+
},
64+
},
65+
)
66+
response.raise_for_status()
67+
return f"Message sent: {text_content}"

examples/servers/simple-auth/mcp_simple_auth/server.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
from typing import Any, Literal
1313

1414
import click
15-
from pydantic import AnyHttpUrl, BaseModel
15+
from pydantic import AnyHttpUrl
16+
from pydantic_settings import BaseSettings, SettingsConfigDict
1617

1718
from mcp.server.auth.settings import AuthSettings
1819
from mcp.server.mcpserver.server import MCPServer
@@ -22,9 +23,11 @@
2223
logger = logging.getLogger(__name__)
2324

2425

25-
class ResourceServerSettings(BaseModel):
26+
class ResourceServerSettings(BaseSettings):
2627
"""Settings for the MCP Resource Server."""
2728

29+
model_config = SettingsConfigDict(env_prefix="MCP_RESOURCE_")
30+
2831
# Server settings
2932
host: str = "localhost"
3033
port: int = 8001

examples/servers/simple-auth/mcp_simple_auth/simple_auth_provider.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
import time
1313
from typing import Any
1414

15-
from pydantic import AnyHttpUrl, BaseModel
15+
from pydantic import AnyHttpUrl
16+
from pydantic_settings import BaseSettings, SettingsConfigDict
1617
from starlette.exceptions import HTTPException
1718
from starlette.requests import Request
1819
from starlette.responses import HTMLResponse, RedirectResponse, Response
@@ -28,9 +29,11 @@
2829
from mcp.shared.auth import OAuthClientInformationFull, OAuthToken
2930

3031

31-
class SimpleAuthSettings(BaseModel):
32+
class SimpleAuthSettings(BaseSettings):
3233
"""Simple OAuth settings for demo purposes."""
3334

35+
model_config = SettingsConfigDict(env_prefix="MCP_")
36+
3437
# Demo user credentials
3538
demo_username: str = "demo_user"
3639
demo_password: str = "demo_password"

examples/servers/simple-auth/pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ dependencies = [
1212
"httpx2>=2.5.0",
1313
"mcp",
1414
"pydantic>=2.0",
15+
"pydantic-settings>=2.5.2",
1516
"sse-starlette>=1.6.1",
1617
"uvicorn>=0.23.1; sys_platform != 'emscripten'",
1718
]

pyproject.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@ dev = [
5858
# We add mcp[cli] so `uv sync` considers the extras.
5959
"mcp[cli]",
6060
"mcp-example-stories",
61+
# pydantic-settings is used only by examples (simple-auth, mcpserver/text_me);
62+
# keep it reachable for pyright, which covers examples/servers.
63+
"pydantic-settings>=2.5.2",
6164
"tomli>=2.0; python_version < '3.11'",
6265
"pyright>=1.1.400",
6366
"pytest>=8.4.0",

uv.lock

Lines changed: 18 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)