From 6191f3e7d2b3e58cd59ba3c0907ca7cc208b24c5 Mon Sep 17 00:00:00 2001 From: Katherine Batista Date: Tue, 2 Dec 2025 15:23:17 +0000 Subject: [PATCH] RDCIST-3884: setup repo --- .github/CODEOWNERS | 1 + .../ISSUE_TEMPLATE/PULL_REQUEST_TEMPLATE.md | 21 ++ .github/ISSUE_TEMPLATE/bug.yaml | 55 ----- .github/ISSUE_TEMPLATE/config.yaml | 1 - .github/ISSUE_TEMPLATE/feature-request.yaml | 29 --- .github/ISSUE_TEMPLATE/question.yaml | 33 --- .github/workflows/main-checks.yml | 3 - .github/workflows/publish-pypi.yml | 82 ------- .github/workflows/shared.yml | 10 +- .github/workflows/validate-pr-labels.yaml | 11 + .github/workflows/validate-pr-title.yaml | 11 + CODE_OF_CONDUCT.md | 128 ----------- CONTRIBUTING.md | 88 ------- GitVersion.yml | 7 + Makefile | 24 ++ RELEASE.md | 13 -- SECURITY.md | 15 -- cicd/azure-pipeline-merge.yaml | 38 ++++ cicd/azure-pipeline-pr.yaml | 32 +++ .../conformance-auth-client/pyproject.toml | 2 +- .../clients/simple-auth-client/pyproject.toml | 2 +- .../clients/simple-chatbot/pyproject.toml | 2 +- .../servers/everything-server/pyproject.toml | 2 +- examples/servers/simple-auth/pyproject.toml | 2 +- .../servers/simple-pagination/pyproject.toml | 2 +- examples/servers/simple-prompt/pyproject.toml | 2 +- .../servers/simple-resource/pyproject.toml | 2 +- .../pyproject.toml | 2 +- .../simple-streamablehttp/pyproject.toml | 2 +- examples/servers/simple-tool/pyproject.toml | 2 +- .../structured-output-lowlevel/pyproject.toml | 2 +- examples/snippets/pyproject.toml | 2 +- pyproject.toml | 27 ++- src/mcp/server/fastmcp/__init__.py | 2 +- uv.lock | 215 ++++++++++-------- 35 files changed, 297 insertions(+), 575 deletions(-) create mode 100644 .github/CODEOWNERS create mode 100644 .github/ISSUE_TEMPLATE/PULL_REQUEST_TEMPLATE.md delete mode 100644 .github/ISSUE_TEMPLATE/bug.yaml delete mode 100644 .github/ISSUE_TEMPLATE/config.yaml delete mode 100644 .github/ISSUE_TEMPLATE/feature-request.yaml delete mode 100644 .github/ISSUE_TEMPLATE/question.yaml delete mode 100644 .github/workflows/publish-pypi.yml create mode 100644 .github/workflows/validate-pr-labels.yaml create mode 100644 .github/workflows/validate-pr-title.yaml delete mode 100644 CODE_OF_CONDUCT.md delete mode 100644 CONTRIBUTING.md create mode 100644 GitVersion.yml create mode 100644 Makefile delete mode 100644 RELEASE.md delete mode 100644 SECURITY.md create mode 100644 cicd/azure-pipeline-merge.yaml create mode 100644 cicd/azure-pipeline-pr.yaml diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000000..36f240cc15 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +* @OutSystems/data-fabric-clients \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/PULL_REQUEST_TEMPLATE.md b/.github/ISSUE_TEMPLATE/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000000..5b7bc25575 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,21 @@ + + +### Jira Issue + + +[](https://outsystemsrd.atlassian.net/browse/) + +### Context + + +### Impacts + +- [ ] Breaking Change + - [ ] Behavioral breaking change +- [ ] Refactor (big refactor on a sensitive asset ) +- [ ] Requires revision on public documentation \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/bug.yaml b/.github/ISSUE_TEMPLATE/bug.yaml deleted file mode 100644 index e52277a2a7..0000000000 --- a/.github/ISSUE_TEMPLATE/bug.yaml +++ /dev/null @@ -1,55 +0,0 @@ -name: 🐛 MCP Python SDK Bug -description: Report a bug or unexpected behavior in the MCP Python SDK -labels: ["need confirmation"] - -body: - - type: markdown - attributes: - value: Thank you for contributing to the MCP Python SDK! ✊ - - - type: checkboxes - id: checks - attributes: - label: Initial Checks - description: Just making sure you're using the latest version of MCP Python SDK. - options: - - label: I confirm that I'm using the latest version of MCP Python SDK - required: true - - label: I confirm that I searched for my issue in https://github.com/modelcontextprotocol/python-sdk/issues before opening this issue - required: true - - - type: textarea - id: description - attributes: - label: Description - description: | - Please explain what you're seeing and what you would expect to see. - - Please provide as much detail as possible to make understanding and solving your problem as quick as possible. 🙏 - validations: - required: true - - - type: textarea - id: example - attributes: - label: Example Code - description: > - If applicable, please add a self-contained, - [minimal, reproducible, example](https://stackoverflow.com/help/minimal-reproducible-example) - demonstrating the bug. - - placeholder: | - from mcp.server.fastmcp import FastMCP - - ... - render: Python - - - type: textarea - id: version - attributes: - label: Python & MCP Python SDK - description: | - Which version of Python and MCP Python SDK are you using? - render: Text - validations: - required: true diff --git a/.github/ISSUE_TEMPLATE/config.yaml b/.github/ISSUE_TEMPLATE/config.yaml deleted file mode 100644 index 3ba13e0cec..0000000000 --- a/.github/ISSUE_TEMPLATE/config.yaml +++ /dev/null @@ -1 +0,0 @@ -blank_issues_enabled: false diff --git a/.github/ISSUE_TEMPLATE/feature-request.yaml b/.github/ISSUE_TEMPLATE/feature-request.yaml deleted file mode 100644 index bec9b77b15..0000000000 --- a/.github/ISSUE_TEMPLATE/feature-request.yaml +++ /dev/null @@ -1,29 +0,0 @@ -name: 🚀 MCP Python SDK Feature Request -description: "Suggest a new feature for the MCP Python SDK" -labels: ["feature request"] - -body: - - type: markdown - attributes: - value: Thank you for contributing to the MCP Python SDK! ✊ - - - type: textarea - id: description - attributes: - label: Description - description: | - Please give as much detail as possible about the feature you would like to suggest. 🙏 - - You might like to add: - * A demo of how code might look when using the feature - * Your use case(s) for the feature - * Reference to other projects that have a similar feature - validations: - required: true - - - type: textarea - id: references - attributes: - label: References - description: | - Please add any links or references that might help us understand your feature request better. 📚 diff --git a/.github/ISSUE_TEMPLATE/question.yaml b/.github/ISSUE_TEMPLATE/question.yaml deleted file mode 100644 index 87a7894f12..0000000000 --- a/.github/ISSUE_TEMPLATE/question.yaml +++ /dev/null @@ -1,33 +0,0 @@ -name: ❓ MCP Python SDK Question -description: "Ask a question about the MCP Python SDK" -labels: ["question"] - -body: - - type: markdown - attributes: - value: Thank you for reaching out to the MCP Python SDK community! We're here to help! 🤝 - - - type: textarea - id: question - attributes: - label: Question - description: | - Please provide as much detail as possible about your question. 🙏 - - You might like to include: - * Code snippets showing what you've tried - * Error messages you're encountering (if any) - * Expected vs actual behavior - * Your use case and what you're trying to achieve - validations: - required: true - - - type: textarea - id: context - attributes: - label: Additional Context - description: | - Please provide any additional context that might help us better understand your question, such as: - * Your MCP Python SDK version - * Your Python version - * Relevant configuration or environment details 📝 diff --git a/.github/workflows/main-checks.yml b/.github/workflows/main-checks.yml index 6f38043cdd..d03500c471 100644 --- a/.github/workflows/main-checks.yml +++ b/.github/workflows/main-checks.yml @@ -4,9 +4,6 @@ on: push: branches: - main - - "v*.*.*" - tags: - - "v*.*.*" jobs: checks: diff --git a/.github/workflows/publish-pypi.yml b/.github/workflows/publish-pypi.yml deleted file mode 100644 index 59ede84172..0000000000 --- a/.github/workflows/publish-pypi.yml +++ /dev/null @@ -1,82 +0,0 @@ -name: Publishing - -on: - release: - types: [published] - -jobs: - release-build: - name: Build distribution - runs-on: ubuntu-latest - needs: [checks] - steps: - - uses: actions/checkout@v4 - - - name: Install uv - uses: astral-sh/setup-uv@v3 - with: - enable-cache: true - version: 0.9.5 - - - name: Set up Python 3.12 - run: uv python install 3.12 - - - name: Build - run: uv build - - - name: Upload artifacts - uses: actions/upload-artifact@v4 - with: - name: release-dists - path: dist/ - - checks: - uses: ./.github/workflows/shared.yml - - pypi-publish: - name: Upload release to PyPI - runs-on: ubuntu-latest - environment: release - needs: - - release-build - permissions: - id-token: write # IMPORTANT: this permission is mandatory for trusted publishing - - steps: - - name: Retrieve release distributions - uses: actions/download-artifact@v4 - with: - name: release-dists - path: dist/ - - - name: Publish package distributions to PyPI - uses: pypa/gh-action-pypi-publish@release/v1 - - docs-publish: - runs-on: ubuntu-latest - needs: ["pypi-publish"] - permissions: - contents: write - steps: - - uses: actions/checkout@v4 - - name: Configure Git Credentials - run: | - git config user.name github-actions[bot] - git config user.email 41898282+github-actions[bot]@users.noreply.github.com - - - name: Install uv - uses: astral-sh/setup-uv@v3 - with: - enable-cache: true - version: 0.9.5 - - - run: echo "cache_id=$(date --utc '+%V')" >> $GITHUB_ENV - - uses: actions/cache@v4 - with: - key: mkdocs-material-${{ env.cache_id }} - path: .cache - restore-keys: | - mkdocs-material- - - - run: uv sync --frozen --group docs - - run: uv run --frozen --no-sync mkdocs gh-deploy --force diff --git a/.github/workflows/shared.yml b/.github/workflows/shared.yml index 531487db5a..5cac9488c7 100644 --- a/.github/workflows/shared.yml +++ b/.github/workflows/shared.yml @@ -20,7 +20,7 @@ jobs: enable-cache: true version: 0.9.5 - name: Install dependencies - run: uv sync --frozen --all-extras --python 3.10 + run: uv sync --frozen --all-extras --python 3.12 - uses: pre-commit/action@v3.0.1 with: @@ -35,7 +35,7 @@ jobs: continue-on-error: true strategy: matrix: - python-version: ["3.10", "3.11", "3.12", "3.13"] + python-version: ["3.12", "3.13"] dep-resolution: - name: lowest-direct install-flags: "--upgrade --resolution lowest-direct" @@ -57,9 +57,7 @@ jobs: - name: Run pytest with coverage run: | - uv run --frozen --no-sync coverage run -m pytest - uv run --frozen --no-sync coverage combine - uv run --frozen --no-sync coverage report + make coverage readme-snippets: runs-on: ubuntu-latest @@ -72,7 +70,7 @@ jobs: version: 0.9.5 - name: Install dependencies - run: uv sync --frozen --all-extras --python 3.10 + run: uv sync --frozen --all-extras --python 3.12 - name: Check README snippets are up to date run: uv run --frozen scripts/update_readme_snippets.py --check diff --git a/.github/workflows/validate-pr-labels.yaml b/.github/workflows/validate-pr-labels.yaml new file mode 100644 index 0000000000..606b736ebd --- /dev/null +++ b/.github/workflows/validate-pr-labels.yaml @@ -0,0 +1,11 @@ +name: Validate pull request labels + +on: + pull_request: + types: [labeled, unlabeled, synchronize] + +jobs: + check-label: + uses: OutSystems/rd.github-reusable-workflows/.github/workflows/validate-pr-labels.yaml@59bd1315cfd3558f93edff0a994430dab78812fa #v2.0.7 + with: + validate-semVer: false \ No newline at end of file diff --git a/.github/workflows/validate-pr-title.yaml b/.github/workflows/validate-pr-title.yaml new file mode 100644 index 0000000000..9f11360956 --- /dev/null +++ b/.github/workflows/validate-pr-title.yaml @@ -0,0 +1,11 @@ +name: Validate pull request title + +on: + pull_request: + types: [opened, edited, synchronize, reopened] + +jobs: + build: + uses: OutSystems/rd.github-reusable-workflows/.github/workflows/validate-pr-title.yaml@59bd1315cfd3558f93edff0a994430dab78812fa + with: + validate-semVer: false \ No newline at end of file diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md deleted file mode 100644 index 985a28566c..0000000000 --- a/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,128 +0,0 @@ -# Contributor Covenant Code of Conduct - -## Our Pledge - -We as members, contributors, and leaders pledge to make participation in our -community a harassment-free experience for everyone, regardless of age, body -size, visible or invisible disability, ethnicity, sex characteristics, gender -identity and expression, level of experience, education, socio-economic status, -nationality, personal appearance, race, religion, or sexual identity -and orientation. - -We pledge to act and interact in ways that contribute to an open, welcoming, -diverse, inclusive, and healthy community. - -## Our Standards - -Examples of behavior that contributes to a positive environment for our -community include: - -* Demonstrating empathy and kindness toward other people -* Being respectful of differing opinions, viewpoints, and experiences -* Giving and gracefully accepting constructive feedback -* Accepting responsibility and apologizing to those affected by our mistakes, - and learning from the experience -* Focusing on what is best not just for us as individuals, but for the - overall community - -Examples of unacceptable behavior include: - -* The use of sexualized language or imagery, and sexual attention or - advances of any kind -* Trolling, insulting or derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or email - address, without their explicit permission -* Other conduct which could reasonably be considered inappropriate in a - professional setting - -## Enforcement Responsibilities - -Community leaders are responsible for clarifying and enforcing our standards of -acceptable behavior and will take appropriate and fair corrective action in -response to any behavior that they deem inappropriate, threatening, offensive, -or harmful. - -Community leaders have the right and responsibility to remove, edit, or reject -comments, commits, code, wiki edits, issues, and other contributions that are -not aligned to this Code of Conduct, and will communicate reasons for moderation -decisions when appropriate. - -## Scope - -This Code of Conduct applies within all community spaces, and also applies when -an individual is officially representing the community in public spaces. -Examples of representing our community include using an official e-mail address, -posting via an official social media account, or acting as an appointed -representative at an online or offline event. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported to the community leaders responsible for enforcement at -. -All complaints will be reviewed and investigated promptly and fairly. - -All community leaders are obligated to respect the privacy and security of the -reporter of any incident. - -## Enforcement Guidelines - -Community leaders will follow these Community Impact Guidelines in determining -the consequences for any action they deem in violation of this Code of Conduct: - -### 1. Correction - -**Community Impact**: Use of inappropriate language or other behavior deemed -unprofessional or unwelcome in the community. - -**Consequence**: A private, written warning from community leaders, providing -clarity around the nature of the violation and an explanation of why the -behavior was inappropriate. A public apology may be requested. - -### 2. Warning - -**Community Impact**: A violation through a single incident or series -of actions. - -**Consequence**: A warning with consequences for continued behavior. No -interaction with the people involved, including unsolicited interaction with -those enforcing the Code of Conduct, for a specified period of time. This -includes avoiding interactions in community spaces as well as external channels -like social media. Violating these terms may lead to a temporary or -permanent ban. - -### 3. Temporary Ban - -**Community Impact**: A serious violation of community standards, including -sustained inappropriate behavior. - -**Consequence**: A temporary ban from any sort of interaction or public -communication with the community for a specified period of time. No public or -private interaction with the people involved, including unsolicited interaction -with those enforcing the Code of Conduct, is allowed during this period. -Violating these terms may lead to a permanent ban. - -### 4. Permanent Ban - -**Community Impact**: Demonstrating a pattern of violation of community -standards, including sustained inappropriate behavior, harassment of an -individual, or aggression toward or disparagement of classes of individuals. - -**Consequence**: A permanent ban from any sort of public interaction within -the community. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], -version 2.0, available at -. - -Community Impact Guidelines were inspired by [Mozilla's code of conduct -enforcement ladder](https://github.com/mozilla/diversity). - -[homepage]: https://www.contributor-covenant.org - -For answers to common questions about this code of conduct, see the FAQ at -. Translations are available at -. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index c18937f5b3..0000000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,88 +0,0 @@ -# Contributing - -Thank you for your interest in contributing to the MCP Python SDK! This document provides guidelines and instructions for contributing. - -## Development Setup - -1. Make sure you have Python 3.10+ installed -2. Install [uv](https://docs.astral.sh/uv/getting-started/installation/) -3. Fork the repository -4. Clone your fork: `git clone https://github.com/YOUR-USERNAME/python-sdk.git` -5. Install dependencies: - -```bash -uv sync --frozen --all-extras --dev -``` - -6. Set up pre-commit hooks: - -```bash -uv tool install pre-commit --with pre-commit-uv --force-reinstall -``` - -## Development Workflow - -1. Choose the correct branch for your changes: - - For bug fixes to a released version: use the latest release branch (e.g. v1.1.x for 1.1.3) - - For new features: use the main branch (which will become the next minor/major version) - - If unsure, ask in an issue first - -2. Create a new branch from your chosen base branch - -3. Make your changes - -4. Ensure tests pass: - -```bash -uv run pytest -``` - -5. Run type checking: - -```bash -uv run pyright -``` - -6. Run linting: - -```bash -uv run ruff check . -uv run ruff format . -``` - -7. Update README snippets if you modified example code: - -```bash -uv run scripts/update_readme_snippets.py -``` - -8. (Optional) Run pre-commit hooks on all files: - -```bash -pre-commit run --all-files -``` - -9. Submit a pull request to the same branch you branched from - -## Code Style - -- We use `ruff` for linting and formatting -- Follow PEP 8 style guidelines -- Add type hints to all functions -- Include docstrings for public APIs - -## Pull Request Process - -1. Update documentation as needed -2. Add tests for new functionality -3. Ensure CI passes -4. Maintainers will review your code -5. Address review feedback - -## Code of Conduct - -Please note that this project is released with a [Code of Conduct](CODE_OF_CONDUCT.md). By participating in this project you agree to abide by its terms. - -## License - -By contributing, you agree that your contributions will be licensed under the MIT License. diff --git a/GitVersion.yml b/GitVersion.yml new file mode 100644 index 0000000000..e14938497d --- /dev/null +++ b/GitVersion.yml @@ -0,0 +1,7 @@ +mode: Mainline +assembly-versioning-scheme: Major +assembly-file-versioning-scheme: MajorMinorPatch +branches: {} +ignore: + sha: [] +merge-message-formats: {} \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000000..00d1ebf60b --- /dev/null +++ b/Makefile @@ -0,0 +1,24 @@ +.PHONY: install build publish lint test integration_test coverage + +install: + @echo "🏠 Install project" + uv sync + +build: + @echo "🏠 Build project" + uv build + +publish: + @echo "🏠 Publish project" + uv publish --index rd-ai-common-artifacts + +lint: + @: + +test: lint + @echo "🏠 Run tests" + uv run pytest tests --verbose + +coverage: + @echo "🏠 Run coverage" + uv run pytest tests --cov=outsystems tests --cov-config .coveragerc --cov-report=html:coverage --cov-report=xml --cov-report=term \ No newline at end of file diff --git a/RELEASE.md b/RELEASE.md deleted file mode 100644 index 6555a1c2d8..0000000000 --- a/RELEASE.md +++ /dev/null @@ -1,13 +0,0 @@ -# Release Process - -## Bumping Dependencies - -1. Change dependency version in `pyproject.toml` -2. Upgrade lock with `uv lock --resolution lowest-direct` - -## Major or Minor Release - -Create a GitHub release via UI with the tag being `vX.Y.Z` where `X.Y.Z` is the version, -and the release title being the same. Then ask someone to review the release. - -The package version will be set automatically from the tag. diff --git a/SECURITY.md b/SECURITY.md deleted file mode 100644 index 6545156105..0000000000 --- a/SECURITY.md +++ /dev/null @@ -1,15 +0,0 @@ -# Security Policy - -Thank you for helping us keep the SDKs and systems they interact with secure. - -## Reporting Security Issues - -This SDK is maintained by [Anthropic](https://www.anthropic.com/) as part of the Model Context Protocol project. - -The security of our systems and user data is Anthropic’s top priority. We appreciate the work of security researchers acting in good faith in identifying and reporting potential vulnerabilities. - -Our security program is managed on HackerOne and we ask that any validated vulnerability in this functionality be reported through their [submission form](https://hackerone.com/anthropic-vdp/reports/new?type=team&report_type=vulnerability). - -## Vulnerability Disclosure Program - -Our Vulnerability Program Guidelines are defined on our [HackerOne program page](https://hackerone.com/anthropic-vdp). diff --git a/cicd/azure-pipeline-merge.yaml b/cicd/azure-pipeline-merge.yaml new file mode 100644 index 0000000000..77d8f22001 --- /dev/null +++ b/cicd/azure-pipeline-merge.yaml @@ -0,0 +1,38 @@ +trigger: + branches: + include: + - main + paths: + include: + - src + - tests + - cicd + - scripts + - .github + +pool: + vmImage: "ubuntu-22.04" + +pr: none + +variables: + - group: SDLC-SM-HighCode-CI + +resources: + repositories: + - repository: rd-ai-azure-pipeline-templates + type: github + ref: refs/tags/v6.5.1 + name: OutSystems/rd-ai-azure-pipeline-templates + endpoint: OutSystems + +jobs: + - template: python/packages/new-azure-pipeline.yml@rd-ai-azure-pipeline-templates + parameters: + PackageName: "mcp-python-sdk" + SonarCloudProject: "OutSystems_mcp-python-sdk" + SonarCloudExclusionList: "tests/**/*,examples/**/*,scripts/*" + SonarCloudCoverageExclusionList: "tests/**/*,examples/**/*,scripts/*" + SkipIntegrationTests: true + PythonVersion: 3.12 + PackageManager: "uv" \ No newline at end of file diff --git a/cicd/azure-pipeline-pr.yaml b/cicd/azure-pipeline-pr.yaml new file mode 100644 index 0000000000..5982ef05e4 --- /dev/null +++ b/cicd/azure-pipeline-pr.yaml @@ -0,0 +1,32 @@ +pr: + paths: + exclude: + - .idea + - docs # Exclude changes to documentation + +pool: + vmImage: "ubuntu-22.04" + +trigger: none + +variables: + - group: SDLC-SM-HighCode-CI + +resources: + repositories: + - repository: rd-ai-azure-pipeline-templates + type: github + ref: refs/tags/v6.5.1 + name: OutSystems/rd-ai-azure-pipeline-templates + endpoint: OutSystems + +jobs: + - template: python/packages/new-azure-pipeline-pr.yml@rd-ai-azure-pipeline-templates + parameters: + PackageName: "mcp-python-sdk" + SonarCloudProject: "OutSystems_mcp-python-sdk" + SonarCloudExclusionList: "tests/**/*,examples/**/*,scripts/*" + SonarCloudCoverageExclusionList: "tests/**/*,examples/**/*,scripts/*" + SkipIntegrationTests: true + PythonVersion: 3.12 + PackageManager: "uv" \ No newline at end of file diff --git a/examples/clients/conformance-auth-client/pyproject.toml b/examples/clients/conformance-auth-client/pyproject.toml index 3d03b4d4a1..14559317d2 100644 --- a/examples/clients/conformance-auth-client/pyproject.toml +++ b/examples/clients/conformance-auth-client/pyproject.toml @@ -14,7 +14,7 @@ classifiers = [ "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.10", ] -dependencies = ["mcp", "httpx>=0.28.1"] +dependencies = ["mcp-python-sdk", "httpx>=0.28.1"] [project.scripts] mcp-conformance-auth-client = "mcp_conformance_auth_client:main" diff --git a/examples/clients/simple-auth-client/pyproject.toml b/examples/clients/simple-auth-client/pyproject.toml index 46aba8dc12..24150344fd 100644 --- a/examples/clients/simple-auth-client/pyproject.toml +++ b/examples/clients/simple-auth-client/pyproject.toml @@ -14,7 +14,7 @@ classifiers = [ "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.10", ] -dependencies = ["click>=8.2.0", "mcp"] +dependencies = ["click>=8.2.0", "mcp-python-sdk"] [project.scripts] mcp-simple-auth-client = "mcp_simple_auth_client.main:cli" diff --git a/examples/clients/simple-chatbot/pyproject.toml b/examples/clients/simple-chatbot/pyproject.toml index 564b42df33..1c68a097d9 100644 --- a/examples/clients/simple-chatbot/pyproject.toml +++ b/examples/clients/simple-chatbot/pyproject.toml @@ -17,7 +17,7 @@ classifiers = [ dependencies = [ "python-dotenv>=1.0.0", "requests>=2.31.0", - "mcp", + "mcp-python-sdk", "uvicorn>=0.32.1", ] diff --git a/examples/servers/everything-server/pyproject.toml b/examples/servers/everything-server/pyproject.toml index ff67bf5577..0a4c4fb98a 100644 --- a/examples/servers/everything-server/pyproject.toml +++ b/examples/servers/everything-server/pyproject.toml @@ -7,7 +7,7 @@ requires-python = ">=3.10" authors = [{ name = "Anthropic, PBC." }] keywords = ["mcp", "llm", "automation", "conformance", "testing"] license = { text = "MIT" } -dependencies = ["anyio>=4.5", "click>=8.2.0", "httpx>=0.27", "mcp", "starlette", "uvicorn"] +dependencies = ["anyio>=4.5", "click>=8.2.0", "httpx>=0.27", "mcp-python-sdk", "starlette", "uvicorn"] [project.scripts] mcp-everything-server = "mcp_everything_server.server:main" diff --git a/examples/servers/simple-auth/pyproject.toml b/examples/servers/simple-auth/pyproject.toml index eb2b18561b..e67b44e663 100644 --- a/examples/servers/simple-auth/pyproject.toml +++ b/examples/servers/simple-auth/pyproject.toml @@ -10,7 +10,7 @@ dependencies = [ "anyio>=4.5", "click>=8.2.0", "httpx>=0.27", - "mcp", + "mcp-python-sdk", "pydantic>=2.0", "pydantic-settings>=2.5.2", "sse-starlette>=1.6.1", diff --git a/examples/servers/simple-pagination/pyproject.toml b/examples/servers/simple-pagination/pyproject.toml index 14de502574..fdc2180d9e 100644 --- a/examples/servers/simple-pagination/pyproject.toml +++ b/examples/servers/simple-pagination/pyproject.toml @@ -18,7 +18,7 @@ classifiers = [ "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.10", ] -dependencies = ["anyio>=4.5", "click>=8.2.0", "httpx>=0.27", "mcp"] +dependencies = ["anyio>=4.5", "click>=8.2.0", "httpx>=0.27", "mcp-python-sdk"] [project.scripts] mcp-simple-pagination = "mcp_simple_pagination.server:main" diff --git a/examples/servers/simple-prompt/pyproject.toml b/examples/servers/simple-prompt/pyproject.toml index 28fe265746..adc7465184 100644 --- a/examples/servers/simple-prompt/pyproject.toml +++ b/examples/servers/simple-prompt/pyproject.toml @@ -18,7 +18,7 @@ classifiers = [ "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.10", ] -dependencies = ["anyio>=4.5", "click>=8.2.0", "httpx>=0.27", "mcp"] +dependencies = ["anyio>=4.5", "click>=8.2.0", "httpx>=0.27", "mcp-python-sdk"] [project.scripts] mcp-simple-prompt = "mcp_simple_prompt.server:main" diff --git a/examples/servers/simple-resource/pyproject.toml b/examples/servers/simple-resource/pyproject.toml index 14c2bd38cc..5e89a53e39 100644 --- a/examples/servers/simple-resource/pyproject.toml +++ b/examples/servers/simple-resource/pyproject.toml @@ -18,7 +18,7 @@ classifiers = [ "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.10", ] -dependencies = ["anyio>=4.5", "click>=8.2.0", "httpx>=0.27", "mcp"] +dependencies = ["anyio>=4.5", "click>=8.2.0", "httpx>=0.27", "mcp-python-sdk"] [project.scripts] mcp-simple-resource = "mcp_simple_resource.server:main" diff --git a/examples/servers/simple-streamablehttp-stateless/pyproject.toml b/examples/servers/simple-streamablehttp-stateless/pyproject.toml index 0e695695cb..f496b27fdd 100644 --- a/examples/servers/simple-streamablehttp-stateless/pyproject.toml +++ b/examples/servers/simple-streamablehttp-stateless/pyproject.toml @@ -7,7 +7,7 @@ requires-python = ">=3.10" authors = [{ name = "Anthropic, PBC." }] keywords = ["mcp", "llm", "automation", "web", "fetch", "http", "streamable", "stateless"] license = { text = "MIT" } -dependencies = ["anyio>=4.5", "click>=8.2.0", "httpx>=0.27", "mcp", "starlette", "uvicorn"] +dependencies = ["anyio>=4.5", "click>=8.2.0", "httpx>=0.27", "mcp-python-sdk", "starlette", "uvicorn"] [project.scripts] mcp-simple-streamablehttp-stateless = "mcp_simple_streamablehttp_stateless.server:main" diff --git a/examples/servers/simple-streamablehttp/pyproject.toml b/examples/servers/simple-streamablehttp/pyproject.toml index f0404fb7dd..17b9bcf286 100644 --- a/examples/servers/simple-streamablehttp/pyproject.toml +++ b/examples/servers/simple-streamablehttp/pyproject.toml @@ -7,7 +7,7 @@ requires-python = ">=3.10" authors = [{ name = "Anthropic, PBC." }] keywords = ["mcp", "llm", "automation", "web", "fetch", "http", "streamable"] license = { text = "MIT" } -dependencies = ["anyio>=4.5", "click>=8.2.0", "httpx>=0.27", "mcp", "starlette", "uvicorn"] +dependencies = ["anyio>=4.5", "click>=8.2.0", "httpx>=0.27", "mcp-python-sdk", "starlette", "uvicorn"] [project.scripts] mcp-simple-streamablehttp = "mcp_simple_streamablehttp.server:main" diff --git a/examples/servers/simple-tool/pyproject.toml b/examples/servers/simple-tool/pyproject.toml index c3944f3146..cfd3dc30b6 100644 --- a/examples/servers/simple-tool/pyproject.toml +++ b/examples/servers/simple-tool/pyproject.toml @@ -18,7 +18,7 @@ classifiers = [ "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.10", ] -dependencies = ["anyio>=4.5", "click>=8.2.0", "httpx>=0.27", "mcp"] +dependencies = ["anyio>=4.5", "click>=8.2.0", "httpx>=0.27", "mcp-python-sdk"] [project.scripts] mcp-simple-tool = "mcp_simple_tool.server:main" diff --git a/examples/servers/structured-output-lowlevel/pyproject.toml b/examples/servers/structured-output-lowlevel/pyproject.toml index 554efc6145..c290c7d794 100644 --- a/examples/servers/structured-output-lowlevel/pyproject.toml +++ b/examples/servers/structured-output-lowlevel/pyproject.toml @@ -3,4 +3,4 @@ name = "mcp-structured-output-lowlevel" version = "0.1.0" description = "Example of structured output with low-level MCP server" requires-python = ">=3.10" -dependencies = ["mcp"] +dependencies = ["mcp-python-sdk"] diff --git a/examples/snippets/pyproject.toml b/examples/snippets/pyproject.toml index 4e68846a09..22fc747a80 100644 --- a/examples/snippets/pyproject.toml +++ b/examples/snippets/pyproject.toml @@ -4,7 +4,7 @@ version = "0.1.0" description = "MCP Example Snippets" requires-python = ">=3.10" dependencies = [ - "mcp", + "mcp-python-sdk", ] [build-system] diff --git a/pyproject.toml b/pyproject.toml index 078a1dfdcb..98fa50477a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] -name = "mcp" -dynamic = ["version"] +name = "mcp-python-sdk" +version = "0.0.0" description = "Model Context Protocol SDK" readme = "README.md" requires-python = ">=3.10" @@ -40,20 +40,19 @@ dependencies = [ [project.optional-dependencies] rich = ["rich>=13.9.4"] -cli = ["typer>=0.16.0", "python-dotenv>=1.0.0"] -ws = ["websockets>=15.0.1"] [project.scripts] -mcp = "mcp.cli:app [cli]" +mcp = "mcp.cli:app" [tool.uv] default-groups = ["dev", "docs"] -required-version = ">=0.9.5" +required-version = ">=0.8.4" [dependency-groups] dev = [ "pyright>=1.1.400", "pytest>=8.3.4", + "pytest-cov>=6.2.1", "ruff>=0.8.5", "trio>=0.26.2", "pytest-flakefinder>=1.1.0", @@ -63,6 +62,9 @@ dev = [ "inline-snapshot>=0.23.0", "dirty-equals>=0.9.0", "coverage[toml]==7.10.7", + "typer>=0.16.0", + "python-dotenv>=1.0.0", + "websockets>=15.0.1", ] docs = [ "mkdocs>=1.6.1", @@ -141,15 +143,19 @@ max-statements = 102 # Default is 50 members = ["examples/clients/*", "examples/servers/*", "examples/snippets"] [tool.uv.sources] -mcp = { workspace = true } +mcp-python-sdk = { workspace = true } [tool.pytest.ini_options] log_cli = true +testpaths = ["tests/"] xfail_strict = true addopts = """ --color=yes --capture=fd --numprocesses auto + --cov=src/mcp + --cov-report=xml + --cov-report=term """ filterwarnings = [ "error", @@ -208,3 +214,10 @@ source = [ "/home/runner/work/python-sdk/python-sdk/src/", 'D:\a\python-sdk\python-sdk\src', ] + +[[tool.uv.index]] +name = "rd-ai-common-artifacts" +url = "https://pkgs.dev.azure.com/OutSystemsRD/d3b98e14-22a9-4c84-96ca-89f05dd57f01/_packaging/rd-ai-common-artifacts/pypi/simple/" +publish-url = "https://pkgs.dev.azure.com/OutSystemsRD/d3b98e14-22a9-4c84-96ca-89f05dd57f01/_packaging/rd-ai-common-artifacts/pypi/upload/" +explicit = true +authenticate = "always" \ No newline at end of file diff --git a/src/mcp/server/fastmcp/__init__.py b/src/mcp/server/fastmcp/__init__.py index a89902cfd7..40c59f12a2 100644 --- a/src/mcp/server/fastmcp/__init__.py +++ b/src/mcp/server/fastmcp/__init__.py @@ -7,5 +7,5 @@ from .server import Context, FastMCP from .utilities.types import Audio, Image -__version__ = version("mcp") +__version__ = version("mcp-python-sdk") __all__ = ["FastMCP", "Context", "Image", "Audio", "Icon"] diff --git a/uv.lock b/uv.lock index d1363aef41..4ca6afcf03 100644 --- a/uv.lock +++ b/uv.lock @@ -4,9 +4,9 @@ requires-python = ">=3.10" [manifest] members = [ - "mcp", "mcp-conformance-auth-client", "mcp-everything-server", + "mcp-python-sdk", "mcp-simple-auth", "mcp-simple-auth-client", "mcp-simple-chatbot", @@ -758,7 +758,74 @@ wheels = [ ] [[package]] -name = "mcp" +name = "mcp-conformance-auth-client" +version = "0.1.0" +source = { editable = "examples/clients/conformance-auth-client" } +dependencies = [ + { name = "httpx" }, + { name = "mcp-python-sdk" }, +] + +[package.dev-dependencies] +dev = [ + { name = "pyright" }, + { name = "pytest" }, + { name = "ruff" }, +] + +[package.metadata] +requires-dist = [ + { name = "httpx", specifier = ">=0.28.1" }, + { name = "mcp-python-sdk", editable = "." }, +] + +[package.metadata.requires-dev] +dev = [ + { name = "pyright", specifier = ">=1.1.379" }, + { name = "pytest", specifier = ">=8.3.3" }, + { name = "ruff", specifier = ">=0.6.9" }, +] + +[[package]] +name = "mcp-everything-server" +version = "0.1.0" +source = { editable = "examples/servers/everything-server" } +dependencies = [ + { name = "anyio" }, + { name = "click" }, + { name = "httpx" }, + { name = "mcp-python-sdk" }, + { name = "starlette" }, + { name = "uvicorn" }, +] + +[package.dev-dependencies] +dev = [ + { name = "pyright" }, + { name = "pytest" }, + { name = "ruff" }, +] + +[package.metadata] +requires-dist = [ + { name = "anyio", specifier = ">=4.5" }, + { name = "click", specifier = ">=8.2.0" }, + { name = "httpx", specifier = ">=0.27" }, + { name = "mcp-python-sdk", editable = "." }, + { name = "starlette" }, + { name = "uvicorn" }, +] + +[package.metadata.requires-dev] +dev = [ + { name = "pyright", specifier = ">=1.1.378" }, + { name = "pytest", specifier = ">=8.3.3" }, + { name = "ruff", specifier = ">=0.6.9" }, +] + +[[package]] +name = "mcp-python-sdk" +version = "0.0.0" source = { editable = "." } dependencies = [ { name = "anyio" }, @@ -778,16 +845,9 @@ dependencies = [ ] [package.optional-dependencies] -cli = [ - { name = "python-dotenv" }, - { name = "typer" }, -] rich = [ { name = "rich" }, ] -ws = [ - { name = "websockets" }, -] [package.dev-dependencies] dev = [ @@ -796,12 +856,16 @@ dev = [ { name = "inline-snapshot" }, { name = "pyright" }, { name = "pytest" }, + { name = "pytest-cov" }, { name = "pytest-examples" }, { name = "pytest-flakefinder" }, { name = "pytest-pretty" }, { name = "pytest-xdist" }, + { name = "python-dotenv" }, { name = "ruff" }, { name = "trio" }, + { name = "typer" }, + { name = "websockets" }, ] docs = [ { name = "mkdocs" }, @@ -819,19 +883,16 @@ requires-dist = [ { name = "pydantic", specifier = ">=2.11.0,<3.0.0" }, { name = "pydantic-settings", specifier = ">=2.5.2" }, { name = "pyjwt", extras = ["crypto"], specifier = ">=2.10.1" }, - { name = "python-dotenv", marker = "extra == 'cli'", specifier = ">=1.0.0" }, { name = "python-multipart", specifier = ">=0.0.9" }, { name = "pywin32", marker = "sys_platform == 'win32'", specifier = ">=310" }, { name = "rich", marker = "extra == 'rich'", specifier = ">=13.9.4" }, { name = "sse-starlette", specifier = ">=1.6.1" }, { name = "starlette", specifier = ">=0.27" }, - { name = "typer", marker = "extra == 'cli'", specifier = ">=0.16.0" }, { name = "typing-extensions", specifier = ">=4.9.0" }, { name = "typing-inspection", specifier = ">=0.4.1" }, { name = "uvicorn", marker = "sys_platform != 'emscripten'", specifier = ">=0.31.1" }, - { name = "websockets", marker = "extra == 'ws'", specifier = ">=15.0.1" }, ] -provides-extras = ["cli", "rich", "ws"] +provides-extras = ["rich"] [package.metadata.requires-dev] dev = [ @@ -840,12 +901,16 @@ dev = [ { name = "inline-snapshot", specifier = ">=0.23.0" }, { name = "pyright", specifier = ">=1.1.400" }, { name = "pytest", specifier = ">=8.3.4" }, + { name = "pytest-cov", specifier = ">=6.2.1" }, { name = "pytest-examples", specifier = ">=0.0.14" }, { name = "pytest-flakefinder", specifier = ">=1.1.0" }, { name = "pytest-pretty", specifier = ">=1.2.0" }, { name = "pytest-xdist", specifier = ">=3.6.1" }, + { name = "python-dotenv", specifier = ">=1.0.0" }, { name = "ruff", specifier = ">=0.8.5" }, { name = "trio", specifier = ">=0.26.2" }, + { name = "typer", specifier = ">=0.16.0" }, + { name = "websockets", specifier = ">=15.0.1" }, ] docs = [ { name = "mkdocs", specifier = ">=1.6.1" }, @@ -854,72 +919,6 @@ docs = [ { name = "mkdocstrings-python", specifier = ">=1.12.2" }, ] -[[package]] -name = "mcp-conformance-auth-client" -version = "0.1.0" -source = { editable = "examples/clients/conformance-auth-client" } -dependencies = [ - { name = "httpx" }, - { name = "mcp" }, -] - -[package.dev-dependencies] -dev = [ - { name = "pyright" }, - { name = "pytest" }, - { name = "ruff" }, -] - -[package.metadata] -requires-dist = [ - { name = "httpx", specifier = ">=0.28.1" }, - { name = "mcp", editable = "." }, -] - -[package.metadata.requires-dev] -dev = [ - { name = "pyright", specifier = ">=1.1.379" }, - { name = "pytest", specifier = ">=8.3.3" }, - { name = "ruff", specifier = ">=0.6.9" }, -] - -[[package]] -name = "mcp-everything-server" -version = "0.1.0" -source = { editable = "examples/servers/everything-server" } -dependencies = [ - { name = "anyio" }, - { name = "click" }, - { name = "httpx" }, - { name = "mcp" }, - { name = "starlette" }, - { name = "uvicorn" }, -] - -[package.dev-dependencies] -dev = [ - { name = "pyright" }, - { name = "pytest" }, - { name = "ruff" }, -] - -[package.metadata] -requires-dist = [ - { name = "anyio", specifier = ">=4.5" }, - { name = "click", specifier = ">=8.2.0" }, - { name = "httpx", specifier = ">=0.27" }, - { name = "mcp", editable = "." }, - { name = "starlette" }, - { name = "uvicorn" }, -] - -[package.metadata.requires-dev] -dev = [ - { name = "pyright", specifier = ">=1.1.378" }, - { name = "pytest", specifier = ">=8.3.3" }, - { name = "ruff", specifier = ">=0.6.9" }, -] - [[package]] name = "mcp-simple-auth" version = "0.1.0" @@ -928,7 +927,7 @@ dependencies = [ { name = "anyio" }, { name = "click" }, { name = "httpx" }, - { name = "mcp" }, + { name = "mcp-python-sdk" }, { name = "pydantic" }, { name = "pydantic-settings" }, { name = "sse-starlette" }, @@ -947,7 +946,7 @@ requires-dist = [ { name = "anyio", specifier = ">=4.5" }, { name = "click", specifier = ">=8.2.0" }, { name = "httpx", specifier = ">=0.27" }, - { name = "mcp", editable = "." }, + { name = "mcp-python-sdk", editable = "." }, { name = "pydantic", specifier = ">=2.0" }, { name = "pydantic-settings", specifier = ">=2.5.2" }, { name = "sse-starlette", specifier = ">=1.6.1" }, @@ -967,7 +966,7 @@ version = "0.1.0" source = { editable = "examples/clients/simple-auth-client" } dependencies = [ { name = "click" }, - { name = "mcp" }, + { name = "mcp-python-sdk" }, ] [package.dev-dependencies] @@ -980,7 +979,7 @@ dev = [ [package.metadata] requires-dist = [ { name = "click", specifier = ">=8.2.0" }, - { name = "mcp", editable = "." }, + { name = "mcp-python-sdk", editable = "." }, ] [package.metadata.requires-dev] @@ -995,7 +994,7 @@ name = "mcp-simple-chatbot" version = "0.1.0" source = { editable = "examples/clients/simple-chatbot" } dependencies = [ - { name = "mcp" }, + { name = "mcp-python-sdk" }, { name = "python-dotenv" }, { name = "requests" }, { name = "uvicorn" }, @@ -1010,7 +1009,7 @@ dev = [ [package.metadata] requires-dist = [ - { name = "mcp", editable = "." }, + { name = "mcp-python-sdk", editable = "." }, { name = "python-dotenv", specifier = ">=1.0.0" }, { name = "requests", specifier = ">=2.31.0" }, { name = "uvicorn", specifier = ">=0.32.1" }, @@ -1031,7 +1030,7 @@ dependencies = [ { name = "anyio" }, { name = "click" }, { name = "httpx" }, - { name = "mcp" }, + { name = "mcp-python-sdk" }, ] [package.dev-dependencies] @@ -1046,7 +1045,7 @@ requires-dist = [ { name = "anyio", specifier = ">=4.5" }, { name = "click", specifier = ">=8.2.0" }, { name = "httpx", specifier = ">=0.27" }, - { name = "mcp", editable = "." }, + { name = "mcp-python-sdk", editable = "." }, ] [package.metadata.requires-dev] @@ -1064,7 +1063,7 @@ dependencies = [ { name = "anyio" }, { name = "click" }, { name = "httpx" }, - { name = "mcp" }, + { name = "mcp-python-sdk" }, ] [package.dev-dependencies] @@ -1079,7 +1078,7 @@ requires-dist = [ { name = "anyio", specifier = ">=4.5" }, { name = "click", specifier = ">=8.2.0" }, { name = "httpx", specifier = ">=0.27" }, - { name = "mcp", editable = "." }, + { name = "mcp-python-sdk", editable = "." }, ] [package.metadata.requires-dev] @@ -1097,7 +1096,7 @@ dependencies = [ { name = "anyio" }, { name = "click" }, { name = "httpx" }, - { name = "mcp" }, + { name = "mcp-python-sdk" }, ] [package.dev-dependencies] @@ -1112,7 +1111,7 @@ requires-dist = [ { name = "anyio", specifier = ">=4.5" }, { name = "click", specifier = ">=8.2.0" }, { name = "httpx", specifier = ">=0.27" }, - { name = "mcp", editable = "." }, + { name = "mcp-python-sdk", editable = "." }, ] [package.metadata.requires-dev] @@ -1130,7 +1129,7 @@ dependencies = [ { name = "anyio" }, { name = "click" }, { name = "httpx" }, - { name = "mcp" }, + { name = "mcp-python-sdk" }, { name = "starlette" }, { name = "uvicorn" }, ] @@ -1147,7 +1146,7 @@ requires-dist = [ { name = "anyio", specifier = ">=4.5" }, { name = "click", specifier = ">=8.2.0" }, { name = "httpx", specifier = ">=0.27" }, - { name = "mcp", editable = "." }, + { name = "mcp-python-sdk", editable = "." }, { name = "starlette" }, { name = "uvicorn" }, ] @@ -1167,7 +1166,7 @@ dependencies = [ { name = "anyio" }, { name = "click" }, { name = "httpx" }, - { name = "mcp" }, + { name = "mcp-python-sdk" }, { name = "starlette" }, { name = "uvicorn" }, ] @@ -1184,7 +1183,7 @@ requires-dist = [ { name = "anyio", specifier = ">=4.5" }, { name = "click", specifier = ">=8.2.0" }, { name = "httpx", specifier = ">=0.27" }, - { name = "mcp", editable = "." }, + { name = "mcp-python-sdk", editable = "." }, { name = "starlette" }, { name = "uvicorn" }, ] @@ -1204,7 +1203,7 @@ dependencies = [ { name = "anyio" }, { name = "click" }, { name = "httpx" }, - { name = "mcp" }, + { name = "mcp-python-sdk" }, ] [package.dev-dependencies] @@ -1219,7 +1218,7 @@ requires-dist = [ { name = "anyio", specifier = ">=4.5" }, { name = "click", specifier = ">=8.2.0" }, { name = "httpx", specifier = ">=0.27" }, - { name = "mcp", editable = "." }, + { name = "mcp-python-sdk", editable = "." }, ] [package.metadata.requires-dev] @@ -1234,22 +1233,22 @@ name = "mcp-snippets" version = "0.1.0" source = { editable = "examples/snippets" } dependencies = [ - { name = "mcp" }, + { name = "mcp-python-sdk" }, ] [package.metadata] -requires-dist = [{ name = "mcp", editable = "." }] +requires-dist = [{ name = "mcp-python-sdk", editable = "." }] [[package]] name = "mcp-structured-output-lowlevel" version = "0.1.0" source = { virtual = "examples/servers/structured-output-lowlevel" } dependencies = [ - { name = "mcp" }, + { name = "mcp-python-sdk" }, ] [package.metadata] -requires-dist = [{ name = "mcp", editable = "." }] +requires-dist = [{ name = "mcp-python-sdk", editable = "." }] [[package]] name = "mdurl" @@ -1772,6 +1771,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79", size = 365750, upload-time = "2025-09-04T14:34:20.226Z" }, ] +[[package]] +name = "pytest-cov" +version = "7.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "coverage", extra = ["toml"] }, + { name = "pluggy" }, + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5e/f7/c933acc76f5208b3b00089573cf6a2bc26dc80a8aece8f52bb7d6b1855ca/pytest_cov-7.0.0.tar.gz", hash = "sha256:33c97eda2e049a0c5298e91f519302a1334c26ac65c1a483d6206fd458361af1", size = 54328, upload-time = "2025-09-09T10:57:02.113Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ee/49/1377b49de7d0c1ce41292161ea0f721913fa8722c19fb9c1e3aa0367eecb/pytest_cov-7.0.0-py3-none-any.whl", hash = "sha256:3b8e9558b16cc1479da72058bdecf8073661c7f57f7d3c5f22a1c23507f2d861", size = 22424, upload-time = "2025-09-09T10:57:00.695Z" }, +] + [[package]] name = "pytest-examples" version = "0.0.18"