devrev-Python-SDK 2.10.2__tar.gz → 2.11.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.augment/agents/bug-fixer.md +1 -1
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.augment/agents/builder.md +1 -1
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.augment/agents/documentation.md +1 -1
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.augment/agents/foreman.md +1 -1
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.augment/agents/pr-review-boss.md +1 -1
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.augment/agents/release-manager.md +1 -1
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.augment/agents/simplifier.md +1 -1
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.augment/agents/tester.md +1 -1
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.augment/commands/foreman-work.md +1 -1
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.augment/commands/release-prepare.md +1 -1
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.augment/commands/review-start.md +1 -1
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.augment/commands/simplify-code.md +1 -1
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/PKG-INFO +1 -1
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/mcp/tools-reference.md +8 -1
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/llms-mcp.txt +9 -2
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/pyproject.toml +1 -1
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/articles.py +11 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/articles.py +25 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/server.py +3 -2
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/tools/articles.py +36 -0
- devrev_python_sdk-2.11.0/src/devrev_mcp/tools/question_answers.py +151 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/mcp/conftest.py +8 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/mcp/test_tools_articles.py +170 -16
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/mcp/test_tools_parts.py +10 -0
- devrev_python_sdk-2.11.0/tests/unit/mcp/test_tools_question_answers.py +283 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/services/test_articles.py +83 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/uv.lock +1 -1
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.augment/rules/code-quality.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.augment/rules/data-modeling.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.augment/rules/devrev-sdk.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.augment/rules/git-workflow.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.augment/rules/pull-requests.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.augment/rules/python-development.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.augment/rules/security.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.augment/rules/testing.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.dockerignore +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.env.sample +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.github/ISSUE_TEMPLATE/article-artifact-simplification.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.github/ISSUE_TEMPLATE/question.yml +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.github/dependabot.yml +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.github/pull_request_template.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.github/workflows/api-check.yml +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.github/workflows/ci.yml +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.github/workflows/claude-code-review.yml +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.github/workflows/claude.yml +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.github/workflows/deploy.yml +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.github/workflows/docs.yml +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.github/workflows/integration-tests.yml +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.github/workflows/release.yml +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.github/workflows/sync-openapi.yml +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.gitignore +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/.pre-commit-config.yaml +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/CLAUDE.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/CODE_OF_CONDUCT.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/CONTRIBUTING.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/DEPRECATIONS.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/Dockerfile +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/KNOWN_ISSUES.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/OPENAPI_SPEC_DISCREPANCIES.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/README.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/SECURITY.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/augment-mcp-config-remote.json +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/augment-mcp-config.json +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/augment-settings.json +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/benchmarks/README.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/benchmarks/bench_http_client.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/benchmarks/bench_models.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/benchmarks/bench_pagination.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/benchmarks/conftest.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/context7.json +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/deploy/README.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/deploy/audit-logging-setup.sh +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/deploy/cloudbuild.yaml +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/deploy/monitoring/README.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/deploy/monitoring/alert-policies.yaml +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/deploy/monitoring/dashboard.json +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/deploy/monitoring/validate-config.sh +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/deploy/service.yaml +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docker-compose.yml +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/beta/brands.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/beta/engagements.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/beta/incidents.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/beta/index.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/beta/question-answers.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/beta/recommendations.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/beta/search.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/beta/uoms.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/beta-api-differences.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/client.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/config.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/exceptions.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/index.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/models/accounts.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/models/base.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/models/index.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/models/users.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/models/works.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/services/accounts.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/services/articles.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/services/code-changes.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/services/conversations.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/services/dev-users.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/services/groups.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/services/index.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/services/links.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/services/parts.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/services/rev-users.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/services/slas.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/services/tags.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/services/timeline-entries.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/services/webhooks.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/api/services/works.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/changelog.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/examples/advanced.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/examples/basic.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/examples/beta-features.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/examples/index.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/examples/integrations.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/getting-started/authentication.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/getting-started/index.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/getting-started/installation.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/getting-started/quickstart.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/guides/beta-api.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/guides/compatibility.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/guides/configuration.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/guides/error-handling.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/guides/github-actions-setup.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/guides/index.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/guides/logging.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/guides/pagination.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/guides/sync-vs-async.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/guides/testing.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/guides/version-support.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/guides/write-integration-testing-strategy.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/hooks/copy_llms.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/index.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/mcp/deployment.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/mcp/index.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/mcp/quickstart.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/docs/stylesheets/extra.css +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/examples/README.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/examples/basic/README.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/examples/basic/async_example.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/examples/basic/create_work.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/examples/basic/error_handling.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/examples/basic/list_accounts.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/examples/basic/pagination.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/examples/basic/search_users.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/examples/integrations/cloud_functions/README.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/examples/integrations/cloud_functions/main.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/examples/integrations/cloud_functions/requirements.txt +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/examples/integrations/fastapi/README.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/examples/integrations/fastapi/main.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/examples/integrations/fastapi/requirements.txt +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/examples/integrations/flask/README.md +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/examples/integrations/flask/app.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/examples/integrations/flask/requirements.txt +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/llms-ctx-full.txt +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/llms-ctx.txt +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/llms.txt +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/mkdocs.yml +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/openapi-beta.yaml +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/openapi-public.yaml +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/openapi-spec-corrections.yaml +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/scripts/build_ai_docs.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/scripts/debug_articles.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/scripts/setup-github-secrets.sh +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/__init__.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/client.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/config.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/exceptions.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/__init__.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/accounts.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/artifacts.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/base.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/brands.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/code_changes.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/conversations.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/dev_users.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/engagements.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/groups.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/incidents.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/links.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/notifications.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/parts.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/preferences.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/question_answers.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/recommendations.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/rev_users.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/search.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/slas.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/sync.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/tags.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/tasks.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/timeline_entries.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/timeline_events.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/track_events.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/uoms.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/webhooks.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/widgets.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/models/works.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/py.typed +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/__init__.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/accounts.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/artifacts.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/base.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/brands.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/code_changes.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/conversations.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/dev_users.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/engagements.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/groups.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/incidents.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/links.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/notifications.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/parts.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/preferences.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/question_answers.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/recommendations.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/rev_users.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/search.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/slas.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/tags.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/timeline_entries.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/track_events.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/uoms.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/webhooks.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/services/works.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/utils/__init__.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/utils/content_converter.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/utils/deprecation.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/utils/http.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/utils/logging.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev/utils/pagination.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/__init__.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/__main__.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/config.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/middleware/__init__.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/middleware/audit.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/middleware/auth.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/middleware/health.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/middleware/rate_limit.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/prompts/__init__.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/prompts/escalation.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/prompts/investigate.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/prompts/response.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/prompts/summarize.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/prompts/triage.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/resources/__init__.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/resources/account.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/resources/article.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/resources/conversation.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/resources/part.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/resources/server_info.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/resources/ticket.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/resources/user.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/tools/__init__.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/tools/accounts.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/tools/conversations.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/tools/engagements.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/tools/groups.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/tools/incidents.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/tools/links.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/tools/parts.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/tools/recommendations.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/tools/search.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/tools/server_info.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/tools/slas.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/tools/tags.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/tools/timeline.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/tools/users.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/tools/works.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/utils/__init__.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/utils/errors.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/utils/formatting.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/src/devrev_mcp/utils/pagination.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/__init__.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/conftest.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/integration/__init__.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/integration/conftest.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/integration/test_accounts_e2e.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/integration/test_all_readonly_endpoints.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/integration/test_articles_lifecycle.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/integration/test_backwards_compatibility.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/integration/test_contacts_e2e.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/integration/test_core_services_phase1.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/integration/test_extended_services_phase2.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/integration/test_get_endpoints.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/integration/test_issues_e2e.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/integration/test_kb_articles_e2e.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/integration/test_mcp_articles.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/integration/test_ping.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/integration/test_question_answers_e2e.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/integration/test_readonly_endpoints.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/integration/test_specialized_services_phase3.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/integration/test_tickets_e2e.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/integration/test_write_operations.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/integration/utils/__init__.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/integration/utils/cleanup.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/integration/utils/constants.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/integration/utils/data_manager.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/performance/__init__.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/performance/test_articles_performance.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/__init__.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/mcp/__init__.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/mcp/test_audit.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/mcp/test_config.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/mcp/test_phase4_transport.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/mcp/test_prompts.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/mcp/test_resources.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/mcp/test_server_info.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/mcp/test_tools_accounts.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/mcp/test_tools_conversations.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/mcp/test_tools_engagements.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/mcp/test_tools_groups.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/mcp/test_tools_incidents.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/mcp/test_tools_links.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/mcp/test_tools_recommendations.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/mcp/test_tools_search.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/mcp/test_tools_slas.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/mcp/test_tools_tags.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/mcp/test_tools_timeline.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/mcp/test_tools_users.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/mcp/test_tools_works.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/mcp/test_utils.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/models/__init__.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/models/test_user_state_regression.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/services/__init__.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/services/conftest.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/services/test_async_services.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/services/test_brands.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/services/test_code_changes.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/services/test_conversations.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/services/test_engagements.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/services/test_groups.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/services/test_incidents.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/services/test_links.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/services/test_notifications.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/services/test_parts.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/services/test_preferences.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/services/test_question_answers.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/services/test_recommendations.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/services/test_search.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/services/test_slas.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/services/test_tags.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/services/test_timeline_entries.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/services/test_track_events.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/services/test_uoms.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/services/test_webhooks.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/services/test_works.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/test_articles_unified.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/test_artifacts.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/test_backward_compatibility.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/test_base_service.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/test_client.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/test_config.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/test_content_converter.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/test_deprecation.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/test_error_handling.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/test_exceptions.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/test_http.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/test_logging.py +0 -0
- {devrev_python_sdk-2.10.2 → devrev_python_sdk-2.11.0}/tests/unit/test_pagination.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: devrev-Python-SDK
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.11.0
|
|
4
4
|
Summary: A modern, type-safe Python SDK for the DevRev API
|
|
5
5
|
Project-URL: Homepage, https://github.com/mgmonteleone/py-dev-rev
|
|
6
6
|
Project-URL: Documentation, https://github.com/mgmonteleone/py-dev-rev
|
|
@@ -6,7 +6,7 @@ icon: material/tools
|
|
|
6
6
|
|
|
7
7
|
Complete reference of all MCP capabilities provided by the DevRev MCP Server.
|
|
8
8
|
|
|
9
|
-
## Tools (
|
|
9
|
+
## Tools (83+)
|
|
10
10
|
|
|
11
11
|
Tools are the primary way AI assistants interact with DevRev. Each tool maps to one or more DevRev API endpoints.
|
|
12
12
|
|
|
@@ -139,6 +139,13 @@ Tools are the primary way AI assistants interact with DevRev. Each tool maps to
|
|
|
139
139
|
| `devrev_incidents_get` | Get incident details |
|
|
140
140
|
| `devrev_engagements_list` | List customer engagements |
|
|
141
141
|
| `devrev_engagements_get` | Get engagement details |
|
|
142
|
+
| `devrev_question_answers_list` | List question-answer entries |
|
|
143
|
+
| `devrev_question_answers_get` | Get a question-answer by ID |
|
|
144
|
+
| `devrev_question_answers_create` | Create a new Q&A entry ¹ |
|
|
145
|
+
| `devrev_question_answers_update` | Update a Q&A entry ¹ |
|
|
146
|
+
| `devrev_question_answers_delete` | Delete a Q&A entry ¹ |
|
|
147
|
+
|
|
148
|
+
¹ Also requires `MCP_ENABLE_DESTRUCTIVE_TOOLS=true`
|
|
142
149
|
|
|
143
150
|
---
|
|
144
151
|
|
|
@@ -163,6 +163,13 @@ devrev-mcp-server
|
|
|
163
163
|
- `devrev_incidents_list` — List incidents
|
|
164
164
|
- `devrev_incidents_get` — Get incident by ID
|
|
165
165
|
|
|
166
|
+
### Question Answers (Beta)
|
|
167
|
+
- `devrev_question_answers_list` — List Q&A entries
|
|
168
|
+
- `devrev_question_answers_get` — Get Q&A by ID
|
|
169
|
+
- `devrev_question_answers_create` — Create a new Q&A entry (destructive)
|
|
170
|
+
- `devrev_question_answers_update` — Update a Q&A entry (destructive)
|
|
171
|
+
- `devrev_question_answers_delete` — Delete a Q&A entry (destructive)
|
|
172
|
+
|
|
166
173
|
### Search (Beta)
|
|
167
174
|
- `devrev_search` — Hybrid search across DevRev objects
|
|
168
175
|
|
|
@@ -202,8 +209,8 @@ Pre-built workflow prompts for common support operations:
|
|
|
202
209
|
1. **IDs are DON format**: `don:core:dvrv-us-1:devo/1:ticket/123`
|
|
203
210
|
2. **Pagination**: Cursor-based using `cursor` and `limit` parameters
|
|
204
211
|
3. **Creating tickets**: Requires `type` (ticket/issue), `title`, and `applies_to_part`
|
|
205
|
-
4. **Beta tools**: Require `MCP_ENABLE_BETA_TOOLS=true` (search, recommendations, incidents, engagements)
|
|
206
|
-
5. **Destructive tools**: Require `MCP_ENABLE_DESTRUCTIVE_TOOLS=true` (delete operations)
|
|
212
|
+
4. **Beta tools**: Require `MCP_ENABLE_BETA_TOOLS=true` (search, recommendations, incidents, engagements, question answers)
|
|
213
|
+
5. **Destructive tools**: Require `MCP_ENABLE_DESTRUCTIVE_TOOLS=true` (create/update/delete operations)
|
|
207
214
|
6. **Auth for teams**: Use `MCP_AUTH_MODE=devrev-pat` — each user sends their own DevRev PAT as Bearer token
|
|
208
215
|
7. **Transports**: stdio for local dev, streamable-http for production, sse for legacy
|
|
209
216
|
|
|
@@ -328,6 +328,14 @@ class ArticlesUpdateRequestTags(DevRevBaseModel):
|
|
|
328
328
|
set: list[SetTagWithValue] | None = Field(default=None, description="Set tags")
|
|
329
329
|
|
|
330
330
|
|
|
331
|
+
class ArticlesUpdateRequestSharedWith(DevRevBaseModel):
|
|
332
|
+
"""Shared-with update for articles."""
|
|
333
|
+
|
|
334
|
+
set: list[SetSharedWithMembership] | None = Field(
|
|
335
|
+
default=None, description="Set shared-with memberships"
|
|
336
|
+
)
|
|
337
|
+
|
|
338
|
+
|
|
331
339
|
class ArticlesUpdateRequest(DevRevBaseModel):
|
|
332
340
|
"""Request to update an article."""
|
|
333
341
|
|
|
@@ -357,6 +365,9 @@ class ArticlesUpdateRequest(DevRevBaseModel):
|
|
|
357
365
|
parent: str | None = Field(default=None, description="New parent article ID")
|
|
358
366
|
published_version: str | None = Field(default=None, description="Published version")
|
|
359
367
|
release_notes: str | None = Field(default=None, description="New release notes")
|
|
368
|
+
shared_with: ArticlesUpdateRequestSharedWith | None = Field(
|
|
369
|
+
default=None, description="New shared-with memberships"
|
|
370
|
+
)
|
|
360
371
|
artifacts: dict[str, Any] | None = Field(
|
|
361
372
|
default=None,
|
|
362
373
|
description="Artifacts update using set wrapper, e.g. {'set': ['artifact_id']}",
|
|
@@ -23,10 +23,12 @@ from devrev.models.articles import (
|
|
|
23
23
|
ArticleStatus,
|
|
24
24
|
ArticlesUpdateRequest,
|
|
25
25
|
ArticlesUpdateRequestAppliesToParts,
|
|
26
|
+
ArticlesUpdateRequestSharedWith,
|
|
26
27
|
ArticlesUpdateRequestTags,
|
|
27
28
|
ArticlesUpdateResponse,
|
|
28
29
|
ArticleType,
|
|
29
30
|
ArticleWithContent,
|
|
31
|
+
SetSharedWithMembership,
|
|
30
32
|
)
|
|
31
33
|
from devrev.models.artifacts import (
|
|
32
34
|
ArtifactPrepareRequest,
|
|
@@ -205,6 +207,7 @@ class ArticlesService(BaseService):
|
|
|
205
207
|
article_type: str | None = None,
|
|
206
208
|
language: str | None = None,
|
|
207
209
|
authored_by: builtins.list[str] | None = None,
|
|
210
|
+
shared_with: builtins.list[SetSharedWithMembership] | None = None,
|
|
208
211
|
) -> Article:
|
|
209
212
|
"""Create an article with content in a single operation.
|
|
210
213
|
|
|
@@ -230,6 +233,7 @@ class ArticlesService(BaseService):
|
|
|
230
233
|
article_type: Optional article type ('article', 'page', 'content_block')
|
|
231
234
|
language: Optional language code (e.g., 'en')
|
|
232
235
|
authored_by: Optional list of user IDs who author the article
|
|
236
|
+
shared_with: Optional list of shared-with memberships
|
|
233
237
|
|
|
234
238
|
Returns:
|
|
235
239
|
Created article
|
|
@@ -292,6 +296,7 @@ class ArticlesService(BaseService):
|
|
|
292
296
|
article_type=article_type,
|
|
293
297
|
language=language,
|
|
294
298
|
authored_by=authored_by,
|
|
299
|
+
shared_with=shared_with,
|
|
295
300
|
)
|
|
296
301
|
return self.create(article_req)
|
|
297
302
|
|
|
@@ -454,6 +459,7 @@ class ArticlesService(BaseService):
|
|
|
454
459
|
access_level: ArticleAccessLevel | None = None,
|
|
455
460
|
tags: builtins.list[SetTagWithValue] | None = None,
|
|
456
461
|
language: str | None = None,
|
|
462
|
+
shared_with: builtins.list[SetSharedWithMembership] | None = None,
|
|
457
463
|
) -> Article:
|
|
458
464
|
"""Update article metadata and/or content.
|
|
459
465
|
|
|
@@ -472,6 +478,7 @@ class ArticlesService(BaseService):
|
|
|
472
478
|
access_level: Optional access level (internal, external, private, public)
|
|
473
479
|
tags: Optional list of tags to apply (list of SetTagWithValue objects)
|
|
474
480
|
language: Optional language code (e.g., 'en')
|
|
481
|
+
shared_with: Optional list of shared-with memberships
|
|
475
482
|
|
|
476
483
|
Returns:
|
|
477
484
|
Updated article
|
|
@@ -532,6 +539,11 @@ class ArticlesService(BaseService):
|
|
|
532
539
|
if tags is not None:
|
|
533
540
|
tags_req = ArticlesUpdateRequestTags(set=tags)
|
|
534
541
|
|
|
542
|
+
# Build shared_with wrapper if provided
|
|
543
|
+
shared_with_req = None
|
|
544
|
+
if shared_with is not None:
|
|
545
|
+
shared_with_req = ArticlesUpdateRequestSharedWith(set=shared_with)
|
|
546
|
+
|
|
535
547
|
# Update metadata if any metadata fields provided
|
|
536
548
|
has_metadata = (
|
|
537
549
|
title is not None
|
|
@@ -541,6 +553,7 @@ class ArticlesService(BaseService):
|
|
|
541
553
|
or access_level is not None
|
|
542
554
|
or tags is not None
|
|
543
555
|
or language is not None
|
|
556
|
+
or shared_with is not None
|
|
544
557
|
)
|
|
545
558
|
if has_metadata:
|
|
546
559
|
update_req = ArticlesUpdateRequest(
|
|
@@ -552,6 +565,7 @@ class ArticlesService(BaseService):
|
|
|
552
565
|
access_level=access_level,
|
|
553
566
|
tags=tags_req,
|
|
554
567
|
language=language,
|
|
568
|
+
shared_with=shared_with_req,
|
|
555
569
|
)
|
|
556
570
|
return self.update(update_req)
|
|
557
571
|
|
|
@@ -665,6 +679,7 @@ class AsyncArticlesService(AsyncBaseService):
|
|
|
665
679
|
article_type: str | None = None,
|
|
666
680
|
language: str | None = None,
|
|
667
681
|
authored_by: builtins.list[str] | None = None,
|
|
682
|
+
shared_with: builtins.list[SetSharedWithMembership] | None = None,
|
|
668
683
|
) -> Article:
|
|
669
684
|
"""Create an article with content in a single operation (async).
|
|
670
685
|
|
|
@@ -740,6 +755,7 @@ class AsyncArticlesService(AsyncBaseService):
|
|
|
740
755
|
article_type=article_type,
|
|
741
756
|
language=language,
|
|
742
757
|
authored_by=authored_by,
|
|
758
|
+
shared_with=shared_with,
|
|
743
759
|
)
|
|
744
760
|
return await self.create(article_req)
|
|
745
761
|
|
|
@@ -891,6 +907,7 @@ class AsyncArticlesService(AsyncBaseService):
|
|
|
891
907
|
access_level: ArticleAccessLevel | None = None,
|
|
892
908
|
tags: builtins.list[SetTagWithValue] | None = None,
|
|
893
909
|
language: str | None = None,
|
|
910
|
+
shared_with: builtins.list[SetSharedWithMembership] | None = None,
|
|
894
911
|
) -> Article:
|
|
895
912
|
"""Update article metadata and/or content (async).
|
|
896
913
|
|
|
@@ -909,6 +926,7 @@ class AsyncArticlesService(AsyncBaseService):
|
|
|
909
926
|
access_level: Optional access level (internal, external, private, public)
|
|
910
927
|
tags: Optional list of tags to apply (list of SetTagWithValue objects)
|
|
911
928
|
language: Optional language code (e.g., 'en')
|
|
929
|
+
shared_with: Optional list of shared-with memberships
|
|
912
930
|
|
|
913
931
|
Returns:
|
|
914
932
|
Updated article
|
|
@@ -936,6 +954,11 @@ class AsyncArticlesService(AsyncBaseService):
|
|
|
936
954
|
if tags is not None:
|
|
937
955
|
tags_req = ArticlesUpdateRequestTags(set=tags)
|
|
938
956
|
|
|
957
|
+
# Build shared_with wrapper if provided
|
|
958
|
+
shared_with_req = None
|
|
959
|
+
if shared_with is not None:
|
|
960
|
+
shared_with_req = ArticlesUpdateRequestSharedWith(set=shared_with)
|
|
961
|
+
|
|
939
962
|
# Update metadata if any metadata fields provided
|
|
940
963
|
has_metadata = (
|
|
941
964
|
title is not None
|
|
@@ -945,6 +968,7 @@ class AsyncArticlesService(AsyncBaseService):
|
|
|
945
968
|
or access_level is not None
|
|
946
969
|
or tags is not None
|
|
947
970
|
or language is not None
|
|
971
|
+
or shared_with is not None
|
|
948
972
|
)
|
|
949
973
|
if has_metadata:
|
|
950
974
|
update_req = ArticlesUpdateRequest(
|
|
@@ -956,6 +980,7 @@ class AsyncArticlesService(AsyncBaseService):
|
|
|
956
980
|
access_level=access_level,
|
|
957
981
|
tags=tags_req,
|
|
958
982
|
language=language,
|
|
983
|
+
shared_with=shared_with_req,
|
|
959
984
|
)
|
|
960
985
|
return await self.update(update_req)
|
|
961
986
|
|
|
@@ -232,9 +232,9 @@ if _config.transport != "stdio":
|
|
|
232
232
|
# before any tool modules are imported, otherwise tool registration could
|
|
233
233
|
# interact with an incompletely configured server.
|
|
234
234
|
#
|
|
235
|
-
#
|
|
235
|
+
# Core tool modules are always imported. Each module internally guards
|
|
236
236
|
# destructive tools (create/update/delete) using `_config.enable_destructive_tools`.
|
|
237
|
-
# Beta
|
|
237
|
+
# Beta tool modules are conditionally imported below when `_config.enable_beta_tools` is enabled.
|
|
238
238
|
from devrev_mcp.tools import accounts as _accounts_tools # noqa: E402, F401
|
|
239
239
|
from devrev_mcp.tools import articles as _articles_tools # noqa: E402, F401
|
|
240
240
|
from devrev_mcp.tools import conversations as _conversations_tools # noqa: E402, F401
|
|
@@ -252,6 +252,7 @@ from devrev_mcp.tools import works as _works_tools # noqa: E402, F401
|
|
|
252
252
|
|
|
253
253
|
# Beta tools (only if beta tools are enabled)
|
|
254
254
|
if _config.enable_beta_tools:
|
|
255
|
+
from devrev_mcp.tools import question_answers as _question_answers_tools # noqa: E402, F401
|
|
255
256
|
from devrev_mcp.tools import recommendations as _recommendations_tools # noqa: E402, F401
|
|
256
257
|
from devrev_mcp.tools import search as _search_tools # noqa: E402, F401
|
|
257
258
|
|
|
@@ -17,6 +17,7 @@ from devrev.models.articles import (
|
|
|
17
17
|
ArticlesGetRequest,
|
|
18
18
|
ArticlesListRequest,
|
|
19
19
|
ArticleStatus,
|
|
20
|
+
SetSharedWithMembership,
|
|
20
21
|
)
|
|
21
22
|
from devrev.models.base import SetTagWithValue
|
|
22
23
|
from devrev_mcp.server import _config, mcp
|
|
@@ -111,6 +112,7 @@ if _config.enable_destructive_tools:
|
|
|
111
112
|
tags: list[str] | None = None,
|
|
112
113
|
language: str | None = None,
|
|
113
114
|
authored_by: list[str] | None = None,
|
|
115
|
+
shared_with: list[dict[str, str]] | None = None,
|
|
114
116
|
) -> dict[str, Any]:
|
|
115
117
|
"""Create a new article with content.
|
|
116
118
|
|
|
@@ -129,6 +131,7 @@ if _config.enable_destructive_tools:
|
|
|
129
131
|
tags: Optional list of tag IDs to apply to the article.
|
|
130
132
|
language: Optional language code (e.g., 'en').
|
|
131
133
|
authored_by: Optional list of user IDs who author the article.
|
|
134
|
+
shared_with: Optional list of dicts with 'member' (required) and 'role' (optional).
|
|
132
135
|
|
|
133
136
|
Returns:
|
|
134
137
|
Dictionary containing the created article details.
|
|
@@ -164,6 +167,20 @@ if _config.enable_destructive_tools:
|
|
|
164
167
|
[SetTagWithValue(id=tag_id) for tag_id in tags] if tags is not None else None
|
|
165
168
|
)
|
|
166
169
|
|
|
170
|
+
# Convert shared_with dicts to SetSharedWithMembership objects
|
|
171
|
+
shared_with_list: list[SetSharedWithMembership] | None = None
|
|
172
|
+
if shared_with is not None:
|
|
173
|
+
for entry in shared_with:
|
|
174
|
+
if not isinstance(entry, dict) or "member" not in entry:
|
|
175
|
+
raise RuntimeError(
|
|
176
|
+
"Each shared_with entry must be a dict containing "
|
|
177
|
+
"a 'member' key (and optional 'role' key)."
|
|
178
|
+
)
|
|
179
|
+
shared_with_list = [
|
|
180
|
+
SetSharedWithMembership(member=m["member"], role=m.get("role"))
|
|
181
|
+
for m in shared_with
|
|
182
|
+
]
|
|
183
|
+
|
|
167
184
|
article = await app.get_client().articles.create_with_content(
|
|
168
185
|
title=title,
|
|
169
186
|
content=content,
|
|
@@ -177,6 +194,7 @@ if _config.enable_destructive_tools:
|
|
|
177
194
|
tags=tags_list,
|
|
178
195
|
language=language,
|
|
179
196
|
authored_by=authored_by,
|
|
197
|
+
shared_with=shared_with_list,
|
|
180
198
|
)
|
|
181
199
|
return serialize_model(article)
|
|
182
200
|
except DevRevError as e:
|
|
@@ -194,6 +212,7 @@ if _config.enable_destructive_tools:
|
|
|
194
212
|
access_level: str | None = None,
|
|
195
213
|
tags: list[str] | None = None,
|
|
196
214
|
language: str | None = None,
|
|
215
|
+
shared_with: list[dict[str, str]] | None = None,
|
|
197
216
|
) -> dict[str, Any]:
|
|
198
217
|
"""Update an existing article in DevRev.
|
|
199
218
|
|
|
@@ -213,6 +232,8 @@ if _config.enable_destructive_tools:
|
|
|
213
232
|
tags: Optional list of tag IDs to apply to the article.
|
|
214
233
|
Pass an empty list to remove all tags.
|
|
215
234
|
language: Optional language code (e.g., 'en').
|
|
235
|
+
shared_with: Optional list of dicts with 'member' (required) and 'role' (optional).
|
|
236
|
+
Pass an empty list to remove all sharing.
|
|
216
237
|
|
|
217
238
|
Returns:
|
|
218
239
|
Dictionary containing the updated article details.
|
|
@@ -248,6 +269,20 @@ if _config.enable_destructive_tools:
|
|
|
248
269
|
[SetTagWithValue(id=tag_id) for tag_id in tags] if tags is not None else None
|
|
249
270
|
)
|
|
250
271
|
|
|
272
|
+
# Convert shared_with dicts to SetSharedWithMembership objects
|
|
273
|
+
shared_with_list: list[SetSharedWithMembership] | None = None
|
|
274
|
+
if shared_with is not None:
|
|
275
|
+
for entry in shared_with:
|
|
276
|
+
if not isinstance(entry, dict) or "member" not in entry:
|
|
277
|
+
raise RuntimeError(
|
|
278
|
+
"Each shared_with entry must be a dict containing "
|
|
279
|
+
"a 'member' key (and optional 'role' key)."
|
|
280
|
+
)
|
|
281
|
+
shared_with_list = [
|
|
282
|
+
SetSharedWithMembership(member=m["member"], role=m.get("role"))
|
|
283
|
+
for m in shared_with
|
|
284
|
+
]
|
|
285
|
+
|
|
251
286
|
article = await app.get_client().articles.update_with_content(
|
|
252
287
|
id=id,
|
|
253
288
|
title=title,
|
|
@@ -258,6 +293,7 @@ if _config.enable_destructive_tools:
|
|
|
258
293
|
access_level=article_access_level,
|
|
259
294
|
tags=tags_list,
|
|
260
295
|
language=language,
|
|
296
|
+
shared_with=shared_with_list,
|
|
261
297
|
)
|
|
262
298
|
return serialize_model(article)
|
|
263
299
|
except DevRevError as e:
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
"""MCP tools for DevRev question-answer operations (beta API)."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
from typing import Any
|
|
7
|
+
|
|
8
|
+
from mcp.server.fastmcp import Context
|
|
9
|
+
|
|
10
|
+
from devrev.exceptions import DevRevError
|
|
11
|
+
from devrev.models.question_answers import (
|
|
12
|
+
QuestionAnswersCreateRequest,
|
|
13
|
+
QuestionAnswersDeleteRequest,
|
|
14
|
+
QuestionAnswersGetRequest,
|
|
15
|
+
QuestionAnswersListRequest,
|
|
16
|
+
QuestionAnswersUpdateRequest,
|
|
17
|
+
)
|
|
18
|
+
from devrev_mcp.server import _config, mcp
|
|
19
|
+
from devrev_mcp.utils.errors import format_devrev_error
|
|
20
|
+
from devrev_mcp.utils.formatting import serialize_model, serialize_models
|
|
21
|
+
from devrev_mcp.utils.pagination import clamp_page_size, paginated_response
|
|
22
|
+
|
|
23
|
+
logger = logging.getLogger(__name__)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
@mcp.tool()
|
|
27
|
+
async def devrev_question_answers_list(
|
|
28
|
+
ctx: Context[Any, Any, Any],
|
|
29
|
+
cursor: str | None = None,
|
|
30
|
+
limit: int | None = None,
|
|
31
|
+
) -> dict[str, Any]:
|
|
32
|
+
"""List DevRev question answers.
|
|
33
|
+
|
|
34
|
+
Args:
|
|
35
|
+
cursor: Pagination cursor from a previous response.
|
|
36
|
+
limit: Maximum number of items to return (default: 25, max: 100).
|
|
37
|
+
"""
|
|
38
|
+
app = ctx.request_context.lifespan_context
|
|
39
|
+
try:
|
|
40
|
+
request = QuestionAnswersListRequest(
|
|
41
|
+
cursor=cursor,
|
|
42
|
+
limit=clamp_page_size(
|
|
43
|
+
limit, default=app.config.default_page_size, maximum=app.config.max_page_size
|
|
44
|
+
),
|
|
45
|
+
)
|
|
46
|
+
response = await app.get_client().question_answers.list(request)
|
|
47
|
+
items = serialize_models(response.question_answers)
|
|
48
|
+
return paginated_response(
|
|
49
|
+
items, next_cursor=response.next_cursor, total_label="question_answers"
|
|
50
|
+
)
|
|
51
|
+
except DevRevError as e:
|
|
52
|
+
raise RuntimeError(format_devrev_error(e)) from e
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
@mcp.tool()
|
|
56
|
+
async def devrev_question_answers_get(
|
|
57
|
+
ctx: Context[Any, Any, Any],
|
|
58
|
+
id: str,
|
|
59
|
+
) -> dict[str, Any]:
|
|
60
|
+
"""Get a DevRev question answer by ID.
|
|
61
|
+
|
|
62
|
+
Args:
|
|
63
|
+
id: The question answer ID.
|
|
64
|
+
"""
|
|
65
|
+
app = ctx.request_context.lifespan_context
|
|
66
|
+
try:
|
|
67
|
+
request = QuestionAnswersGetRequest(id=id)
|
|
68
|
+
qa = await app.get_client().question_answers.get(request)
|
|
69
|
+
return serialize_model(qa)
|
|
70
|
+
except DevRevError as e:
|
|
71
|
+
raise RuntimeError(format_devrev_error(e)) from e
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
# Destructive tools (only registered when enabled)
|
|
75
|
+
if _config.enable_destructive_tools:
|
|
76
|
+
|
|
77
|
+
@mcp.tool()
|
|
78
|
+
async def devrev_question_answers_create(
|
|
79
|
+
ctx: Context[Any, Any, Any],
|
|
80
|
+
question: str,
|
|
81
|
+
answer: str,
|
|
82
|
+
applies_to_parts: list[str],
|
|
83
|
+
owned_by: list[str],
|
|
84
|
+
status: str | None = None,
|
|
85
|
+
) -> dict[str, Any]:
|
|
86
|
+
"""Create a new DevRev question answer.
|
|
87
|
+
|
|
88
|
+
Args:
|
|
89
|
+
question: The question text.
|
|
90
|
+
answer: The answer text.
|
|
91
|
+
applies_to_parts: List of part IDs this Q&A applies to.
|
|
92
|
+
owned_by: List of dev user IDs who own this Q&A.
|
|
93
|
+
status: Optional status (draft, published). Defaults to draft.
|
|
94
|
+
"""
|
|
95
|
+
app = ctx.request_context.lifespan_context
|
|
96
|
+
try:
|
|
97
|
+
kwargs: dict[str, Any] = {
|
|
98
|
+
"question": question,
|
|
99
|
+
"answer": answer,
|
|
100
|
+
"applies_to_parts": applies_to_parts,
|
|
101
|
+
"owned_by": owned_by,
|
|
102
|
+
}
|
|
103
|
+
if status is not None:
|
|
104
|
+
kwargs["status"] = status
|
|
105
|
+
request = QuestionAnswersCreateRequest(**kwargs)
|
|
106
|
+
qa = await app.get_client().question_answers.create(request)
|
|
107
|
+
return serialize_model(qa)
|
|
108
|
+
except DevRevError as e:
|
|
109
|
+
raise RuntimeError(format_devrev_error(e)) from e
|
|
110
|
+
|
|
111
|
+
@mcp.tool()
|
|
112
|
+
async def devrev_question_answers_update(
|
|
113
|
+
ctx: Context[Any, Any, Any],
|
|
114
|
+
id: str,
|
|
115
|
+
question: str | None = None,
|
|
116
|
+
answer: str | None = None,
|
|
117
|
+
) -> dict[str, Any]:
|
|
118
|
+
"""Update an existing DevRev question answer.
|
|
119
|
+
|
|
120
|
+
Only provided fields will be updated; others remain unchanged.
|
|
121
|
+
|
|
122
|
+
Args:
|
|
123
|
+
id: The question answer ID to update.
|
|
124
|
+
question: New question text.
|
|
125
|
+
answer: New answer text.
|
|
126
|
+
"""
|
|
127
|
+
app = ctx.request_context.lifespan_context
|
|
128
|
+
try:
|
|
129
|
+
request = QuestionAnswersUpdateRequest(id=id, question=question, answer=answer)
|
|
130
|
+
qa = await app.get_client().question_answers.update(request)
|
|
131
|
+
return serialize_model(qa)
|
|
132
|
+
except DevRevError as e:
|
|
133
|
+
raise RuntimeError(format_devrev_error(e)) from e
|
|
134
|
+
|
|
135
|
+
@mcp.tool()
|
|
136
|
+
async def devrev_question_answers_delete(
|
|
137
|
+
ctx: Context[Any, Any, Any],
|
|
138
|
+
id: str,
|
|
139
|
+
) -> dict[str, Any]:
|
|
140
|
+
"""Delete a DevRev question answer.
|
|
141
|
+
|
|
142
|
+
Args:
|
|
143
|
+
id: The question answer ID to delete.
|
|
144
|
+
"""
|
|
145
|
+
app = ctx.request_context.lifespan_context
|
|
146
|
+
try:
|
|
147
|
+
request = QuestionAnswersDeleteRequest(id=id)
|
|
148
|
+
await app.get_client().question_answers.delete(request)
|
|
149
|
+
return {"deleted": True, "id": id}
|
|
150
|
+
except DevRevError as e:
|
|
151
|
+
raise RuntimeError(format_devrev_error(e)) from e
|
|
@@ -175,6 +175,14 @@ def mock_client():
|
|
|
175
175
|
client.slas.update = AsyncMock()
|
|
176
176
|
client.slas.transition = AsyncMock()
|
|
177
177
|
|
|
178
|
+
# Question Answers service
|
|
179
|
+
client.question_answers = AsyncMock()
|
|
180
|
+
client.question_answers.list = AsyncMock()
|
|
181
|
+
client.question_answers.get = AsyncMock()
|
|
182
|
+
client.question_answers.create = AsyncMock()
|
|
183
|
+
client.question_answers.update = AsyncMock()
|
|
184
|
+
client.question_answers.delete = AsyncMock()
|
|
185
|
+
|
|
178
186
|
# Close method
|
|
179
187
|
client.close = AsyncMock()
|
|
180
188
|
|