Skip to content

README - replace code snippets with examples - add lowlevel to snippets #1150

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jul 16, 2025

Conversation

ihrpr
Copy link
Contributor

@ihrpr ihrpr commented Jul 16, 2025

Part 3:

  • Low-level server with lifespan
  • Low-level server basic example
  • Low-level server structured output

Part 1: #1055
Part 2: #1136
Part 3: #1137

Remaining:

  • Auth

    • Authentication server example
    • OAuth client authentication
  • Remote MCP (streamable Http)

    • Streamable HTTP client
    • Streamable HTTP server examples
    • SSE server mounting examples (just change to mounting )

Kludex
Kludex previously approved these changes Jul 16, 2025
README.md Outdated
Comment on lines 1246 to 1253
"""Low-level server example showing structured output support.

This example demonstrates how to use the low-level server API to return
structured data from tools, with automatic validation against output schemas.

Run from the repository root:
uv run examples/snippets/servers/lowlevel/structured_output.py
"""
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Those module docstring seems to be adding a lot of unnecessary content to the README, given that you can run each of those individually.

README.md Outdated
Comment on lines 1296 to 1297
# WARNING: eval() is dangerous! Use a safe math parser in production
result = eval(expression)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I know we have the comment warning people, but maybe we can have an example that doesn't use it?

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agree, maybe something like:

from sympy import sympify
...
result = sympify(expression).evalf()

(and the extra dep can be added as uv preamble w/ uv add --script ...py sympy)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

just changed an example to weathers, same as we have for high level server API

README.md Outdated
Comment on lines 1304 to 1305
except Exception as e:
raise ValueError(f"Calculation error: {str(e)}")
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Out of scope, but this shouldn't be necessary, since the exception is just bubbled up?

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And/or, maybe always raise X() from e for exception chaining

ochafik
ochafik previously approved these changes Jul 16, 2025
Copy link

@ochafik ochafik left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks Inna! A few optional suggestions :-)

README.md Outdated
if name != "example-prompt":
raise ValueError(f"Unknown prompt: {name}")

arg1_value = arguments.get("arg1", "default") if arguments else "default"
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

meganit: arg1_value = (arguments or {}).get("arg1", "default") to say default only once?

README.md Outdated
Comment on lines 1296 to 1297
# WARNING: eval() is dangerous! Use a safe math parser in production
result = eval(expression)
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agree, maybe something like:

from sympy import sympify
...
result = sympify(expression).evalf()

(and the extra dep can be added as uv preamble w/ uv add --script ...py sympy)

and cleanup.

Run from the repository root:
uv run examples/snippets/servers/lowlevel/lifespan.py
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe need uv add --script examples/snippets/servers/lowlevel/lifespan.py mcp first to bake the dep(s) into each of these examples? Otherwise I'm getting:

error: Workspace member `/Users/ochafik/code/modelcontextprotocol-python-sdk/examples/servers/simple-auth-remote` is missing a `pyproject.toml` (matches: `examples/servers/*`)


# low-level server will validate structured output against the tool's
# output schema, and automatically serialize it into a TextContent block
# for backwards compatibility with pre-2025-06-18 clients.
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

meganit: I'd maybe switch "automatically" to "additionally" to make it clearer that serialization is in addition to returning structuredContent?

README.md Outdated
Comment on lines 1304 to 1305
except Exception as e:
raise ValueError(f"Calculation error: {str(e)}")
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And/or, maybe always raise X() from e for exception chaining

@ihrpr ihrpr dismissed stale reviews from ochafik and Kludex via 419e8d3 July 16, 2025 14:16
@ihrpr ihrpr merged commit 0b4ce00 into main Jul 16, 2025
11 of 13 checks passed
@ihrpr ihrpr deleted the ihrpr/lowlevel-snippet branch July 16, 2025 14:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants