diff --git a/Makefile b/Makefile index 1b9467ee..2146d79d 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -SUBDIRS := $(filter-out src/dbtools-mcp-server src/mysql-mcp-server src/oci-pricing-mcp-server src/oracle-db-doc-mcp-server,$(wildcard src/*)) +SUBDIRS ?= $(filter-out src/dbtools-mcp-server src/mysql-mcp-server src/oci-pricing-mcp-server src/oracle-db-doc-mcp-server,$(wildcard src/*)) .PHONY: test format @@ -46,13 +46,13 @@ lint: uv tool run --from 'tox==4.30.2' tox -e lint test: + uv run coverage erase @for dir in $(SUBDIRS); do \ if [ -f $$dir/pyproject.toml ]; then \ echo "Testing $$dir"; \ - cd $$dir && \ - COVERAGE_FILE=../../.coverage.$$(_basename=$$(basename $$dir); echo $$_basename) \ - uv run pytest --cov=. --cov-branch --cov-append --cov-report=html --cov-report=term-missing && \ - cd ../..; \ + ( cd $$dir && \ + COVERAGE_FILE=../../.coverage.$$(basename $$dir) \ + uv run pytest --cov=. --cov-branch --cov-append --cov-report=html --cov-report=term-missing ) || exit 1; \ fi \ done $(MAKE) combine-coverage @@ -67,3 +67,17 @@ format: e2e-tests: build install behave tests/e2e/features && cd .. + +# Create docker images for the specified MCP servers +dockerize: + @for dir in $(SUBDIRS); do \ + if [[ -f $$dir/Dockerfile && (-f $$dir/pyproject.toml) ]]; then \ + name=$$(uv run tomlq -r '.project.name' $$dir/pyproject.toml); \ + version=$$(uv run tomlq -r '.project.version' $$dir/pyproject.toml); \ + echo "Building Docker image for $$dir"; \ + cd $$dir && \ + docker build -t $$name:$$version . && \ + docker tag $$name:$$version $$name:latest && \ + echo "Docker image $$name:$$version (tagged with $$name:latest) built successfully" && cd ../..; \ + fi \ + done diff --git a/README.md b/README.md index f72f92df..4e646f68 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ Below is an example MCP client configuration for a typical python server *(For Node.js/Java/other servers, follow respective instructions in that server’s README)* For macOS/Linux: -``` +```json { "mcpServers": { "oracle-oci-api-mcp-server": { @@ -75,6 +75,29 @@ transport value while others (like Cline) expect `streamableHttp`. } ``` +## Running with Docker + +Some MCP servers in this repository support running via Docker. + +### Building the Docker Image + +You can build the docker image using the following command. The command shows building the docker image for the oci-api-mcp-server. + +```sh +SUBDIRS=src/oci-api-mcp-server make dockerize +``` +The above command builds the Docker image tagged as `oracle.oci-api-mcp-server:latest`. + +### MCP Client Configuration + +For examples of configuring MCP clients to run the server using Docker, see the client-specific sections below. Configurations typically involve using `docker run` as the command, with appropriate flags and volume mounts for credentials if needed (e.g., mounting `~/.oci` for OCI servers). + +Alternatively, if you want to use HTTP transport using the docker container, then start the MCP docker using the following command and configure your client as mentioned in Quickstart section above. +```bash +docker run -v "/path/to/your/.oci:/app/.oci" -e ORACLE_MCP_HOST=0.0.0.0 -e ORACLE_MCP_PORT=8888 oracle.oci-api-mcp-server:latest +``` +⚠️ **NOTE**: Ensure that the _key_file_ field in /path/to/your/.oci/config uses the ~ character so that the path resolves both inside and outside the container; for example: `key_file=~/.oci/oci_api_key.pem`. + ## Authentication For OCI MCP servers, you'll need to install and authenticate using the OCI CLI. @@ -138,6 +161,32 @@ For macOS/Linux: } ``` +Alternatively, to run using Docker (example for oracle.oci-api-mcp-server): + +```json +{ + "mcpServers": { + "oracle-oci-api-mcp-server": { + "autoApprove": [], + "disabled": false, + "timeout": 60, + "type": "stdio", + "command": "docker", + "args": ["run", "-i", "--rm", "-v", "/path/to/your/.oci:/app/.oci", "oracle.oci-api-mcp-server:latest"], + "env": { + "FASTMCP_LOG_LEVEL": "INFO" + } + } + } +} +``` + +Replace `"/path/to/your/.oci"` with the actual path to your OCI configuration directory. + +⚠️ **NOTE**: Ensure that the _key_file_ field in /path/to/your/.oci/config uses the ~ character so that the path resolves both inside and outside the container; for example: `key_file=~/.oci/oci_api_key.pem`. + +For servers not requiring OCI credentials, omit the `-v` volume mount. + For Windows - **TODO** 7. Once installed, you should see a list of your **MCP Servers** under the **Installed** tab. They will have a green toggle that shows that they are enabled. @@ -179,6 +228,27 @@ For macOS/Linux: } ``` +Alternatively, to run using Docker (example for oracle-oci-api-mcp-server): + +```json +{ + "mcpServers": { + "oracle-oci-api-mcp-server": { + "type": "stdio", + "command": "docker", + "args": ["run", "-i", "--rm", "-v", "/path/to/your/.oci:/app/.oci", "oracle.oci-api-mcp-server:latest"], + "env": { + "FASTMCP_LOG_LEVEL": "INFO" + } + } + } +} +``` + +Replace `"/path/to/your/.oci"` with the actual path to your OCI configuration directory. + +For servers not requiring OCI credentials, omit the `-v` volume mount. + `` is the profile that you set up during the [authentication](#authentication) steps. For Windows - **TODO** @@ -230,6 +300,27 @@ For macOS/Linux: } ``` +Alternatively, to run using Docker (example for oracle-oci-api-mcp-server): + +```json +{ + "mcpServers": { + "oracle-oci-api-mcp-server": { + "type": "stdio", + "command": "docker", + "args": ["run", "-i", "--rm", "-v", "/path/to/your/.oci:/app/.oci", "oracle.oci-api-mcp-server:latest"], + "env": { + "FASTMCP_LOG_LEVEL": "INFO" + } + } + } +} +``` + +Replace `"/path/to/your/.oci"` with the actual path to your OCI configuration directory. + +For servers not requiring OCI credentials, omit the `-v` volume mount. + `` is the profile that you set up during the [authentication](#authentication) steps. For Windows - **TODO** @@ -265,7 +356,7 @@ Below is an example MCP client configuration for a typical python server using t *(For Node.js/Java/other servers, follow respective instructions in that server’s README)* For macOS/Linux: -``` +```json { "mcpServers": { "oracle-oci-api-mcp-server": { @@ -350,7 +441,7 @@ the [documentation](https://modelcontextprotocol.io/docs/tools/inspector). The Inspector runs directly through npx without requiring installation. For instance, to inspect your locally developed server, you can run: -``` +```sh npx @modelcontextprotocol/inspector \ uv \ --directory \ diff --git a/requirements.txt b/requirements.txt index 7859127a..232f0e0a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ pydantic fastmcp -oci +oci-cli diff --git a/src/oci-api-mcp-server/.dockerignore b/src/oci-api-mcp-server/.dockerignore new file mode 100644 index 00000000..451067cc --- /dev/null +++ b/src/oci-api-mcp-server/.dockerignore @@ -0,0 +1,10 @@ +.venv +venv +bldvenv + +.pytest_cache +dist +**/__pycache__ + +htmlcov +.coverage diff --git a/src/oci-api-mcp-server/Dockerfile b/src/oci-api-mcp-server/Dockerfile new file mode 100644 index 00000000..8c480971 --- /dev/null +++ b/src/oci-api-mcp-server/Dockerfile @@ -0,0 +1,30 @@ +# Copyright (c) 2025, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v1.0 as shown at +# https://oss.oracle.com/licenses/upl. + +FROM ghcr.io/oracle/oraclelinux@sha256:1950389c3dd619841813520b4e69d7f3112c4c10f713fcb90680703d184c33ad + +# Install python 3.13 +RUN microdnf install epel-release && \ + microdnf install python3.13 python3.13-pip \ + && rm -rf /var/cache/dnf/* \ + && useradd -m -d /app oracle + +# Copy the MCP server to the docker container +WORKDIR /app +COPY --chown=oracle:oracle . /app + +# Install dependencies +RUN pip3.13 install --no-cache-dir uv && \ + uv --no-cache sync --locked --all-extras + +# Change user +USER oracle + +# HTTP support +ENV ORACLE_MCP_HOST="" +ENV ORACLE_MCP_PORT="" + +# Start the MCP server +ENTRYPOINT ["uv", "run"] +CMD ["oracle.oci-api-mcp-server"] diff --git a/src/oci-api-mcp-server/oracle/oci_api_mcp_server/__init__.py b/src/oci-api-mcp-server/oracle/oci_api_mcp_server/__init__.py index 78b6c6e5..575f13f3 100644 --- a/src/oci-api-mcp-server/oracle/oci_api_mcp_server/__init__.py +++ b/src/oci-api-mcp-server/oracle/oci_api_mcp_server/__init__.py @@ -5,4 +5,4 @@ """ __project__ = "oracle.oci-api-mcp-server" -__version__ = "1.1.0" +__version__ = "1.1.1" diff --git a/src/oci-api-mcp-server/pyproject.toml b/src/oci-api-mcp-server/pyproject.toml index 85d766b1..07f521ed 100644 --- a/src/oci-api-mcp-server/pyproject.toml +++ b/src/oci-api-mcp-server/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "oracle.oci-api-mcp-server" -version = "1.1.0" +version = "1.1.1" description = "OCI CLI MCP server" readme = "README.md" requires-python = ">=3.13" @@ -11,7 +11,7 @@ authors = [ ] dependencies = [ "fastmcp==2.13.0", - "oci==2.160.0", + "oci-cli==3.71.1" ] classifiers = [ diff --git a/src/oci-api-mcp-server/uv.lock b/src/oci-api-mcp-server/uv.lock index 8a68f55c..464abf93 100644 --- a/src/oci-api-mcp-server/uv.lock +++ b/src/oci-api-mcp-server/uv.lock @@ -24,6 +24,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6f/12/e5e0282d673bb9746bacfb6e2dba8719989d3660cdb2ea79aee9a9651afb/anyio-4.10.0-py3-none-any.whl", hash = "sha256:60e474ac86736bbfd6f210f7a61218939c318f43f9972497381f1c5e930ed3d1", size = 107213, upload-time = "2025-08-04T08:54:24.882Z" }, ] +[[package]] +name = "arrow" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-dateutil" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/33/032cdc44182491aa708d06a68b62434140d8c50820a087fac7af37703357/arrow-1.4.0.tar.gz", hash = "sha256:ed0cc050e98001b8779e84d461b0098c4ac597e88704a655582b21d116e526d7", size = 152931, upload-time = "2025-10-18T17:46:46.761Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/c9/d7977eaacb9df673210491da99e6a247e93df98c715fc43fd136ce1d3d33/arrow-1.4.0-py3-none-any.whl", hash = "sha256:749f0769958ebdc79c173ff0b0670d59051a535fa26e8eba02953dc19eb43205", size = 68797, upload-time = "2025-10-18T17:46:45.663Z" }, +] + [[package]] name = "attrs" version = "25.3.0" @@ -159,14 +172,14 @@ wheels = [ [[package]] name = "click" -version = "8.3.0" +version = "8.0.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/46/61/de6cd827efad202d7057d93e0fed9294b96952e188f7384832791c7b2254/click-8.3.0.tar.gz", hash = "sha256:e7b8232224eba16f4ebe410c25ced9f7875cb5f3263ffc93cc3e8da705e229c4", size = 276943, upload-time = "2025-09-18T17:32:23.696Z" } +sdist = { url = "https://files.pythonhosted.org/packages/dd/cf/706c1ad49ab26abed0b77a2f867984c1341ed7387b8030a6aa914e2942a0/click-8.0.4.tar.gz", hash = "sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb", size = 329520, upload-time = "2022-02-18T20:31:30.105Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/db/d3/9dcc0f5797f070ec8edf30fbadfb200e71d9db6b84d211e3b2085a7589a0/click-8.3.0-py3-none-any.whl", hash = "sha256:9b9f285302c6e3064f4330c05f05b81945b2a39544279343e6e7c5f27a9baddc", size = 107295, upload-time = "2025-09-18T17:32:22.42Z" }, + { url = "https://files.pythonhosted.org/packages/4a/a8/0b2ced25639fb20cc1c9784de90a8c25f9504a7f18cd8b5397bd61696d7d/click-8.0.4-py3-none-any.whl", hash = "sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1", size = 97486, upload-time = "2022-02-18T20:31:27.733Z" }, ] [[package]] @@ -487,6 +500,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b2/a3/e137168c9c44d18eff0376253da9f1e9234d0239e0ee230d2fee6cea8e55/jeepney-0.9.0-py3-none-any.whl", hash = "sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683", size = 49010, upload-time = "2025-02-27T18:51:00.104Z" }, ] +[[package]] +name = "jmespath" +version = "0.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3c/56/3f325b1eef9791759784aa5046a8f6a1aff8f7c898a2e34506771d3b99d8/jmespath-0.10.0.tar.gz", hash = "sha256:b85d0567b8666149a93172712e68920734333c0ce7e89b78b3e987f71e5ed4f9", size = 21607, upload-time = "2020-05-12T22:03:47.267Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/cb/5f001272b6faeb23c1c9e0acc04d48eaaf5c862c17709d20e3469c6e0139/jmespath-0.10.0-py2.py3-none-any.whl", hash = "sha256:cdf6525904cc597730141d61b36f2e4b8ecc257c420fa2f4549bac2c2d0cb72f", size = 24489, upload-time = "2020-05-12T22:03:45.643Z" }, +] + [[package]] name = "jsonschema" version = "4.25.1" @@ -657,7 +679,7 @@ wheels = [ [[package]] name = "oci" -version = "2.160.0" +version = "2.164.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, @@ -667,9 +689,34 @@ dependencies = [ { name = "python-dateutil" }, { name = "pytz" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f3/7b/c9d7fc28f11c25c7875db3584eab5d52ccb2d7df553d07ac47f19a14d075/oci-2.160.0.tar.gz", hash = "sha256:f8e3410204c1405b40247179550cf74f5145a8e17025c4f2a92f2b9ffdc7d26b", size = 15601606, upload-time = "2025-09-09T04:17:43.728Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6e/fc/1c227e66ad949858b4388b18df76c9ef834228c3ca4b3c38c4cc7a099171/oci-2.164.1.tar.gz", hash = "sha256:2089632da42e9f556de046b6663050f2a046b06603eeefb90dc79810e91ee2c5", size = 16177816, upload-time = "2025-12-09T10:39:25.947Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/71/7c5725cd015aded721b3c36c25d1be302dfc11dc80ab966243663f9e1a1a/oci-2.164.1-py3-none-any.whl", hash = "sha256:65869381433e7a48ba5adfb63cf275e77bad4dd2ea79887e0a61110962252e3a", size = 32980817, upload-time = "2025-12-09T10:39:15.459Z" }, +] + +[[package]] +name = "oci-cli" +version = "3.71.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "arrow" }, + { name = "certifi" }, + { name = "click" }, + { name = "cryptography" }, + { name = "jmespath" }, + { name = "oci" }, + { name = "prompt-toolkit" }, + { name = "pyopenssl" }, + { name = "python-dateutil" }, + { name = "pytz" }, + { name = "pyyaml" }, + { name = "setuptools" }, + { name = "six" }, + { name = "terminaltables" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0f/34/f49d7a531968edc727a0ed6da2c66dc5317738c8c75e224cca690ba11cbd/oci_cli-3.71.1.tar.gz", hash = "sha256:91e1674f6c2f59d3c955be77e68b209967fa3fc3be53a5421177bb0bf3d5557d", size = 7726932, upload-time = "2025-12-09T13:13:29.326Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/78/51/752375a4e0d2de371c2788414157eda337417010d2ef7383cd7140388f1e/oci-2.160.0-py3-none-any.whl", hash = "sha256:3dba1ec671ebea23f255fabf836cb0fd08aea0913a8df85610fccaa5a4344ee9", size = 31715365, upload-time = "2025-09-09T04:17:34.998Z" }, + { url = "https://files.pythonhosted.org/packages/e2/9d/ea8a5583eb97174eb997f2050e47a422d24cf229888fcfe0ddb7c9b8b452/oci_cli-3.71.1-py3-none-any.whl", hash = "sha256:e91e8ffaeb373db3ad0c95d49b6137e59c3277f3911a099927efedae55a3d761", size = 25219923, upload-time = "2025-12-09T13:13:23.387Z" }, ] [[package]] @@ -735,11 +782,11 @@ wheels = [ [[package]] name = "oracle-oci-api-mcp-server" -version = "1.1.0" +version = "1.1.1" source = { editable = "." } dependencies = [ { name = "fastmcp" }, - { name = "oci" }, + { name = "oci-cli" }, ] [package.dev-dependencies] @@ -752,7 +799,7 @@ dev = [ [package.metadata] requires-dist = [ { name = "fastmcp", specifier = "==2.13.0" }, - { name = "oci", specifier = "==2.160.0" }, + { name = "oci-cli", specifier = "==3.71.1" }, ] [package.metadata.requires-dev] @@ -816,6 +863,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, ] +[[package]] +name = "prompt-toolkit" +version = "3.0.43" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cc/c6/25b6a3d5cd295304de1e32c9edbcf319a52e965b339629d37d42bb7126ca/prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d", size = 425733, upload-time = "2023-12-13T08:44:39.127Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ee/fd/ca7bf3869e7caa7a037e23078539467b433a4e01eebd93f77180ab927766/prompt_toolkit-3.0.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6", size = 386072, upload-time = "2023-12-13T08:44:35.304Z" }, +] + [[package]] name = "py-key-value-aio" version = "0.2.8" @@ -1234,6 +1293,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/46/f5af3402b579fd5e11573ce652019a67074317e18c1935cc0b4ba9b35552/secretstorage-3.5.0-py3-none-any.whl", hash = "sha256:0ce65888c0725fcb2c5bc0fdb8e5438eece02c523557ea40ce0703c266248137", size = 15554, upload-time = "2025-11-23T19:02:51.545Z" }, ] +[[package]] +name = "setuptools" +version = "80.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c", size = 1319958, upload-time = "2025-05-27T00:56:51.443Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", size = 1201486, upload-time = "2025-05-27T00:56:49.664Z" }, +] + [[package]] name = "six" version = "1.17.0" @@ -1276,6 +1344,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/be/72/2db2f49247d0a18b4f1bb9a5a39a0162869acf235f3a96418363947b3d46/starlette-0.48.0-py3-none-any.whl", hash = "sha256:0764ca97b097582558ecb498132ed0c7d942f233f365b86ba37770e026510659", size = 73736, upload-time = "2025-09-13T08:41:03.869Z" }, ] +[[package]] +name = "terminaltables" +version = "3.1.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/fc/0b73d782f5ab7feba8d007573a3773c58255f223c5940a7b7085f02153c3/terminaltables-3.1.10.tar.gz", hash = "sha256:ba6eca5cb5ba02bba4c9f4f985af80c54ec3dccf94cfcd190154386255e47543", size = 12264, upload-time = "2021-12-07T19:03:35.758Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/fb/ea621e0a19733e01fe4005d46087d383693c0f4a8f824b47d8d4122c87e0/terminaltables-3.1.10-py2.py3-none-any.whl", hash = "sha256:e4fdc4179c9e4aab5f674d80f09d76fa436b96fdc698a8505e0a36bf0804a874", size = 15155, upload-time = "2021-12-07T19:03:34.013Z" }, +] + [[package]] name = "typing-extensions" version = "4.15.0" @@ -1297,6 +1374,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/17/69/cd203477f944c353c31bade965f880aa1061fd6bf05ded0726ca845b6ff7/typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51", size = 14552, upload-time = "2025-05-21T18:55:22.152Z" }, ] +[[package]] +name = "tzdata" +version = "2025.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload-time = "2025-03-23T13:54:43.652Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload-time = "2025-03-23T13:54:41.845Z" }, +] + [[package]] name = "urllib3" version = "2.5.0" @@ -1319,6 +1405,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/96/06/5cc0542b47c0338c1cb676b348e24a1c29acabc81000bced518231dded6f/uvicorn-0.36.0-py3-none-any.whl", hash = "sha256:6bb4ba67f16024883af8adf13aba3a9919e415358604ce46780d3f9bdc36d731", size = 67675, upload-time = "2025-09-20T01:07:12.984Z" }, ] +[[package]] +name = "wcwidth" +version = "0.2.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/30/6b0809f4510673dc723187aeaf24c7f5459922d01e2f794277a3dfb90345/wcwidth-0.2.14.tar.gz", hash = "sha256:4d478375d31bc5395a3c55c40ccdf3354688364cd61c4f6adacaa9215d0b3605", size = 102293, upload-time = "2025-09-22T16:29:53.023Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl", hash = "sha256:a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1", size = 37286, upload-time = "2025-09-22T16:29:51.641Z" }, +] + [[package]] name = "websockets" version = "15.0.1" diff --git a/src/oci-cloud-guard-mcp-server/.dockerignore b/src/oci-cloud-guard-mcp-server/.dockerignore new file mode 100644 index 00000000..451067cc --- /dev/null +++ b/src/oci-cloud-guard-mcp-server/.dockerignore @@ -0,0 +1,10 @@ +.venv +venv +bldvenv + +.pytest_cache +dist +**/__pycache__ + +htmlcov +.coverage diff --git a/src/oci-cloud-guard-mcp-server/Dockerfile b/src/oci-cloud-guard-mcp-server/Dockerfile new file mode 100644 index 00000000..d42d8a9a --- /dev/null +++ b/src/oci-cloud-guard-mcp-server/Dockerfile @@ -0,0 +1,30 @@ +# Copyright (c) 2025, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v1.0 as shown at +# https://oss.oracle.com/licenses/upl. + +FROM ghcr.io/oracle/oraclelinux@sha256:1950389c3dd619841813520b4e69d7f3112c4c10f713fcb90680703d184c33ad + +# Install python 3.13 +RUN microdnf install epel-release && \ + microdnf install python3.13 python3.13-pip \ + && rm -rf /var/cache/dnf/* \ + && useradd -m -d /app oracle + +# Copy the MCP server to the docker container +WORKDIR /app +COPY --chown=oracle:oracle . /app + +# Install dependencies +RUN pip3.13 install --no-cache-dir uv && \ + uv --no-cache sync --locked --all-extras + +# Change user +USER oracle + +# HTTP support +ENV ORACLE_MCP_HOST="" +ENV ORACLE_MCP_PORT="" + +# Start the MCP server +ENTRYPOINT ["uv", "run"] +CMD ["oracle.oci-cloud-guard-mcp-server"] diff --git a/src/oci-cloud-guard-mcp-server/oracle/oci_cloud_guard_mcp_server/__init__.py b/src/oci-cloud-guard-mcp-server/oracle/oci_cloud_guard_mcp_server/__init__.py index add6e72a..2d322c74 100644 --- a/src/oci-cloud-guard-mcp-server/oracle/oci_cloud_guard_mcp_server/__init__.py +++ b/src/oci-cloud-guard-mcp-server/oracle/oci_cloud_guard_mcp_server/__init__.py @@ -5,4 +5,4 @@ """ __project__ = "oracle.oci-cloud-guard-mcp-server" -__version__ = "1.1.0" +__version__ = "1.1.1" diff --git a/src/oci-cloud-guard-mcp-server/oracle/oci_cloud_guard_mcp_server/server.py b/src/oci-cloud-guard-mcp-server/oracle/oci_cloud_guard_mcp_server/server.py index faafb32a..f7b2ce50 100644 --- a/src/oci-cloud-guard-mcp-server/oracle/oci_cloud_guard_mcp_server/server.py +++ b/src/oci-cloud-guard-mcp-server/oracle/oci_cloud_guard_mcp_server/server.py @@ -34,7 +34,7 @@ def get_cloud_guard_client(): config["additional_user_agent"] = f"{user_agent_name}/{__version__}" private_key = oci.signer.load_private_key_from_file(config["key_file"]) - token_file = config["security_token_file"] + token_file = os.path.expanduser(config["security_token_file"]) token = None with open(token_file, "r") as f: token = f.read() diff --git a/src/oci-cloud-guard-mcp-server/pyproject.toml b/src/oci-cloud-guard-mcp-server/pyproject.toml index c866a888..9cb7f17c 100644 --- a/src/oci-cloud-guard-mcp-server/pyproject.toml +++ b/src/oci-cloud-guard-mcp-server/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "oracle.oci-cloud-guard-mcp-server" -version = "1.1.0" +version = "1.1.1" description = "OCI Cloud Guard Service MCP server" readme = "README.md" requires-python = ">=3.13" @@ -11,7 +11,7 @@ authors = [ ] dependencies = [ "fastmcp==2.13.0", - "oci==2.160.0", + "oci-cli==3.71.1", "pydantic==2.12.3" ] diff --git a/src/oci-cloud-guard-mcp-server/uv.lock b/src/oci-cloud-guard-mcp-server/uv.lock index 27dfc721..d6311f18 100644 --- a/src/oci-cloud-guard-mcp-server/uv.lock +++ b/src/oci-cloud-guard-mcp-server/uv.lock @@ -24,6 +24,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6f/12/e5e0282d673bb9746bacfb6e2dba8719989d3660cdb2ea79aee9a9651afb/anyio-4.10.0-py3-none-any.whl", hash = "sha256:60e474ac86736bbfd6f210f7a61218939c318f43f9972497381f1c5e930ed3d1", size = 107213, upload-time = "2025-08-04T08:54:24.882Z" }, ] +[[package]] +name = "arrow" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-dateutil" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/33/032cdc44182491aa708d06a68b62434140d8c50820a087fac7af37703357/arrow-1.4.0.tar.gz", hash = "sha256:ed0cc050e98001b8779e84d461b0098c4ac597e88704a655582b21d116e526d7", size = 152931, upload-time = "2025-10-18T17:46:46.761Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/c9/d7977eaacb9df673210491da99e6a247e93df98c715fc43fd136ce1d3d33/arrow-1.4.0-py3-none-any.whl", hash = "sha256:749f0769958ebdc79c173ff0b0670d59051a535fa26e8eba02953dc19eb43205", size = 68797, upload-time = "2025-10-18T17:46:45.663Z" }, +] + [[package]] name = "attrs" version = "25.3.0" @@ -159,14 +172,14 @@ wheels = [ [[package]] name = "click" -version = "8.3.0" +version = "8.0.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/46/61/de6cd827efad202d7057d93e0fed9294b96952e188f7384832791c7b2254/click-8.3.0.tar.gz", hash = "sha256:e7b8232224eba16f4ebe410c25ced9f7875cb5f3263ffc93cc3e8da705e229c4", size = 276943, upload-time = "2025-09-18T17:32:23.696Z" } +sdist = { url = "https://files.pythonhosted.org/packages/dd/cf/706c1ad49ab26abed0b77a2f867984c1341ed7387b8030a6aa914e2942a0/click-8.0.4.tar.gz", hash = "sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb", size = 329520, upload-time = "2022-02-18T20:31:30.105Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/db/d3/9dcc0f5797f070ec8edf30fbadfb200e71d9db6b84d211e3b2085a7589a0/click-8.3.0-py3-none-any.whl", hash = "sha256:9b9f285302c6e3064f4330c05f05b81945b2a39544279343e6e7c5f27a9baddc", size = 107295, upload-time = "2025-09-18T17:32:22.42Z" }, + { url = "https://files.pythonhosted.org/packages/4a/a8/0b2ced25639fb20cc1c9784de90a8c25f9504a7f18cd8b5397bd61696d7d/click-8.0.4-py3-none-any.whl", hash = "sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1", size = 97486, upload-time = "2022-02-18T20:31:27.733Z" }, ] [[package]] @@ -487,6 +500,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b2/a3/e137168c9c44d18eff0376253da9f1e9234d0239e0ee230d2fee6cea8e55/jeepney-0.9.0-py3-none-any.whl", hash = "sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683", size = 49010, upload-time = "2025-02-27T18:51:00.104Z" }, ] +[[package]] +name = "jmespath" +version = "0.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3c/56/3f325b1eef9791759784aa5046a8f6a1aff8f7c898a2e34506771d3b99d8/jmespath-0.10.0.tar.gz", hash = "sha256:b85d0567b8666149a93172712e68920734333c0ce7e89b78b3e987f71e5ed4f9", size = 21607, upload-time = "2020-05-12T22:03:47.267Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/cb/5f001272b6faeb23c1c9e0acc04d48eaaf5c862c17709d20e3469c6e0139/jmespath-0.10.0-py2.py3-none-any.whl", hash = "sha256:cdf6525904cc597730141d61b36f2e4b8ecc257c420fa2f4549bac2c2d0cb72f", size = 24489, upload-time = "2020-05-12T22:03:45.643Z" }, +] + [[package]] name = "jsonschema" version = "4.25.1" @@ -657,7 +679,7 @@ wheels = [ [[package]] name = "oci" -version = "2.160.0" +version = "2.164.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, @@ -667,9 +689,34 @@ dependencies = [ { name = "python-dateutil" }, { name = "pytz" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f3/7b/c9d7fc28f11c25c7875db3584eab5d52ccb2d7df553d07ac47f19a14d075/oci-2.160.0.tar.gz", hash = "sha256:f8e3410204c1405b40247179550cf74f5145a8e17025c4f2a92f2b9ffdc7d26b", size = 15601606, upload-time = "2025-09-09T04:17:43.728Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6e/fc/1c227e66ad949858b4388b18df76c9ef834228c3ca4b3c38c4cc7a099171/oci-2.164.1.tar.gz", hash = "sha256:2089632da42e9f556de046b6663050f2a046b06603eeefb90dc79810e91ee2c5", size = 16177816, upload-time = "2025-12-09T10:39:25.947Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/71/7c5725cd015aded721b3c36c25d1be302dfc11dc80ab966243663f9e1a1a/oci-2.164.1-py3-none-any.whl", hash = "sha256:65869381433e7a48ba5adfb63cf275e77bad4dd2ea79887e0a61110962252e3a", size = 32980817, upload-time = "2025-12-09T10:39:15.459Z" }, +] + +[[package]] +name = "oci-cli" +version = "3.71.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "arrow" }, + { name = "certifi" }, + { name = "click" }, + { name = "cryptography" }, + { name = "jmespath" }, + { name = "oci" }, + { name = "prompt-toolkit" }, + { name = "pyopenssl" }, + { name = "python-dateutil" }, + { name = "pytz" }, + { name = "pyyaml" }, + { name = "setuptools" }, + { name = "six" }, + { name = "terminaltables" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0f/34/f49d7a531968edc727a0ed6da2c66dc5317738c8c75e224cca690ba11cbd/oci_cli-3.71.1.tar.gz", hash = "sha256:91e1674f6c2f59d3c955be77e68b209967fa3fc3be53a5421177bb0bf3d5557d", size = 7726932, upload-time = "2025-12-09T13:13:29.326Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/78/51/752375a4e0d2de371c2788414157eda337417010d2ef7383cd7140388f1e/oci-2.160.0-py3-none-any.whl", hash = "sha256:3dba1ec671ebea23f255fabf836cb0fd08aea0913a8df85610fccaa5a4344ee9", size = 31715365, upload-time = "2025-09-09T04:17:34.998Z" }, + { url = "https://files.pythonhosted.org/packages/e2/9d/ea8a5583eb97174eb997f2050e47a422d24cf229888fcfe0ddb7c9b8b452/oci_cli-3.71.1-py3-none-any.whl", hash = "sha256:e91e8ffaeb373db3ad0c95d49b6137e59c3277f3911a099927efedae55a3d761", size = 25219923, upload-time = "2025-12-09T13:13:23.387Z" }, ] [[package]] @@ -735,11 +782,11 @@ wheels = [ [[package]] name = "oracle-oci-cloud-guard-mcp-server" -version = "1.1.0" +version = "1.1.1" source = { editable = "." } dependencies = [ { name = "fastmcp" }, - { name = "oci" }, + { name = "oci-cli" }, { name = "pydantic" }, ] @@ -753,7 +800,7 @@ dev = [ [package.metadata] requires-dist = [ { name = "fastmcp", specifier = "==2.13.0" }, - { name = "oci", specifier = "==2.160.0" }, + { name = "oci-cli", specifier = "==3.71.1" }, { name = "pydantic", specifier = "==2.12.3" }, ] @@ -818,6 +865,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, ] +[[package]] +name = "prompt-toolkit" +version = "3.0.43" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cc/c6/25b6a3d5cd295304de1e32c9edbcf319a52e965b339629d37d42bb7126ca/prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d", size = 425733, upload-time = "2023-12-13T08:44:39.127Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ee/fd/ca7bf3869e7caa7a037e23078539467b433a4e01eebd93f77180ab927766/prompt_toolkit-3.0.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6", size = 386072, upload-time = "2023-12-13T08:44:35.304Z" }, +] + [[package]] name = "py-key-value-aio" version = "0.2.8" @@ -1257,6 +1316,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/46/f5af3402b579fd5e11573ce652019a67074317e18c1935cc0b4ba9b35552/secretstorage-3.5.0-py3-none-any.whl", hash = "sha256:0ce65888c0725fcb2c5bc0fdb8e5438eece02c523557ea40ce0703c266248137", size = 15554, upload-time = "2025-11-23T19:02:51.545Z" }, ] +[[package]] +name = "setuptools" +version = "80.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c", size = 1319958, upload-time = "2025-05-27T00:56:51.443Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", size = 1201486, upload-time = "2025-05-27T00:56:49.664Z" }, +] + [[package]] name = "six" version = "1.17.0" @@ -1299,6 +1367,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/be/72/2db2f49247d0a18b4f1bb9a5a39a0162869acf235f3a96418363947b3d46/starlette-0.48.0-py3-none-any.whl", hash = "sha256:0764ca97b097582558ecb498132ed0c7d942f233f365b86ba37770e026510659", size = 73736, upload-time = "2025-09-13T08:41:03.869Z" }, ] +[[package]] +name = "terminaltables" +version = "3.1.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/fc/0b73d782f5ab7feba8d007573a3773c58255f223c5940a7b7085f02153c3/terminaltables-3.1.10.tar.gz", hash = "sha256:ba6eca5cb5ba02bba4c9f4f985af80c54ec3dccf94cfcd190154386255e47543", size = 12264, upload-time = "2021-12-07T19:03:35.758Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/fb/ea621e0a19733e01fe4005d46087d383693c0f4a8f824b47d8d4122c87e0/terminaltables-3.1.10-py2.py3-none-any.whl", hash = "sha256:e4fdc4179c9e4aab5f674d80f09d76fa436b96fdc698a8505e0a36bf0804a874", size = 15155, upload-time = "2021-12-07T19:03:34.013Z" }, +] + [[package]] name = "typing-extensions" version = "4.15.0" @@ -1320,6 +1397,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611, upload-time = "2025-10-01T02:14:40.154Z" }, ] +[[package]] +name = "tzdata" +version = "2025.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload-time = "2025-03-23T13:54:43.652Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload-time = "2025-03-23T13:54:41.845Z" }, +] + [[package]] name = "urllib3" version = "2.5.0" @@ -1342,6 +1428,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/96/06/5cc0542b47c0338c1cb676b348e24a1c29acabc81000bced518231dded6f/uvicorn-0.36.0-py3-none-any.whl", hash = "sha256:6bb4ba67f16024883af8adf13aba3a9919e415358604ce46780d3f9bdc36d731", size = 67675, upload-time = "2025-09-20T01:07:12.984Z" }, ] +[[package]] +name = "wcwidth" +version = "0.2.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/30/6b0809f4510673dc723187aeaf24c7f5459922d01e2f794277a3dfb90345/wcwidth-0.2.14.tar.gz", hash = "sha256:4d478375d31bc5395a3c55c40ccdf3354688364cd61c4f6adacaa9215d0b3605", size = 102293, upload-time = "2025-09-22T16:29:53.023Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl", hash = "sha256:a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1", size = 37286, upload-time = "2025-09-22T16:29:51.641Z" }, +] + [[package]] name = "websockets" version = "15.0.1" diff --git a/src/oci-compute-instance-agent-mcp-server/.dockerignore b/src/oci-compute-instance-agent-mcp-server/.dockerignore new file mode 100644 index 00000000..451067cc --- /dev/null +++ b/src/oci-compute-instance-agent-mcp-server/.dockerignore @@ -0,0 +1,10 @@ +.venv +venv +bldvenv + +.pytest_cache +dist +**/__pycache__ + +htmlcov +.coverage diff --git a/src/oci-compute-instance-agent-mcp-server/Dockerfile b/src/oci-compute-instance-agent-mcp-server/Dockerfile new file mode 100644 index 00000000..5b927785 --- /dev/null +++ b/src/oci-compute-instance-agent-mcp-server/Dockerfile @@ -0,0 +1,30 @@ +# Copyright (c) 2025, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v1.0 as shown at +# https://oss.oracle.com/licenses/upl. + +FROM ghcr.io/oracle/oraclelinux@sha256:1950389c3dd619841813520b4e69d7f3112c4c10f713fcb90680703d184c33ad + +# Install python 3.13 +RUN microdnf install epel-release && \ + microdnf install python3.13 python3.13-pip \ + && rm -rf /var/cache/dnf/* \ + && useradd -m -d /app oracle + +# Copy the MCP server to the docker container +WORKDIR /app +COPY --chown=oracle:oracle . /app + +# Install dependencies +RUN pip3.13 install --no-cache-dir uv && \ + uv --no-cache sync --locked --all-extras + +# Change user +USER oracle + +# HTTP support +ENV ORACLE_MCP_HOST="" +ENV ORACLE_MCP_PORT="" + +# Start the MCP server +ENTRYPOINT ["uv", "run"] +CMD ["oracle.oci-compute-instance-agent-mcp-server"] diff --git a/src/oci-compute-instance-agent-mcp-server/oracle/oci_compute_instance_agent_mcp_server/__init__.py b/src/oci-compute-instance-agent-mcp-server/oracle/oci_compute_instance_agent_mcp_server/__init__.py index f698d1c5..afe2f6e2 100644 --- a/src/oci-compute-instance-agent-mcp-server/oracle/oci_compute_instance_agent_mcp_server/__init__.py +++ b/src/oci-compute-instance-agent-mcp-server/oracle/oci_compute_instance_agent_mcp_server/__init__.py @@ -5,4 +5,4 @@ """ __project__ = "oracle.oci-compute-instance-agent-mcp-server" -__version__ = "2.1.0" +__version__ = "2.1.1" diff --git a/src/oci-compute-instance-agent-mcp-server/oracle/oci_compute_instance_agent_mcp_server/server.py b/src/oci-compute-instance-agent-mcp-server/oracle/oci_compute_instance_agent_mcp_server/server.py index bce76e8f..b5538833 100644 --- a/src/oci-compute-instance-agent-mcp-server/oracle/oci_compute_instance_agent_mcp_server/server.py +++ b/src/oci-compute-instance-agent-mcp-server/oracle/oci_compute_instance_agent_mcp_server/server.py @@ -43,7 +43,7 @@ def get_compute_instance_agent_client(): config["additional_user_agent"] = f"{user_agent_name}/{__version__}" private_key = oci.signer.load_private_key_from_file(config["key_file"]) - token_file = config["security_token_file"] + token_file = os.path.expanduser(config["security_token_file"]) token = None with open(token_file, "r") as f: token = f.read() diff --git a/src/oci-compute-instance-agent-mcp-server/pyproject.toml b/src/oci-compute-instance-agent-mcp-server/pyproject.toml index 721aaad6..a6bbcbc0 100644 --- a/src/oci-compute-instance-agent-mcp-server/pyproject.toml +++ b/src/oci-compute-instance-agent-mcp-server/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "oracle.oci-compute-instance-agent-mcp-server" -version = "2.1.0" +version = "2.1.1" description = "OCI Compute Instance Agent MCP Server" readme = "README.md" requires-python = ">=3.13" @@ -10,7 +10,7 @@ authors = [ {name = "Oracle MCP", email = "237432095+oracle-mcp@users.noreply.github.com"}, ] dependencies = [ - "oci==2.160.0", + "oci-cli==3.71.1", "fastmcp==2.13.0", ] diff --git a/src/oci-compute-instance-agent-mcp-server/uv.lock b/src/oci-compute-instance-agent-mcp-server/uv.lock index cdfaa94b..85b37860 100644 --- a/src/oci-compute-instance-agent-mcp-server/uv.lock +++ b/src/oci-compute-instance-agent-mcp-server/uv.lock @@ -24,6 +24,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6f/12/e5e0282d673bb9746bacfb6e2dba8719989d3660cdb2ea79aee9a9651afb/anyio-4.10.0-py3-none-any.whl", hash = "sha256:60e474ac86736bbfd6f210f7a61218939c318f43f9972497381f1c5e930ed3d1", size = 107213, upload-time = "2025-08-04T08:54:24.882Z" }, ] +[[package]] +name = "arrow" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-dateutil" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/33/032cdc44182491aa708d06a68b62434140d8c50820a087fac7af37703357/arrow-1.4.0.tar.gz", hash = "sha256:ed0cc050e98001b8779e84d461b0098c4ac597e88704a655582b21d116e526d7", size = 152931, upload-time = "2025-10-18T17:46:46.761Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/c9/d7977eaacb9df673210491da99e6a247e93df98c715fc43fd136ce1d3d33/arrow-1.4.0-py3-none-any.whl", hash = "sha256:749f0769958ebdc79c173ff0b0670d59051a535fa26e8eba02953dc19eb43205", size = 68797, upload-time = "2025-10-18T17:46:45.663Z" }, +] + [[package]] name = "attrs" version = "25.3.0" @@ -159,14 +172,14 @@ wheels = [ [[package]] name = "click" -version = "8.3.0" +version = "8.0.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/46/61/de6cd827efad202d7057d93e0fed9294b96952e188f7384832791c7b2254/click-8.3.0.tar.gz", hash = "sha256:e7b8232224eba16f4ebe410c25ced9f7875cb5f3263ffc93cc3e8da705e229c4", size = 276943, upload-time = "2025-09-18T17:32:23.696Z" } +sdist = { url = "https://files.pythonhosted.org/packages/dd/cf/706c1ad49ab26abed0b77a2f867984c1341ed7387b8030a6aa914e2942a0/click-8.0.4.tar.gz", hash = "sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb", size = 329520, upload-time = "2022-02-18T20:31:30.105Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/db/d3/9dcc0f5797f070ec8edf30fbadfb200e71d9db6b84d211e3b2085a7589a0/click-8.3.0-py3-none-any.whl", hash = "sha256:9b9f285302c6e3064f4330c05f05b81945b2a39544279343e6e7c5f27a9baddc", size = 107295, upload-time = "2025-09-18T17:32:22.42Z" }, + { url = "https://files.pythonhosted.org/packages/4a/a8/0b2ced25639fb20cc1c9784de90a8c25f9504a7f18cd8b5397bd61696d7d/click-8.0.4-py3-none-any.whl", hash = "sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1", size = 97486, upload-time = "2022-02-18T20:31:27.733Z" }, ] [[package]] @@ -487,6 +500,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b2/a3/e137168c9c44d18eff0376253da9f1e9234d0239e0ee230d2fee6cea8e55/jeepney-0.9.0-py3-none-any.whl", hash = "sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683", size = 49010, upload-time = "2025-02-27T18:51:00.104Z" }, ] +[[package]] +name = "jmespath" +version = "0.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3c/56/3f325b1eef9791759784aa5046a8f6a1aff8f7c898a2e34506771d3b99d8/jmespath-0.10.0.tar.gz", hash = "sha256:b85d0567b8666149a93172712e68920734333c0ce7e89b78b3e987f71e5ed4f9", size = 21607, upload-time = "2020-05-12T22:03:47.267Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/cb/5f001272b6faeb23c1c9e0acc04d48eaaf5c862c17709d20e3469c6e0139/jmespath-0.10.0-py2.py3-none-any.whl", hash = "sha256:cdf6525904cc597730141d61b36f2e4b8ecc257c420fa2f4549bac2c2d0cb72f", size = 24489, upload-time = "2020-05-12T22:03:45.643Z" }, +] + [[package]] name = "jsonschema" version = "4.25.1" @@ -657,7 +679,7 @@ wheels = [ [[package]] name = "oci" -version = "2.160.0" +version = "2.164.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, @@ -667,9 +689,34 @@ dependencies = [ { name = "python-dateutil" }, { name = "pytz" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f3/7b/c9d7fc28f11c25c7875db3584eab5d52ccb2d7df553d07ac47f19a14d075/oci-2.160.0.tar.gz", hash = "sha256:f8e3410204c1405b40247179550cf74f5145a8e17025c4f2a92f2b9ffdc7d26b", size = 15601606, upload-time = "2025-09-09T04:17:43.728Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6e/fc/1c227e66ad949858b4388b18df76c9ef834228c3ca4b3c38c4cc7a099171/oci-2.164.1.tar.gz", hash = "sha256:2089632da42e9f556de046b6663050f2a046b06603eeefb90dc79810e91ee2c5", size = 16177816, upload-time = "2025-12-09T10:39:25.947Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/71/7c5725cd015aded721b3c36c25d1be302dfc11dc80ab966243663f9e1a1a/oci-2.164.1-py3-none-any.whl", hash = "sha256:65869381433e7a48ba5adfb63cf275e77bad4dd2ea79887e0a61110962252e3a", size = 32980817, upload-time = "2025-12-09T10:39:15.459Z" }, +] + +[[package]] +name = "oci-cli" +version = "3.71.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "arrow" }, + { name = "certifi" }, + { name = "click" }, + { name = "cryptography" }, + { name = "jmespath" }, + { name = "oci" }, + { name = "prompt-toolkit" }, + { name = "pyopenssl" }, + { name = "python-dateutil" }, + { name = "pytz" }, + { name = "pyyaml" }, + { name = "setuptools" }, + { name = "six" }, + { name = "terminaltables" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0f/34/f49d7a531968edc727a0ed6da2c66dc5317738c8c75e224cca690ba11cbd/oci_cli-3.71.1.tar.gz", hash = "sha256:91e1674f6c2f59d3c955be77e68b209967fa3fc3be53a5421177bb0bf3d5557d", size = 7726932, upload-time = "2025-12-09T13:13:29.326Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/78/51/752375a4e0d2de371c2788414157eda337417010d2ef7383cd7140388f1e/oci-2.160.0-py3-none-any.whl", hash = "sha256:3dba1ec671ebea23f255fabf836cb0fd08aea0913a8df85610fccaa5a4344ee9", size = 31715365, upload-time = "2025-09-09T04:17:34.998Z" }, + { url = "https://files.pythonhosted.org/packages/e2/9d/ea8a5583eb97174eb997f2050e47a422d24cf229888fcfe0ddb7c9b8b452/oci_cli-3.71.1-py3-none-any.whl", hash = "sha256:e91e8ffaeb373db3ad0c95d49b6137e59c3277f3911a099927efedae55a3d761", size = 25219923, upload-time = "2025-12-09T13:13:23.387Z" }, ] [[package]] @@ -735,11 +782,11 @@ wheels = [ [[package]] name = "oracle-oci-compute-instance-agent-mcp-server" -version = "2.1.0" +version = "2.1.1" source = { editable = "." } dependencies = [ { name = "fastmcp" }, - { name = "oci" }, + { name = "oci-cli" }, ] [package.dev-dependencies] @@ -752,7 +799,7 @@ dev = [ [package.metadata] requires-dist = [ { name = "fastmcp", specifier = "==2.13.0" }, - { name = "oci", specifier = "==2.160.0" }, + { name = "oci-cli", specifier = "==3.71.1" }, ] [package.metadata.requires-dev] @@ -816,6 +863,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, ] +[[package]] +name = "prompt-toolkit" +version = "3.0.43" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cc/c6/25b6a3d5cd295304de1e32c9edbcf319a52e965b339629d37d42bb7126ca/prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d", size = 425733, upload-time = "2023-12-13T08:44:39.127Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ee/fd/ca7bf3869e7caa7a037e23078539467b433a4e01eebd93f77180ab927766/prompt_toolkit-3.0.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6", size = 386072, upload-time = "2023-12-13T08:44:35.304Z" }, +] + [[package]] name = "py-key-value-aio" version = "0.2.8" @@ -1234,6 +1293,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/46/f5af3402b579fd5e11573ce652019a67074317e18c1935cc0b4ba9b35552/secretstorage-3.5.0-py3-none-any.whl", hash = "sha256:0ce65888c0725fcb2c5bc0fdb8e5438eece02c523557ea40ce0703c266248137", size = 15554, upload-time = "2025-11-23T19:02:51.545Z" }, ] +[[package]] +name = "setuptools" +version = "80.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c", size = 1319958, upload-time = "2025-05-27T00:56:51.443Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", size = 1201486, upload-time = "2025-05-27T00:56:49.664Z" }, +] + [[package]] name = "six" version = "1.17.0" @@ -1276,6 +1344,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/be/72/2db2f49247d0a18b4f1bb9a5a39a0162869acf235f3a96418363947b3d46/starlette-0.48.0-py3-none-any.whl", hash = "sha256:0764ca97b097582558ecb498132ed0c7d942f233f365b86ba37770e026510659", size = 73736, upload-time = "2025-09-13T08:41:03.869Z" }, ] +[[package]] +name = "terminaltables" +version = "3.1.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/fc/0b73d782f5ab7feba8d007573a3773c58255f223c5940a7b7085f02153c3/terminaltables-3.1.10.tar.gz", hash = "sha256:ba6eca5cb5ba02bba4c9f4f985af80c54ec3dccf94cfcd190154386255e47543", size = 12264, upload-time = "2021-12-07T19:03:35.758Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/fb/ea621e0a19733e01fe4005d46087d383693c0f4a8f824b47d8d4122c87e0/terminaltables-3.1.10-py2.py3-none-any.whl", hash = "sha256:e4fdc4179c9e4aab5f674d80f09d76fa436b96fdc698a8505e0a36bf0804a874", size = 15155, upload-time = "2021-12-07T19:03:34.013Z" }, +] + [[package]] name = "typing-extensions" version = "4.15.0" @@ -1297,6 +1374,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/17/69/cd203477f944c353c31bade965f880aa1061fd6bf05ded0726ca845b6ff7/typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51", size = 14552, upload-time = "2025-05-21T18:55:22.152Z" }, ] +[[package]] +name = "tzdata" +version = "2025.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload-time = "2025-03-23T13:54:43.652Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload-time = "2025-03-23T13:54:41.845Z" }, +] + [[package]] name = "urllib3" version = "2.5.0" @@ -1319,6 +1405,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/96/06/5cc0542b47c0338c1cb676b348e24a1c29acabc81000bced518231dded6f/uvicorn-0.36.0-py3-none-any.whl", hash = "sha256:6bb4ba67f16024883af8adf13aba3a9919e415358604ce46780d3f9bdc36d731", size = 67675, upload-time = "2025-09-20T01:07:12.984Z" }, ] +[[package]] +name = "wcwidth" +version = "0.2.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/30/6b0809f4510673dc723187aeaf24c7f5459922d01e2f794277a3dfb90345/wcwidth-0.2.14.tar.gz", hash = "sha256:4d478375d31bc5395a3c55c40ccdf3354688364cd61c4f6adacaa9215d0b3605", size = 102293, upload-time = "2025-09-22T16:29:53.023Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl", hash = "sha256:a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1", size = 37286, upload-time = "2025-09-22T16:29:51.641Z" }, +] + [[package]] name = "websockets" version = "15.0.1" diff --git a/src/oci-compute-mcp-server/Dockerfile b/src/oci-compute-mcp-server/Dockerfile new file mode 100644 index 00000000..96a3fe94 --- /dev/null +++ b/src/oci-compute-mcp-server/Dockerfile @@ -0,0 +1,30 @@ +# Copyright (c) 2025, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v1.0 as shown at +# https://oss.oracle.com/licenses/upl. + +FROM ghcr.io/oracle/oraclelinux@sha256:1950389c3dd619841813520b4e69d7f3112c4c10f713fcb90680703d184c33ad + +# Install python 3.13 +RUN microdnf install epel-release && \ + microdnf install python3.13 python3.13-pip \ + && rm -rf /var/cache/dnf/* \ + && useradd -m -d /app oracle + +# Copy the MCP server to the docker container +WORKDIR /app +COPY --chown=oracle:oracle . /app + +# Install dependencies +RUN pip3.13 install --no-cache-dir uv && \ + uv --no-cache sync --locked --all-extras + +# Change user +USER oracle + +# HTTP support +ENV ORACLE_MCP_HOST="" +ENV ORACLE_MCP_PORT="" + +# Start the MCP server +ENTRYPOINT ["uv", "run"] +CMD ["oracle.oci-compute-mcp-server"] diff --git a/src/oci-compute-mcp-server/oracle/oci_compute_mcp_server/__init__.py b/src/oci-compute-mcp-server/oracle/oci_compute_mcp_server/__init__.py index ecf08213..81640c67 100644 --- a/src/oci-compute-mcp-server/oracle/oci_compute_mcp_server/__init__.py +++ b/src/oci-compute-mcp-server/oracle/oci_compute_mcp_server/__init__.py @@ -5,4 +5,4 @@ """ __project__ = "oracle.oci-compute-mcp-server" -__version__ = "1.2.0" +__version__ = "1.2.1" diff --git a/src/oci-compute-mcp-server/oracle/oci_compute_mcp_server/server.py b/src/oci-compute-mcp-server/oracle/oci_compute_mcp_server/server.py index 15c13e44..8e625f7c 100644 --- a/src/oci-compute-mcp-server/oracle/oci_compute_mcp_server/server.py +++ b/src/oci-compute-mcp-server/oracle/oci_compute_mcp_server/server.py @@ -44,7 +44,7 @@ def get_compute_client(): config["additional_user_agent"] = f"{user_agent_name}/{__version__}" private_key = oci.signer.load_private_key_from_file(config["key_file"]) - token_file = config["security_token_file"] + token_file = os.path.expanduser(config["security_token_file"]) token = None with open(token_file, "r") as f: token = f.read() diff --git a/src/oci-compute-mcp-server/pyproject.toml b/src/oci-compute-mcp-server/pyproject.toml index eaa507aa..572e0513 100644 --- a/src/oci-compute-mcp-server/pyproject.toml +++ b/src/oci-compute-mcp-server/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "oracle.oci-compute-mcp-server" -version = "1.2.0" +version = "1.2.1" description = "OCI Compute Service MCP server" readme = "README.md" requires-python = ">=3.13" @@ -11,7 +11,7 @@ authors = [ ] dependencies = [ "fastmcp==2.13.0", - "oci==2.160.0", + "oci-cli==3.71.1", "pydantic==2.12.3", ] diff --git a/src/oci-compute-mcp-server/uv.lock b/src/oci-compute-mcp-server/uv.lock index 784a0f5e..e6adcdb3 100644 --- a/src/oci-compute-mcp-server/uv.lock +++ b/src/oci-compute-mcp-server/uv.lock @@ -24,6 +24,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6f/12/e5e0282d673bb9746bacfb6e2dba8719989d3660cdb2ea79aee9a9651afb/anyio-4.10.0-py3-none-any.whl", hash = "sha256:60e474ac86736bbfd6f210f7a61218939c318f43f9972497381f1c5e930ed3d1", size = 107213, upload-time = "2025-08-04T08:54:24.882Z" }, ] +[[package]] +name = "arrow" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-dateutil" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/33/032cdc44182491aa708d06a68b62434140d8c50820a087fac7af37703357/arrow-1.4.0.tar.gz", hash = "sha256:ed0cc050e98001b8779e84d461b0098c4ac597e88704a655582b21d116e526d7", size = 152931, upload-time = "2025-10-18T17:46:46.761Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/c9/d7977eaacb9df673210491da99e6a247e93df98c715fc43fd136ce1d3d33/arrow-1.4.0-py3-none-any.whl", hash = "sha256:749f0769958ebdc79c173ff0b0670d59051a535fa26e8eba02953dc19eb43205", size = 68797, upload-time = "2025-10-18T17:46:45.663Z" }, +] + [[package]] name = "attrs" version = "25.3.0" @@ -159,14 +172,14 @@ wheels = [ [[package]] name = "click" -version = "8.3.0" +version = "8.0.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/46/61/de6cd827efad202d7057d93e0fed9294b96952e188f7384832791c7b2254/click-8.3.0.tar.gz", hash = "sha256:e7b8232224eba16f4ebe410c25ced9f7875cb5f3263ffc93cc3e8da705e229c4", size = 276943, upload-time = "2025-09-18T17:32:23.696Z" } +sdist = { url = "https://files.pythonhosted.org/packages/dd/cf/706c1ad49ab26abed0b77a2f867984c1341ed7387b8030a6aa914e2942a0/click-8.0.4.tar.gz", hash = "sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb", size = 329520, upload-time = "2022-02-18T20:31:30.105Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/db/d3/9dcc0f5797f070ec8edf30fbadfb200e71d9db6b84d211e3b2085a7589a0/click-8.3.0-py3-none-any.whl", hash = "sha256:9b9f285302c6e3064f4330c05f05b81945b2a39544279343e6e7c5f27a9baddc", size = 107295, upload-time = "2025-09-18T17:32:22.42Z" }, + { url = "https://files.pythonhosted.org/packages/4a/a8/0b2ced25639fb20cc1c9784de90a8c25f9504a7f18cd8b5397bd61696d7d/click-8.0.4-py3-none-any.whl", hash = "sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1", size = 97486, upload-time = "2022-02-18T20:31:27.733Z" }, ] [[package]] @@ -487,6 +500,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b2/a3/e137168c9c44d18eff0376253da9f1e9234d0239e0ee230d2fee6cea8e55/jeepney-0.9.0-py3-none-any.whl", hash = "sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683", size = 49010, upload-time = "2025-02-27T18:51:00.104Z" }, ] +[[package]] +name = "jmespath" +version = "0.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3c/56/3f325b1eef9791759784aa5046a8f6a1aff8f7c898a2e34506771d3b99d8/jmespath-0.10.0.tar.gz", hash = "sha256:b85d0567b8666149a93172712e68920734333c0ce7e89b78b3e987f71e5ed4f9", size = 21607, upload-time = "2020-05-12T22:03:47.267Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/cb/5f001272b6faeb23c1c9e0acc04d48eaaf5c862c17709d20e3469c6e0139/jmespath-0.10.0-py2.py3-none-any.whl", hash = "sha256:cdf6525904cc597730141d61b36f2e4b8ecc257c420fa2f4549bac2c2d0cb72f", size = 24489, upload-time = "2020-05-12T22:03:45.643Z" }, +] + [[package]] name = "jsonschema" version = "4.25.1" @@ -657,7 +679,7 @@ wheels = [ [[package]] name = "oci" -version = "2.160.0" +version = "2.164.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, @@ -667,9 +689,34 @@ dependencies = [ { name = "python-dateutil" }, { name = "pytz" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f3/7b/c9d7fc28f11c25c7875db3584eab5d52ccb2d7df553d07ac47f19a14d075/oci-2.160.0.tar.gz", hash = "sha256:f8e3410204c1405b40247179550cf74f5145a8e17025c4f2a92f2b9ffdc7d26b", size = 15601606, upload-time = "2025-09-09T04:17:43.728Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6e/fc/1c227e66ad949858b4388b18df76c9ef834228c3ca4b3c38c4cc7a099171/oci-2.164.1.tar.gz", hash = "sha256:2089632da42e9f556de046b6663050f2a046b06603eeefb90dc79810e91ee2c5", size = 16177816, upload-time = "2025-12-09T10:39:25.947Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/71/7c5725cd015aded721b3c36c25d1be302dfc11dc80ab966243663f9e1a1a/oci-2.164.1-py3-none-any.whl", hash = "sha256:65869381433e7a48ba5adfb63cf275e77bad4dd2ea79887e0a61110962252e3a", size = 32980817, upload-time = "2025-12-09T10:39:15.459Z" }, +] + +[[package]] +name = "oci-cli" +version = "3.71.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "arrow" }, + { name = "certifi" }, + { name = "click" }, + { name = "cryptography" }, + { name = "jmespath" }, + { name = "oci" }, + { name = "prompt-toolkit" }, + { name = "pyopenssl" }, + { name = "python-dateutil" }, + { name = "pytz" }, + { name = "pyyaml" }, + { name = "setuptools" }, + { name = "six" }, + { name = "terminaltables" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0f/34/f49d7a531968edc727a0ed6da2c66dc5317738c8c75e224cca690ba11cbd/oci_cli-3.71.1.tar.gz", hash = "sha256:91e1674f6c2f59d3c955be77e68b209967fa3fc3be53a5421177bb0bf3d5557d", size = 7726932, upload-time = "2025-12-09T13:13:29.326Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/78/51/752375a4e0d2de371c2788414157eda337417010d2ef7383cd7140388f1e/oci-2.160.0-py3-none-any.whl", hash = "sha256:3dba1ec671ebea23f255fabf836cb0fd08aea0913a8df85610fccaa5a4344ee9", size = 31715365, upload-time = "2025-09-09T04:17:34.998Z" }, + { url = "https://files.pythonhosted.org/packages/e2/9d/ea8a5583eb97174eb997f2050e47a422d24cf229888fcfe0ddb7c9b8b452/oci_cli-3.71.1-py3-none-any.whl", hash = "sha256:e91e8ffaeb373db3ad0c95d49b6137e59c3277f3911a099927efedae55a3d761", size = 25219923, upload-time = "2025-12-09T13:13:23.387Z" }, ] [[package]] @@ -735,11 +782,11 @@ wheels = [ [[package]] name = "oracle-oci-compute-mcp-server" -version = "1.2.0" +version = "1.2.1" source = { editable = "." } dependencies = [ { name = "fastmcp" }, - { name = "oci" }, + { name = "oci-cli" }, { name = "pydantic" }, ] @@ -753,7 +800,7 @@ dev = [ [package.metadata] requires-dist = [ { name = "fastmcp", specifier = "==2.13.0" }, - { name = "oci", specifier = "==2.160.0" }, + { name = "oci-cli", specifier = "==3.71.1" }, { name = "pydantic", specifier = "==2.12.3" }, ] @@ -818,6 +865,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, ] +[[package]] +name = "prompt-toolkit" +version = "3.0.43" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cc/c6/25b6a3d5cd295304de1e32c9edbcf319a52e965b339629d37d42bb7126ca/prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d", size = 425733, upload-time = "2023-12-13T08:44:39.127Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ee/fd/ca7bf3869e7caa7a037e23078539467b433a4e01eebd93f77180ab927766/prompt_toolkit-3.0.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6", size = 386072, upload-time = "2023-12-13T08:44:35.304Z" }, +] + [[package]] name = "py-key-value-aio" version = "0.2.8" @@ -1257,6 +1316,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/46/f5af3402b579fd5e11573ce652019a67074317e18c1935cc0b4ba9b35552/secretstorage-3.5.0-py3-none-any.whl", hash = "sha256:0ce65888c0725fcb2c5bc0fdb8e5438eece02c523557ea40ce0703c266248137", size = 15554, upload-time = "2025-11-23T19:02:51.545Z" }, ] +[[package]] +name = "setuptools" +version = "80.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c", size = 1319958, upload-time = "2025-05-27T00:56:51.443Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", size = 1201486, upload-time = "2025-05-27T00:56:49.664Z" }, +] + [[package]] name = "six" version = "1.17.0" @@ -1299,6 +1367,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/be/72/2db2f49247d0a18b4f1bb9a5a39a0162869acf235f3a96418363947b3d46/starlette-0.48.0-py3-none-any.whl", hash = "sha256:0764ca97b097582558ecb498132ed0c7d942f233f365b86ba37770e026510659", size = 73736, upload-time = "2025-09-13T08:41:03.869Z" }, ] +[[package]] +name = "terminaltables" +version = "3.1.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/fc/0b73d782f5ab7feba8d007573a3773c58255f223c5940a7b7085f02153c3/terminaltables-3.1.10.tar.gz", hash = "sha256:ba6eca5cb5ba02bba4c9f4f985af80c54ec3dccf94cfcd190154386255e47543", size = 12264, upload-time = "2021-12-07T19:03:35.758Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/fb/ea621e0a19733e01fe4005d46087d383693c0f4a8f824b47d8d4122c87e0/terminaltables-3.1.10-py2.py3-none-any.whl", hash = "sha256:e4fdc4179c9e4aab5f674d80f09d76fa436b96fdc698a8505e0a36bf0804a874", size = 15155, upload-time = "2021-12-07T19:03:34.013Z" }, +] + [[package]] name = "typing-extensions" version = "4.15.0" @@ -1320,6 +1397,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611, upload-time = "2025-10-01T02:14:40.154Z" }, ] +[[package]] +name = "tzdata" +version = "2025.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload-time = "2025-03-23T13:54:43.652Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload-time = "2025-03-23T13:54:41.845Z" }, +] + [[package]] name = "urllib3" version = "2.5.0" @@ -1342,6 +1428,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/96/06/5cc0542b47c0338c1cb676b348e24a1c29acabc81000bced518231dded6f/uvicorn-0.36.0-py3-none-any.whl", hash = "sha256:6bb4ba67f16024883af8adf13aba3a9919e415358604ce46780d3f9bdc36d731", size = 67675, upload-time = "2025-09-20T01:07:12.984Z" }, ] +[[package]] +name = "wcwidth" +version = "0.2.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/30/6b0809f4510673dc723187aeaf24c7f5459922d01e2f794277a3dfb90345/wcwidth-0.2.14.tar.gz", hash = "sha256:4d478375d31bc5395a3c55c40ccdf3354688364cd61c4f6adacaa9215d0b3605", size = 102293, upload-time = "2025-09-22T16:29:53.023Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl", hash = "sha256:a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1", size = 37286, upload-time = "2025-09-22T16:29:51.641Z" }, +] + [[package]] name = "websockets" version = "15.0.1" diff --git a/src/oci-identity-mcp-server/Dockerfile b/src/oci-identity-mcp-server/Dockerfile new file mode 100644 index 00000000..125227fe --- /dev/null +++ b/src/oci-identity-mcp-server/Dockerfile @@ -0,0 +1,30 @@ +# Copyright (c) 2025, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v1.0 as shown at +# https://oss.oracle.com/licenses/upl. + +FROM ghcr.io/oracle/oraclelinux@sha256:1950389c3dd619841813520b4e69d7f3112c4c10f713fcb90680703d184c33ad + +# Install python 3.13 +RUN microdnf install epel-release && \ + microdnf install python3.13 python3.13-pip \ + && rm -rf /var/cache/dnf/* \ + && useradd -m -d /app oracle + +# Copy the MCP server to the docker container +WORKDIR /app +COPY --chown=oracle:oracle . /app + +# Install dependencies +RUN pip3.13 install --no-cache-dir uv && \ + uv --no-cache sync --locked --all-extras + +# Change user +USER oracle + +# HTTP support +ENV ORACLE_MCP_HOST="" +ENV ORACLE_MCP_PORT="" + +# Start the MCP server +ENTRYPOINT ["uv", "run"] +CMD ["oracle.oci-identity-mcp-server"] diff --git a/src/oci-identity-mcp-server/oracle/oci_identity_mcp_server/__init__.py b/src/oci-identity-mcp-server/oracle/oci_identity_mcp_server/__init__.py index 1e55aeef..67bba36e 100644 --- a/src/oci-identity-mcp-server/oracle/oci_identity_mcp_server/__init__.py +++ b/src/oci-identity-mcp-server/oracle/oci_identity_mcp_server/__init__.py @@ -5,4 +5,4 @@ """ __project__ = "oracle.oci-identity-mcp-server" -__version__ = "2.1.0" +__version__ = "2.1.1" diff --git a/src/oci-identity-mcp-server/oracle/oci_identity_mcp_server/server.py b/src/oci-identity-mcp-server/oracle/oci_identity_mcp_server/server.py index b0c55825..5f25c41c 100644 --- a/src/oci-identity-mcp-server/oracle/oci_identity_mcp_server/server.py +++ b/src/oci-identity-mcp-server/oracle/oci_identity_mcp_server/server.py @@ -40,7 +40,7 @@ def get_identity_client(): user_agent_name = __project__.split("oracle.", 1)[1].split("-server", 1)[0] config["additional_user_agent"] = f"{user_agent_name}/{__version__}" private_key = oci.signer.load_private_key_from_file(config["key_file"]) - token_file = config["security_token_file"] + token_file = os.path.expanduser(config["security_token_file"]) with open(token_file, "r") as f: token = f.read() signer = oci.auth.signers.SecurityTokenSigner(token, private_key) diff --git a/src/oci-identity-mcp-server/pyproject.toml b/src/oci-identity-mcp-server/pyproject.toml index e717d761..637db78b 100644 --- a/src/oci-identity-mcp-server/pyproject.toml +++ b/src/oci-identity-mcp-server/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "oracle.oci-identity-mcp-server" -version = "2.1.0" +version = "2.1.1" description = "OCI Identity Service MCP server" readme = "README.md" requires-python = ">=3.13" @@ -11,7 +11,7 @@ authors = [ ] dependencies = [ "fastmcp==2.13.0", - "oci==2.160.0", + "oci-cli==3.71.1", ] classifiers = [ diff --git a/src/oci-identity-mcp-server/uv.lock b/src/oci-identity-mcp-server/uv.lock index 80fc4726..cad0f5de 100644 --- a/src/oci-identity-mcp-server/uv.lock +++ b/src/oci-identity-mcp-server/uv.lock @@ -24,6 +24,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6f/12/e5e0282d673bb9746bacfb6e2dba8719989d3660cdb2ea79aee9a9651afb/anyio-4.10.0-py3-none-any.whl", hash = "sha256:60e474ac86736bbfd6f210f7a61218939c318f43f9972497381f1c5e930ed3d1", size = 107213, upload-time = "2025-08-04T08:54:24.882Z" }, ] +[[package]] +name = "arrow" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-dateutil" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/33/032cdc44182491aa708d06a68b62434140d8c50820a087fac7af37703357/arrow-1.4.0.tar.gz", hash = "sha256:ed0cc050e98001b8779e84d461b0098c4ac597e88704a655582b21d116e526d7", size = 152931, upload-time = "2025-10-18T17:46:46.761Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/c9/d7977eaacb9df673210491da99e6a247e93df98c715fc43fd136ce1d3d33/arrow-1.4.0-py3-none-any.whl", hash = "sha256:749f0769958ebdc79c173ff0b0670d59051a535fa26e8eba02953dc19eb43205", size = 68797, upload-time = "2025-10-18T17:46:45.663Z" }, +] + [[package]] name = "attrs" version = "25.3.0" @@ -159,14 +172,14 @@ wheels = [ [[package]] name = "click" -version = "8.3.0" +version = "8.0.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/46/61/de6cd827efad202d7057d93e0fed9294b96952e188f7384832791c7b2254/click-8.3.0.tar.gz", hash = "sha256:e7b8232224eba16f4ebe410c25ced9f7875cb5f3263ffc93cc3e8da705e229c4", size = 276943, upload-time = "2025-09-18T17:32:23.696Z" } +sdist = { url = "https://files.pythonhosted.org/packages/dd/cf/706c1ad49ab26abed0b77a2f867984c1341ed7387b8030a6aa914e2942a0/click-8.0.4.tar.gz", hash = "sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb", size = 329520, upload-time = "2022-02-18T20:31:30.105Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/db/d3/9dcc0f5797f070ec8edf30fbadfb200e71d9db6b84d211e3b2085a7589a0/click-8.3.0-py3-none-any.whl", hash = "sha256:9b9f285302c6e3064f4330c05f05b81945b2a39544279343e6e7c5f27a9baddc", size = 107295, upload-time = "2025-09-18T17:32:22.42Z" }, + { url = "https://files.pythonhosted.org/packages/4a/a8/0b2ced25639fb20cc1c9784de90a8c25f9504a7f18cd8b5397bd61696d7d/click-8.0.4-py3-none-any.whl", hash = "sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1", size = 97486, upload-time = "2022-02-18T20:31:27.733Z" }, ] [[package]] @@ -487,6 +500,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b2/a3/e137168c9c44d18eff0376253da9f1e9234d0239e0ee230d2fee6cea8e55/jeepney-0.9.0-py3-none-any.whl", hash = "sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683", size = 49010, upload-time = "2025-02-27T18:51:00.104Z" }, ] +[[package]] +name = "jmespath" +version = "0.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3c/56/3f325b1eef9791759784aa5046a8f6a1aff8f7c898a2e34506771d3b99d8/jmespath-0.10.0.tar.gz", hash = "sha256:b85d0567b8666149a93172712e68920734333c0ce7e89b78b3e987f71e5ed4f9", size = 21607, upload-time = "2020-05-12T22:03:47.267Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/cb/5f001272b6faeb23c1c9e0acc04d48eaaf5c862c17709d20e3469c6e0139/jmespath-0.10.0-py2.py3-none-any.whl", hash = "sha256:cdf6525904cc597730141d61b36f2e4b8ecc257c420fa2f4549bac2c2d0cb72f", size = 24489, upload-time = "2020-05-12T22:03:45.643Z" }, +] + [[package]] name = "jsonschema" version = "4.25.1" @@ -657,7 +679,7 @@ wheels = [ [[package]] name = "oci" -version = "2.160.0" +version = "2.164.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, @@ -667,9 +689,34 @@ dependencies = [ { name = "python-dateutil" }, { name = "pytz" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f3/7b/c9d7fc28f11c25c7875db3584eab5d52ccb2d7df553d07ac47f19a14d075/oci-2.160.0.tar.gz", hash = "sha256:f8e3410204c1405b40247179550cf74f5145a8e17025c4f2a92f2b9ffdc7d26b", size = 15601606, upload-time = "2025-09-09T04:17:43.728Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6e/fc/1c227e66ad949858b4388b18df76c9ef834228c3ca4b3c38c4cc7a099171/oci-2.164.1.tar.gz", hash = "sha256:2089632da42e9f556de046b6663050f2a046b06603eeefb90dc79810e91ee2c5", size = 16177816, upload-time = "2025-12-09T10:39:25.947Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/71/7c5725cd015aded721b3c36c25d1be302dfc11dc80ab966243663f9e1a1a/oci-2.164.1-py3-none-any.whl", hash = "sha256:65869381433e7a48ba5adfb63cf275e77bad4dd2ea79887e0a61110962252e3a", size = 32980817, upload-time = "2025-12-09T10:39:15.459Z" }, +] + +[[package]] +name = "oci-cli" +version = "3.71.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "arrow" }, + { name = "certifi" }, + { name = "click" }, + { name = "cryptography" }, + { name = "jmespath" }, + { name = "oci" }, + { name = "prompt-toolkit" }, + { name = "pyopenssl" }, + { name = "python-dateutil" }, + { name = "pytz" }, + { name = "pyyaml" }, + { name = "setuptools" }, + { name = "six" }, + { name = "terminaltables" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0f/34/f49d7a531968edc727a0ed6da2c66dc5317738c8c75e224cca690ba11cbd/oci_cli-3.71.1.tar.gz", hash = "sha256:91e1674f6c2f59d3c955be77e68b209967fa3fc3be53a5421177bb0bf3d5557d", size = 7726932, upload-time = "2025-12-09T13:13:29.326Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/78/51/752375a4e0d2de371c2788414157eda337417010d2ef7383cd7140388f1e/oci-2.160.0-py3-none-any.whl", hash = "sha256:3dba1ec671ebea23f255fabf836cb0fd08aea0913a8df85610fccaa5a4344ee9", size = 31715365, upload-time = "2025-09-09T04:17:34.998Z" }, + { url = "https://files.pythonhosted.org/packages/e2/9d/ea8a5583eb97174eb997f2050e47a422d24cf229888fcfe0ddb7c9b8b452/oci_cli-3.71.1-py3-none-any.whl", hash = "sha256:e91e8ffaeb373db3ad0c95d49b6137e59c3277f3911a099927efedae55a3d761", size = 25219923, upload-time = "2025-12-09T13:13:23.387Z" }, ] [[package]] @@ -735,11 +782,11 @@ wheels = [ [[package]] name = "oracle-oci-identity-mcp-server" -version = "2.1.0" +version = "2.1.1" source = { editable = "." } dependencies = [ { name = "fastmcp" }, - { name = "oci" }, + { name = "oci-cli" }, ] [package.dev-dependencies] @@ -752,7 +799,7 @@ dev = [ [package.metadata] requires-dist = [ { name = "fastmcp", specifier = "==2.13.0" }, - { name = "oci", specifier = "==2.160.0" }, + { name = "oci-cli", specifier = "==3.71.1" }, ] [package.metadata.requires-dev] @@ -816,6 +863,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, ] +[[package]] +name = "prompt-toolkit" +version = "3.0.43" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cc/c6/25b6a3d5cd295304de1e32c9edbcf319a52e965b339629d37d42bb7126ca/prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d", size = 425733, upload-time = "2023-12-13T08:44:39.127Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ee/fd/ca7bf3869e7caa7a037e23078539467b433a4e01eebd93f77180ab927766/prompt_toolkit-3.0.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6", size = 386072, upload-time = "2023-12-13T08:44:35.304Z" }, +] + [[package]] name = "py-key-value-aio" version = "0.2.8" @@ -1234,6 +1293,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/46/f5af3402b579fd5e11573ce652019a67074317e18c1935cc0b4ba9b35552/secretstorage-3.5.0-py3-none-any.whl", hash = "sha256:0ce65888c0725fcb2c5bc0fdb8e5438eece02c523557ea40ce0703c266248137", size = 15554, upload-time = "2025-11-23T19:02:51.545Z" }, ] +[[package]] +name = "setuptools" +version = "80.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c", size = 1319958, upload-time = "2025-05-27T00:56:51.443Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", size = 1201486, upload-time = "2025-05-27T00:56:49.664Z" }, +] + [[package]] name = "six" version = "1.17.0" @@ -1276,6 +1344,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/be/72/2db2f49247d0a18b4f1bb9a5a39a0162869acf235f3a96418363947b3d46/starlette-0.48.0-py3-none-any.whl", hash = "sha256:0764ca97b097582558ecb498132ed0c7d942f233f365b86ba37770e026510659", size = 73736, upload-time = "2025-09-13T08:41:03.869Z" }, ] +[[package]] +name = "terminaltables" +version = "3.1.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/fc/0b73d782f5ab7feba8d007573a3773c58255f223c5940a7b7085f02153c3/terminaltables-3.1.10.tar.gz", hash = "sha256:ba6eca5cb5ba02bba4c9f4f985af80c54ec3dccf94cfcd190154386255e47543", size = 12264, upload-time = "2021-12-07T19:03:35.758Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/fb/ea621e0a19733e01fe4005d46087d383693c0f4a8f824b47d8d4122c87e0/terminaltables-3.1.10-py2.py3-none-any.whl", hash = "sha256:e4fdc4179c9e4aab5f674d80f09d76fa436b96fdc698a8505e0a36bf0804a874", size = 15155, upload-time = "2021-12-07T19:03:34.013Z" }, +] + [[package]] name = "typing-extensions" version = "4.15.0" @@ -1297,6 +1374,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/17/69/cd203477f944c353c31bade965f880aa1061fd6bf05ded0726ca845b6ff7/typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51", size = 14552, upload-time = "2025-05-21T18:55:22.152Z" }, ] +[[package]] +name = "tzdata" +version = "2025.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload-time = "2025-03-23T13:54:43.652Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload-time = "2025-03-23T13:54:41.845Z" }, +] + [[package]] name = "urllib3" version = "2.5.0" @@ -1319,6 +1405,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/96/06/5cc0542b47c0338c1cb676b348e24a1c29acabc81000bced518231dded6f/uvicorn-0.36.0-py3-none-any.whl", hash = "sha256:6bb4ba67f16024883af8adf13aba3a9919e415358604ce46780d3f9bdc36d731", size = 67675, upload-time = "2025-09-20T01:07:12.984Z" }, ] +[[package]] +name = "wcwidth" +version = "0.2.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/30/6b0809f4510673dc723187aeaf24c7f5459922d01e2f794277a3dfb90345/wcwidth-0.2.14.tar.gz", hash = "sha256:4d478375d31bc5395a3c55c40ccdf3354688364cd61c4f6adacaa9215d0b3605", size = 102293, upload-time = "2025-09-22T16:29:53.023Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl", hash = "sha256:a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1", size = 37286, upload-time = "2025-09-22T16:29:51.641Z" }, +] + [[package]] name = "websockets" version = "15.0.1" diff --git a/src/oci-logging-mcp-server/.dockerignore b/src/oci-logging-mcp-server/.dockerignore new file mode 100644 index 00000000..451067cc --- /dev/null +++ b/src/oci-logging-mcp-server/.dockerignore @@ -0,0 +1,10 @@ +.venv +venv +bldvenv + +.pytest_cache +dist +**/__pycache__ + +htmlcov +.coverage diff --git a/src/oci-logging-mcp-server/Dockerfile b/src/oci-logging-mcp-server/Dockerfile new file mode 100644 index 00000000..6ca2616b --- /dev/null +++ b/src/oci-logging-mcp-server/Dockerfile @@ -0,0 +1,30 @@ +# Copyright (c) 2025, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v1.0 as shown at +# https://oss.oracle.com/licenses/upl. + +FROM ghcr.io/oracle/oraclelinux@sha256:1950389c3dd619841813520b4e69d7f3112c4c10f713fcb90680703d184c33ad + +# Install python 3.13 +RUN microdnf install epel-release && \ + microdnf install python3.13 python3.13-pip \ + && rm -rf /var/cache/dnf/* \ + && useradd -m -d /app oracle + +# Copy the MCP server to the docker container +WORKDIR /app +COPY --chown=oracle:oracle . /app + +# Install dependencies +RUN pip3.13 install --no-cache-dir uv && \ + uv --no-cache sync --locked --all-extras + +# Change user +USER oracle + +# HTTP support +ENV ORACLE_MCP_HOST="" +ENV ORACLE_MCP_PORT="" + +# Start the MCP server +ENTRYPOINT ["uv", "run"] +CMD ["oracle.oci-logging-mcp-server"] diff --git a/src/oci-logging-mcp-server/oracle/oci_logging_mcp_server/__init__.py b/src/oci-logging-mcp-server/oracle/oci_logging_mcp_server/__init__.py index 6d2dc11a..7676b148 100644 --- a/src/oci-logging-mcp-server/oracle/oci_logging_mcp_server/__init__.py +++ b/src/oci-logging-mcp-server/oracle/oci_logging_mcp_server/__init__.py @@ -5,4 +5,4 @@ """ __project__ = "oracle.oci-logging-mcp-server" -__version__ = "1.2.0" +__version__ = "1.2.1" diff --git a/src/oci-logging-mcp-server/oracle/oci_logging_mcp_server/server.py b/src/oci-logging-mcp-server/oracle/oci_logging_mcp_server/server.py index 364874b7..f9eaa0e2 100644 --- a/src/oci-logging-mcp-server/oracle/oci_logging_mcp_server/server.py +++ b/src/oci-logging-mcp-server/oracle/oci_logging_mcp_server/server.py @@ -44,7 +44,7 @@ def get_logging_client(): ) private_key = oci.signer.load_private_key_from_file(config["key_file"]) - token_file = config["security_token_file"] + token_file = os.path.expanduser(config["security_token_file"]) token = None with open(token_file, "r") as f: token = f.read() @@ -59,7 +59,7 @@ def get_logging_search_client(): ) private_key = oci.signer.load_private_key_from_file(config["key_file"]) - token_file = config["security_token_file"] + token_file = os.path.expanduser(config["security_token_file"]) token = None with open(token_file, "r") as f: token = f.read() diff --git a/src/oci-logging-mcp-server/pyproject.toml b/src/oci-logging-mcp-server/pyproject.toml index 8078c22d..0dbf8052 100644 --- a/src/oci-logging-mcp-server/pyproject.toml +++ b/src/oci-logging-mcp-server/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "oracle.oci-logging-mcp-server" -version = "1.2.0" +version = "1.2.1" description = "OCI Logging Service MCP server" readme = "README.md" authors = [ @@ -9,7 +9,7 @@ authors = [ requires-python = ">=3.13" dependencies = [ "fastmcp==2.13.0", - "oci==2.160.0", + "oci-cli==3.71.1", "pydantic==2.12.3", ] diff --git a/src/oci-logging-mcp-server/uv.lock b/src/oci-logging-mcp-server/uv.lock index c44a8174..5194624e 100644 --- a/src/oci-logging-mcp-server/uv.lock +++ b/src/oci-logging-mcp-server/uv.lock @@ -24,6 +24,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6f/12/e5e0282d673bb9746bacfb6e2dba8719989d3660cdb2ea79aee9a9651afb/anyio-4.10.0-py3-none-any.whl", hash = "sha256:60e474ac86736bbfd6f210f7a61218939c318f43f9972497381f1c5e930ed3d1", size = 107213, upload-time = "2025-08-04T08:54:24.882Z" }, ] +[[package]] +name = "arrow" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-dateutil" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/33/032cdc44182491aa708d06a68b62434140d8c50820a087fac7af37703357/arrow-1.4.0.tar.gz", hash = "sha256:ed0cc050e98001b8779e84d461b0098c4ac597e88704a655582b21d116e526d7", size = 152931, upload-time = "2025-10-18T17:46:46.761Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/c9/d7977eaacb9df673210491da99e6a247e93df98c715fc43fd136ce1d3d33/arrow-1.4.0-py3-none-any.whl", hash = "sha256:749f0769958ebdc79c173ff0b0670d59051a535fa26e8eba02953dc19eb43205", size = 68797, upload-time = "2025-10-18T17:46:45.663Z" }, +] + [[package]] name = "attrs" version = "25.3.0" @@ -159,14 +172,14 @@ wheels = [ [[package]] name = "click" -version = "8.3.0" +version = "8.0.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/46/61/de6cd827efad202d7057d93e0fed9294b96952e188f7384832791c7b2254/click-8.3.0.tar.gz", hash = "sha256:e7b8232224eba16f4ebe410c25ced9f7875cb5f3263ffc93cc3e8da705e229c4", size = 276943, upload-time = "2025-09-18T17:32:23.696Z" } +sdist = { url = "https://files.pythonhosted.org/packages/dd/cf/706c1ad49ab26abed0b77a2f867984c1341ed7387b8030a6aa914e2942a0/click-8.0.4.tar.gz", hash = "sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb", size = 329520, upload-time = "2022-02-18T20:31:30.105Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/db/d3/9dcc0f5797f070ec8edf30fbadfb200e71d9db6b84d211e3b2085a7589a0/click-8.3.0-py3-none-any.whl", hash = "sha256:9b9f285302c6e3064f4330c05f05b81945b2a39544279343e6e7c5f27a9baddc", size = 107295, upload-time = "2025-09-18T17:32:22.42Z" }, + { url = "https://files.pythonhosted.org/packages/4a/a8/0b2ced25639fb20cc1c9784de90a8c25f9504a7f18cd8b5397bd61696d7d/click-8.0.4-py3-none-any.whl", hash = "sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1", size = 97486, upload-time = "2022-02-18T20:31:27.733Z" }, ] [[package]] @@ -487,6 +500,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b2/a3/e137168c9c44d18eff0376253da9f1e9234d0239e0ee230d2fee6cea8e55/jeepney-0.9.0-py3-none-any.whl", hash = "sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683", size = 49010, upload-time = "2025-02-27T18:51:00.104Z" }, ] +[[package]] +name = "jmespath" +version = "0.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3c/56/3f325b1eef9791759784aa5046a8f6a1aff8f7c898a2e34506771d3b99d8/jmespath-0.10.0.tar.gz", hash = "sha256:b85d0567b8666149a93172712e68920734333c0ce7e89b78b3e987f71e5ed4f9", size = 21607, upload-time = "2020-05-12T22:03:47.267Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/cb/5f001272b6faeb23c1c9e0acc04d48eaaf5c862c17709d20e3469c6e0139/jmespath-0.10.0-py2.py3-none-any.whl", hash = "sha256:cdf6525904cc597730141d61b36f2e4b8ecc257c420fa2f4549bac2c2d0cb72f", size = 24489, upload-time = "2020-05-12T22:03:45.643Z" }, +] + [[package]] name = "jsonschema" version = "4.25.1" @@ -657,7 +679,7 @@ wheels = [ [[package]] name = "oci" -version = "2.160.0" +version = "2.164.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, @@ -667,9 +689,34 @@ dependencies = [ { name = "python-dateutil" }, { name = "pytz" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f3/7b/c9d7fc28f11c25c7875db3584eab5d52ccb2d7df553d07ac47f19a14d075/oci-2.160.0.tar.gz", hash = "sha256:f8e3410204c1405b40247179550cf74f5145a8e17025c4f2a92f2b9ffdc7d26b", size = 15601606, upload-time = "2025-09-09T04:17:43.728Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6e/fc/1c227e66ad949858b4388b18df76c9ef834228c3ca4b3c38c4cc7a099171/oci-2.164.1.tar.gz", hash = "sha256:2089632da42e9f556de046b6663050f2a046b06603eeefb90dc79810e91ee2c5", size = 16177816, upload-time = "2025-12-09T10:39:25.947Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/71/7c5725cd015aded721b3c36c25d1be302dfc11dc80ab966243663f9e1a1a/oci-2.164.1-py3-none-any.whl", hash = "sha256:65869381433e7a48ba5adfb63cf275e77bad4dd2ea79887e0a61110962252e3a", size = 32980817, upload-time = "2025-12-09T10:39:15.459Z" }, +] + +[[package]] +name = "oci-cli" +version = "3.71.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "arrow" }, + { name = "certifi" }, + { name = "click" }, + { name = "cryptography" }, + { name = "jmespath" }, + { name = "oci" }, + { name = "prompt-toolkit" }, + { name = "pyopenssl" }, + { name = "python-dateutil" }, + { name = "pytz" }, + { name = "pyyaml" }, + { name = "setuptools" }, + { name = "six" }, + { name = "terminaltables" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0f/34/f49d7a531968edc727a0ed6da2c66dc5317738c8c75e224cca690ba11cbd/oci_cli-3.71.1.tar.gz", hash = "sha256:91e1674f6c2f59d3c955be77e68b209967fa3fc3be53a5421177bb0bf3d5557d", size = 7726932, upload-time = "2025-12-09T13:13:29.326Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/78/51/752375a4e0d2de371c2788414157eda337417010d2ef7383cd7140388f1e/oci-2.160.0-py3-none-any.whl", hash = "sha256:3dba1ec671ebea23f255fabf836cb0fd08aea0913a8df85610fccaa5a4344ee9", size = 31715365, upload-time = "2025-09-09T04:17:34.998Z" }, + { url = "https://files.pythonhosted.org/packages/e2/9d/ea8a5583eb97174eb997f2050e47a422d24cf229888fcfe0ddb7c9b8b452/oci_cli-3.71.1-py3-none-any.whl", hash = "sha256:e91e8ffaeb373db3ad0c95d49b6137e59c3277f3911a099927efedae55a3d761", size = 25219923, upload-time = "2025-12-09T13:13:23.387Z" }, ] [[package]] @@ -735,11 +782,11 @@ wheels = [ [[package]] name = "oracle-oci-logging-mcp-server" -version = "1.2.0" +version = "1.2.1" source = { editable = "." } dependencies = [ { name = "fastmcp" }, - { name = "oci" }, + { name = "oci-cli" }, { name = "pydantic" }, ] @@ -753,7 +800,7 @@ dev = [ [package.metadata] requires-dist = [ { name = "fastmcp", specifier = "==2.13.0" }, - { name = "oci", specifier = "==2.160.0" }, + { name = "oci-cli", specifier = "==3.71.1" }, { name = "pydantic", specifier = "==2.12.3" }, ] @@ -818,6 +865,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, ] +[[package]] +name = "prompt-toolkit" +version = "3.0.43" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cc/c6/25b6a3d5cd295304de1e32c9edbcf319a52e965b339629d37d42bb7126ca/prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d", size = 425733, upload-time = "2023-12-13T08:44:39.127Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ee/fd/ca7bf3869e7caa7a037e23078539467b433a4e01eebd93f77180ab927766/prompt_toolkit-3.0.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6", size = 386072, upload-time = "2023-12-13T08:44:35.304Z" }, +] + [[package]] name = "py-key-value-aio" version = "0.2.8" @@ -1257,6 +1316,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/46/f5af3402b579fd5e11573ce652019a67074317e18c1935cc0b4ba9b35552/secretstorage-3.5.0-py3-none-any.whl", hash = "sha256:0ce65888c0725fcb2c5bc0fdb8e5438eece02c523557ea40ce0703c266248137", size = 15554, upload-time = "2025-11-23T19:02:51.545Z" }, ] +[[package]] +name = "setuptools" +version = "80.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c", size = 1319958, upload-time = "2025-05-27T00:56:51.443Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", size = 1201486, upload-time = "2025-05-27T00:56:49.664Z" }, +] + [[package]] name = "six" version = "1.17.0" @@ -1299,6 +1367,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/be/72/2db2f49247d0a18b4f1bb9a5a39a0162869acf235f3a96418363947b3d46/starlette-0.48.0-py3-none-any.whl", hash = "sha256:0764ca97b097582558ecb498132ed0c7d942f233f365b86ba37770e026510659", size = 73736, upload-time = "2025-09-13T08:41:03.869Z" }, ] +[[package]] +name = "terminaltables" +version = "3.1.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/fc/0b73d782f5ab7feba8d007573a3773c58255f223c5940a7b7085f02153c3/terminaltables-3.1.10.tar.gz", hash = "sha256:ba6eca5cb5ba02bba4c9f4f985af80c54ec3dccf94cfcd190154386255e47543", size = 12264, upload-time = "2021-12-07T19:03:35.758Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/fb/ea621e0a19733e01fe4005d46087d383693c0f4a8f824b47d8d4122c87e0/terminaltables-3.1.10-py2.py3-none-any.whl", hash = "sha256:e4fdc4179c9e4aab5f674d80f09d76fa436b96fdc698a8505e0a36bf0804a874", size = 15155, upload-time = "2021-12-07T19:03:34.013Z" }, +] + [[package]] name = "typing-extensions" version = "4.15.0" @@ -1320,6 +1397,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611, upload-time = "2025-10-01T02:14:40.154Z" }, ] +[[package]] +name = "tzdata" +version = "2025.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload-time = "2025-03-23T13:54:43.652Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload-time = "2025-03-23T13:54:41.845Z" }, +] + [[package]] name = "urllib3" version = "2.5.0" @@ -1342,6 +1428,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/96/06/5cc0542b47c0338c1cb676b348e24a1c29acabc81000bced518231dded6f/uvicorn-0.36.0-py3-none-any.whl", hash = "sha256:6bb4ba67f16024883af8adf13aba3a9919e415358604ce46780d3f9bdc36d731", size = 67675, upload-time = "2025-09-20T01:07:12.984Z" }, ] +[[package]] +name = "wcwidth" +version = "0.2.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/30/6b0809f4510673dc723187aeaf24c7f5459922d01e2f794277a3dfb90345/wcwidth-0.2.14.tar.gz", hash = "sha256:4d478375d31bc5395a3c55c40ccdf3354688364cd61c4f6adacaa9215d0b3605", size = 102293, upload-time = "2025-09-22T16:29:53.023Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl", hash = "sha256:a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1", size = 37286, upload-time = "2025-09-22T16:29:51.641Z" }, +] + [[package]] name = "websockets" version = "15.0.1" diff --git a/src/oci-migration-mcp-server/Dockerfile b/src/oci-migration-mcp-server/Dockerfile new file mode 100644 index 00000000..841d2b88 --- /dev/null +++ b/src/oci-migration-mcp-server/Dockerfile @@ -0,0 +1,30 @@ +# Copyright (c) 2025, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v1.0 as shown at +# https://oss.oracle.com/licenses/upl. + +FROM ghcr.io/oracle/oraclelinux@sha256:1950389c3dd619841813520b4e69d7f3112c4c10f713fcb90680703d184c33ad + +# Install python 3.13 +RUN microdnf install epel-release && \ + microdnf install python3.13 python3.13-pip \ + && rm -rf /var/cache/dnf/* \ + && useradd -m -d /app oracle + +# Copy the MCP server to the docker container +WORKDIR /app +COPY --chown=oracle:oracle . /app + +# Install dependencies +RUN pip3.13 install --no-cache-dir uv && \ + uv --no-cache sync --locked --all-extras + +# Change user +USER oracle + +# HTTP support +ENV ORACLE_MCP_HOST="" +ENV ORACLE_MCP_PORT="" + +# Start the MCP server +ENTRYPOINT ["uv", "run"] +CMD ["oracle.oci-migration-mcp-server"] diff --git a/src/oci-migration-mcp-server/oracle/oci_migration_mcp_server/__init__.py b/src/oci-migration-mcp-server/oracle/oci_migration_mcp_server/__init__.py index 676d7f36..914f4453 100644 --- a/src/oci-migration-mcp-server/oracle/oci_migration_mcp_server/__init__.py +++ b/src/oci-migration-mcp-server/oracle/oci_migration_mcp_server/__init__.py @@ -5,4 +5,4 @@ """ __project__ = "oracle.oci-migration-mcp-server" -__version__ = "2.1.0" +__version__ = "2.1.1" diff --git a/src/oci-migration-mcp-server/oracle/oci_migration_mcp_server/server.py b/src/oci-migration-mcp-server/oracle/oci_migration_mcp_server/server.py index a4ae7993..7ded0f87 100644 --- a/src/oci-migration-mcp-server/oracle/oci_migration_mcp_server/server.py +++ b/src/oci-migration-mcp-server/oracle/oci_migration_mcp_server/server.py @@ -33,7 +33,7 @@ def get_migration_client(): user_agent_name = __project__.split("oracle.", 1)[1].split("-server", 1)[0] config["additional_user_agent"] = f"{user_agent_name}/{__version__}" private_key = oci.signer.load_private_key_from_file(config["key_file"]) - token_file = config["security_token_file"] + token_file = os.path.expanduser(config["security_token_file"]) token = None with open(token_file, "r") as f: token = f.read() diff --git a/src/oci-migration-mcp-server/pyproject.toml b/src/oci-migration-mcp-server/pyproject.toml index 8223987f..98740a9d 100644 --- a/src/oci-migration-mcp-server/pyproject.toml +++ b/src/oci-migration-mcp-server/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "oracle.oci-migration-mcp-server" -version = "2.1.0" +version = "2.1.1" description = "Add your description here" readme = "README.md" requires-python = ">=3.13" @@ -11,7 +11,7 @@ authors = [ ] dependencies = [ "fastmcp==2.13.0", - "oci==2.160.0", + "oci-cli==3.71.1", ] classifiers = [ diff --git a/src/oci-migration-mcp-server/uv.lock b/src/oci-migration-mcp-server/uv.lock index 61c26978..aa5d4f86 100644 --- a/src/oci-migration-mcp-server/uv.lock +++ b/src/oci-migration-mcp-server/uv.lock @@ -24,6 +24,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6f/12/e5e0282d673bb9746bacfb6e2dba8719989d3660cdb2ea79aee9a9651afb/anyio-4.10.0-py3-none-any.whl", hash = "sha256:60e474ac86736bbfd6f210f7a61218939c318f43f9972497381f1c5e930ed3d1", size = 107213, upload-time = "2025-08-04T08:54:24.882Z" }, ] +[[package]] +name = "arrow" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-dateutil" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/33/032cdc44182491aa708d06a68b62434140d8c50820a087fac7af37703357/arrow-1.4.0.tar.gz", hash = "sha256:ed0cc050e98001b8779e84d461b0098c4ac597e88704a655582b21d116e526d7", size = 152931, upload-time = "2025-10-18T17:46:46.761Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/c9/d7977eaacb9df673210491da99e6a247e93df98c715fc43fd136ce1d3d33/arrow-1.4.0-py3-none-any.whl", hash = "sha256:749f0769958ebdc79c173ff0b0670d59051a535fa26e8eba02953dc19eb43205", size = 68797, upload-time = "2025-10-18T17:46:45.663Z" }, +] + [[package]] name = "attrs" version = "25.3.0" @@ -159,14 +172,14 @@ wheels = [ [[package]] name = "click" -version = "8.3.0" +version = "8.0.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/46/61/de6cd827efad202d7057d93e0fed9294b96952e188f7384832791c7b2254/click-8.3.0.tar.gz", hash = "sha256:e7b8232224eba16f4ebe410c25ced9f7875cb5f3263ffc93cc3e8da705e229c4", size = 276943, upload-time = "2025-09-18T17:32:23.696Z" } +sdist = { url = "https://files.pythonhosted.org/packages/dd/cf/706c1ad49ab26abed0b77a2f867984c1341ed7387b8030a6aa914e2942a0/click-8.0.4.tar.gz", hash = "sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb", size = 329520, upload-time = "2022-02-18T20:31:30.105Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/db/d3/9dcc0f5797f070ec8edf30fbadfb200e71d9db6b84d211e3b2085a7589a0/click-8.3.0-py3-none-any.whl", hash = "sha256:9b9f285302c6e3064f4330c05f05b81945b2a39544279343e6e7c5f27a9baddc", size = 107295, upload-time = "2025-09-18T17:32:22.42Z" }, + { url = "https://files.pythonhosted.org/packages/4a/a8/0b2ced25639fb20cc1c9784de90a8c25f9504a7f18cd8b5397bd61696d7d/click-8.0.4-py3-none-any.whl", hash = "sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1", size = 97486, upload-time = "2022-02-18T20:31:27.733Z" }, ] [[package]] @@ -487,6 +500,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b2/a3/e137168c9c44d18eff0376253da9f1e9234d0239e0ee230d2fee6cea8e55/jeepney-0.9.0-py3-none-any.whl", hash = "sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683", size = 49010, upload-time = "2025-02-27T18:51:00.104Z" }, ] +[[package]] +name = "jmespath" +version = "0.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3c/56/3f325b1eef9791759784aa5046a8f6a1aff8f7c898a2e34506771d3b99d8/jmespath-0.10.0.tar.gz", hash = "sha256:b85d0567b8666149a93172712e68920734333c0ce7e89b78b3e987f71e5ed4f9", size = 21607, upload-time = "2020-05-12T22:03:47.267Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/cb/5f001272b6faeb23c1c9e0acc04d48eaaf5c862c17709d20e3469c6e0139/jmespath-0.10.0-py2.py3-none-any.whl", hash = "sha256:cdf6525904cc597730141d61b36f2e4b8ecc257c420fa2f4549bac2c2d0cb72f", size = 24489, upload-time = "2020-05-12T22:03:45.643Z" }, +] + [[package]] name = "jsonschema" version = "4.25.1" @@ -657,7 +679,7 @@ wheels = [ [[package]] name = "oci" -version = "2.160.0" +version = "2.164.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, @@ -667,9 +689,34 @@ dependencies = [ { name = "python-dateutil" }, { name = "pytz" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f3/7b/c9d7fc28f11c25c7875db3584eab5d52ccb2d7df553d07ac47f19a14d075/oci-2.160.0.tar.gz", hash = "sha256:f8e3410204c1405b40247179550cf74f5145a8e17025c4f2a92f2b9ffdc7d26b", size = 15601606, upload-time = "2025-09-09T04:17:43.728Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6e/fc/1c227e66ad949858b4388b18df76c9ef834228c3ca4b3c38c4cc7a099171/oci-2.164.1.tar.gz", hash = "sha256:2089632da42e9f556de046b6663050f2a046b06603eeefb90dc79810e91ee2c5", size = 16177816, upload-time = "2025-12-09T10:39:25.947Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/71/7c5725cd015aded721b3c36c25d1be302dfc11dc80ab966243663f9e1a1a/oci-2.164.1-py3-none-any.whl", hash = "sha256:65869381433e7a48ba5adfb63cf275e77bad4dd2ea79887e0a61110962252e3a", size = 32980817, upload-time = "2025-12-09T10:39:15.459Z" }, +] + +[[package]] +name = "oci-cli" +version = "3.71.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "arrow" }, + { name = "certifi" }, + { name = "click" }, + { name = "cryptography" }, + { name = "jmespath" }, + { name = "oci" }, + { name = "prompt-toolkit" }, + { name = "pyopenssl" }, + { name = "python-dateutil" }, + { name = "pytz" }, + { name = "pyyaml" }, + { name = "setuptools" }, + { name = "six" }, + { name = "terminaltables" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0f/34/f49d7a531968edc727a0ed6da2c66dc5317738c8c75e224cca690ba11cbd/oci_cli-3.71.1.tar.gz", hash = "sha256:91e1674f6c2f59d3c955be77e68b209967fa3fc3be53a5421177bb0bf3d5557d", size = 7726932, upload-time = "2025-12-09T13:13:29.326Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/78/51/752375a4e0d2de371c2788414157eda337417010d2ef7383cd7140388f1e/oci-2.160.0-py3-none-any.whl", hash = "sha256:3dba1ec671ebea23f255fabf836cb0fd08aea0913a8df85610fccaa5a4344ee9", size = 31715365, upload-time = "2025-09-09T04:17:34.998Z" }, + { url = "https://files.pythonhosted.org/packages/e2/9d/ea8a5583eb97174eb997f2050e47a422d24cf229888fcfe0ddb7c9b8b452/oci_cli-3.71.1-py3-none-any.whl", hash = "sha256:e91e8ffaeb373db3ad0c95d49b6137e59c3277f3911a099927efedae55a3d761", size = 25219923, upload-time = "2025-12-09T13:13:23.387Z" }, ] [[package]] @@ -735,11 +782,11 @@ wheels = [ [[package]] name = "oracle-oci-migration-mcp-server" -version = "2.1.0" +version = "2.1.1" source = { editable = "." } dependencies = [ { name = "fastmcp" }, - { name = "oci" }, + { name = "oci-cli" }, ] [package.dev-dependencies] @@ -752,7 +799,7 @@ dev = [ [package.metadata] requires-dist = [ { name = "fastmcp", specifier = "==2.13.0" }, - { name = "oci", specifier = "==2.160.0" }, + { name = "oci-cli", specifier = "==3.71.1" }, ] [package.metadata.requires-dev] @@ -816,6 +863,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, ] +[[package]] +name = "prompt-toolkit" +version = "3.0.43" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cc/c6/25b6a3d5cd295304de1e32c9edbcf319a52e965b339629d37d42bb7126ca/prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d", size = 425733, upload-time = "2023-12-13T08:44:39.127Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ee/fd/ca7bf3869e7caa7a037e23078539467b433a4e01eebd93f77180ab927766/prompt_toolkit-3.0.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6", size = 386072, upload-time = "2023-12-13T08:44:35.304Z" }, +] + [[package]] name = "py-key-value-aio" version = "0.2.8" @@ -1234,6 +1293,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/46/f5af3402b579fd5e11573ce652019a67074317e18c1935cc0b4ba9b35552/secretstorage-3.5.0-py3-none-any.whl", hash = "sha256:0ce65888c0725fcb2c5bc0fdb8e5438eece02c523557ea40ce0703c266248137", size = 15554, upload-time = "2025-11-23T19:02:51.545Z" }, ] +[[package]] +name = "setuptools" +version = "80.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c", size = 1319958, upload-time = "2025-05-27T00:56:51.443Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", size = 1201486, upload-time = "2025-05-27T00:56:49.664Z" }, +] + [[package]] name = "six" version = "1.17.0" @@ -1276,6 +1344,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/be/72/2db2f49247d0a18b4f1bb9a5a39a0162869acf235f3a96418363947b3d46/starlette-0.48.0-py3-none-any.whl", hash = "sha256:0764ca97b097582558ecb498132ed0c7d942f233f365b86ba37770e026510659", size = 73736, upload-time = "2025-09-13T08:41:03.869Z" }, ] +[[package]] +name = "terminaltables" +version = "3.1.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/fc/0b73d782f5ab7feba8d007573a3773c58255f223c5940a7b7085f02153c3/terminaltables-3.1.10.tar.gz", hash = "sha256:ba6eca5cb5ba02bba4c9f4f985af80c54ec3dccf94cfcd190154386255e47543", size = 12264, upload-time = "2021-12-07T19:03:35.758Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/fb/ea621e0a19733e01fe4005d46087d383693c0f4a8f824b47d8d4122c87e0/terminaltables-3.1.10-py2.py3-none-any.whl", hash = "sha256:e4fdc4179c9e4aab5f674d80f09d76fa436b96fdc698a8505e0a36bf0804a874", size = 15155, upload-time = "2021-12-07T19:03:34.013Z" }, +] + [[package]] name = "typing-extensions" version = "4.15.0" @@ -1297,6 +1374,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/17/69/cd203477f944c353c31bade965f880aa1061fd6bf05ded0726ca845b6ff7/typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51", size = 14552, upload-time = "2025-05-21T18:55:22.152Z" }, ] +[[package]] +name = "tzdata" +version = "2025.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload-time = "2025-03-23T13:54:43.652Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload-time = "2025-03-23T13:54:41.845Z" }, +] + [[package]] name = "urllib3" version = "2.5.0" @@ -1319,6 +1405,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/96/06/5cc0542b47c0338c1cb676b348e24a1c29acabc81000bced518231dded6f/uvicorn-0.36.0-py3-none-any.whl", hash = "sha256:6bb4ba67f16024883af8adf13aba3a9919e415358604ce46780d3f9bdc36d731", size = 67675, upload-time = "2025-09-20T01:07:12.984Z" }, ] +[[package]] +name = "wcwidth" +version = "0.2.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/30/6b0809f4510673dc723187aeaf24c7f5459922d01e2f794277a3dfb90345/wcwidth-0.2.14.tar.gz", hash = "sha256:4d478375d31bc5395a3c55c40ccdf3354688364cd61c4f6adacaa9215d0b3605", size = 102293, upload-time = "2025-09-22T16:29:53.023Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl", hash = "sha256:a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1", size = 37286, upload-time = "2025-09-22T16:29:51.641Z" }, +] + [[package]] name = "websockets" version = "15.0.1" diff --git a/src/oci-monitoring-mcp-server/Dockerfile b/src/oci-monitoring-mcp-server/Dockerfile new file mode 100644 index 00000000..86cb89a4 --- /dev/null +++ b/src/oci-monitoring-mcp-server/Dockerfile @@ -0,0 +1,30 @@ +# Copyright (c) 2025, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v1.0 as shown at +# https://oss.oracle.com/licenses/upl. + +FROM ghcr.io/oracle/oraclelinux@sha256:1950389c3dd619841813520b4e69d7f3112c4c10f713fcb90680703d184c33ad + +# Install python 3.13 +RUN microdnf install epel-release && \ + microdnf install python3.13 python3.13-pip \ + && rm -rf /var/cache/dnf/* \ + && useradd -m -d /app oracle + +# Copy the MCP server to the docker container +WORKDIR /app +COPY --chown=oracle:oracle . /app + +# Install dependencies +RUN pip3.13 install --no-cache-dir uv && \ + uv --no-cache sync --locked --all-extras + +# Change user +USER oracle + +# HTTP support +ENV ORACLE_MCP_HOST="" +ENV ORACLE_MCP_PORT="" + +# Start the MCP server +ENTRYPOINT ["uv", "run"] +CMD ["oracle.oci-monitoring-mcp-server"] diff --git a/src/oci-monitoring-mcp-server/oracle/oci_monitoring_mcp_server/__init__.py b/src/oci-monitoring-mcp-server/oracle/oci_monitoring_mcp_server/__init__.py index 3b5a8d72..ef29f69a 100644 --- a/src/oci-monitoring-mcp-server/oracle/oci_monitoring_mcp_server/__init__.py +++ b/src/oci-monitoring-mcp-server/oracle/oci_monitoring_mcp_server/__init__.py @@ -5,4 +5,4 @@ """ __project__ = "oracle.oci-monitoring-mcp-server" -__version__ = "1.1.0" +__version__ = "1.1.1" diff --git a/src/oci-monitoring-mcp-server/oracle/oci_monitoring_mcp_server/server.py b/src/oci-monitoring-mcp-server/oracle/oci_monitoring_mcp_server/server.py index 2e4aa635..be0b7249 100644 --- a/src/oci-monitoring-mcp-server/oracle/oci_monitoring_mcp_server/server.py +++ b/src/oci-monitoring-mcp-server/oracle/oci_monitoring_mcp_server/server.py @@ -28,7 +28,7 @@ def get_monitoring_client(): config["additional_user_agent"] = f"{user_agent_name}/{__version__}" private_key = oci.signer.load_private_key_from_file(config["key_file"]) - token_file = config["security_token_file"] + token_file = os.path.expanduser(config["security_token_file"]) token = None with open(token_file, "r") as f: token = f.read() diff --git a/src/oci-monitoring-mcp-server/pyproject.toml b/src/oci-monitoring-mcp-server/pyproject.toml index 002f1618..a24c4aa4 100644 --- a/src/oci-monitoring-mcp-server/pyproject.toml +++ b/src/oci-monitoring-mcp-server/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "oracle.oci-monitoring-mcp-server" -version = "1.1.0" +version = "1.1.1" description = "OCI Monitoring Service MCP server" readme = "README.md" requires-python = ">=3.13" @@ -11,7 +11,7 @@ authors = [ ] dependencies = [ "fastmcp==2.13.0", - "oci==2.160.0", + "oci-cli==3.71.1", ] classifiers = [ diff --git a/src/oci-monitoring-mcp-server/uv.lock b/src/oci-monitoring-mcp-server/uv.lock index 569743f5..f60c5259 100644 --- a/src/oci-monitoring-mcp-server/uv.lock +++ b/src/oci-monitoring-mcp-server/uv.lock @@ -24,6 +24,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6f/12/e5e0282d673bb9746bacfb6e2dba8719989d3660cdb2ea79aee9a9651afb/anyio-4.10.0-py3-none-any.whl", hash = "sha256:60e474ac86736bbfd6f210f7a61218939c318f43f9972497381f1c5e930ed3d1", size = 107213, upload-time = "2025-08-04T08:54:24.882Z" }, ] +[[package]] +name = "arrow" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-dateutil" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/33/032cdc44182491aa708d06a68b62434140d8c50820a087fac7af37703357/arrow-1.4.0.tar.gz", hash = "sha256:ed0cc050e98001b8779e84d461b0098c4ac597e88704a655582b21d116e526d7", size = 152931, upload-time = "2025-10-18T17:46:46.761Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/c9/d7977eaacb9df673210491da99e6a247e93df98c715fc43fd136ce1d3d33/arrow-1.4.0-py3-none-any.whl", hash = "sha256:749f0769958ebdc79c173ff0b0670d59051a535fa26e8eba02953dc19eb43205", size = 68797, upload-time = "2025-10-18T17:46:45.663Z" }, +] + [[package]] name = "attrs" version = "25.3.0" @@ -159,14 +172,14 @@ wheels = [ [[package]] name = "click" -version = "8.3.0" +version = "8.0.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/46/61/de6cd827efad202d7057d93e0fed9294b96952e188f7384832791c7b2254/click-8.3.0.tar.gz", hash = "sha256:e7b8232224eba16f4ebe410c25ced9f7875cb5f3263ffc93cc3e8da705e229c4", size = 276943, upload-time = "2025-09-18T17:32:23.696Z" } +sdist = { url = "https://files.pythonhosted.org/packages/dd/cf/706c1ad49ab26abed0b77a2f867984c1341ed7387b8030a6aa914e2942a0/click-8.0.4.tar.gz", hash = "sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb", size = 329520, upload-time = "2022-02-18T20:31:30.105Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/db/d3/9dcc0f5797f070ec8edf30fbadfb200e71d9db6b84d211e3b2085a7589a0/click-8.3.0-py3-none-any.whl", hash = "sha256:9b9f285302c6e3064f4330c05f05b81945b2a39544279343e6e7c5f27a9baddc", size = 107295, upload-time = "2025-09-18T17:32:22.42Z" }, + { url = "https://files.pythonhosted.org/packages/4a/a8/0b2ced25639fb20cc1c9784de90a8c25f9504a7f18cd8b5397bd61696d7d/click-8.0.4-py3-none-any.whl", hash = "sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1", size = 97486, upload-time = "2022-02-18T20:31:27.733Z" }, ] [[package]] @@ -487,6 +500,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b2/a3/e137168c9c44d18eff0376253da9f1e9234d0239e0ee230d2fee6cea8e55/jeepney-0.9.0-py3-none-any.whl", hash = "sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683", size = 49010, upload-time = "2025-02-27T18:51:00.104Z" }, ] +[[package]] +name = "jmespath" +version = "0.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3c/56/3f325b1eef9791759784aa5046a8f6a1aff8f7c898a2e34506771d3b99d8/jmespath-0.10.0.tar.gz", hash = "sha256:b85d0567b8666149a93172712e68920734333c0ce7e89b78b3e987f71e5ed4f9", size = 21607, upload-time = "2020-05-12T22:03:47.267Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/cb/5f001272b6faeb23c1c9e0acc04d48eaaf5c862c17709d20e3469c6e0139/jmespath-0.10.0-py2.py3-none-any.whl", hash = "sha256:cdf6525904cc597730141d61b36f2e4b8ecc257c420fa2f4549bac2c2d0cb72f", size = 24489, upload-time = "2020-05-12T22:03:45.643Z" }, +] + [[package]] name = "jsonschema" version = "4.25.1" @@ -657,7 +679,7 @@ wheels = [ [[package]] name = "oci" -version = "2.160.0" +version = "2.164.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, @@ -667,9 +689,34 @@ dependencies = [ { name = "python-dateutil" }, { name = "pytz" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f3/7b/c9d7fc28f11c25c7875db3584eab5d52ccb2d7df553d07ac47f19a14d075/oci-2.160.0.tar.gz", hash = "sha256:f8e3410204c1405b40247179550cf74f5145a8e17025c4f2a92f2b9ffdc7d26b", size = 15601606, upload-time = "2025-09-09T04:17:43.728Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6e/fc/1c227e66ad949858b4388b18df76c9ef834228c3ca4b3c38c4cc7a099171/oci-2.164.1.tar.gz", hash = "sha256:2089632da42e9f556de046b6663050f2a046b06603eeefb90dc79810e91ee2c5", size = 16177816, upload-time = "2025-12-09T10:39:25.947Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/71/7c5725cd015aded721b3c36c25d1be302dfc11dc80ab966243663f9e1a1a/oci-2.164.1-py3-none-any.whl", hash = "sha256:65869381433e7a48ba5adfb63cf275e77bad4dd2ea79887e0a61110962252e3a", size = 32980817, upload-time = "2025-12-09T10:39:15.459Z" }, +] + +[[package]] +name = "oci-cli" +version = "3.71.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "arrow" }, + { name = "certifi" }, + { name = "click" }, + { name = "cryptography" }, + { name = "jmespath" }, + { name = "oci" }, + { name = "prompt-toolkit" }, + { name = "pyopenssl" }, + { name = "python-dateutil" }, + { name = "pytz" }, + { name = "pyyaml" }, + { name = "setuptools" }, + { name = "six" }, + { name = "terminaltables" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0f/34/f49d7a531968edc727a0ed6da2c66dc5317738c8c75e224cca690ba11cbd/oci_cli-3.71.1.tar.gz", hash = "sha256:91e1674f6c2f59d3c955be77e68b209967fa3fc3be53a5421177bb0bf3d5557d", size = 7726932, upload-time = "2025-12-09T13:13:29.326Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/78/51/752375a4e0d2de371c2788414157eda337417010d2ef7383cd7140388f1e/oci-2.160.0-py3-none-any.whl", hash = "sha256:3dba1ec671ebea23f255fabf836cb0fd08aea0913a8df85610fccaa5a4344ee9", size = 31715365, upload-time = "2025-09-09T04:17:34.998Z" }, + { url = "https://files.pythonhosted.org/packages/e2/9d/ea8a5583eb97174eb997f2050e47a422d24cf229888fcfe0ddb7c9b8b452/oci_cli-3.71.1-py3-none-any.whl", hash = "sha256:e91e8ffaeb373db3ad0c95d49b6137e59c3277f3911a099927efedae55a3d761", size = 25219923, upload-time = "2025-12-09T13:13:23.387Z" }, ] [[package]] @@ -735,11 +782,11 @@ wheels = [ [[package]] name = "oracle-oci-monitoring-mcp-server" -version = "1.1.0" +version = "1.1.1" source = { editable = "." } dependencies = [ { name = "fastmcp" }, - { name = "oci" }, + { name = "oci-cli" }, ] [package.dev-dependencies] @@ -752,7 +799,7 @@ dev = [ [package.metadata] requires-dist = [ { name = "fastmcp", specifier = "==2.13.0" }, - { name = "oci", specifier = "==2.160.0" }, + { name = "oci-cli", specifier = "==3.71.1" }, ] [package.metadata.requires-dev] @@ -816,6 +863,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, ] +[[package]] +name = "prompt-toolkit" +version = "3.0.43" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cc/c6/25b6a3d5cd295304de1e32c9edbcf319a52e965b339629d37d42bb7126ca/prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d", size = 425733, upload-time = "2023-12-13T08:44:39.127Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ee/fd/ca7bf3869e7caa7a037e23078539467b433a4e01eebd93f77180ab927766/prompt_toolkit-3.0.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6", size = 386072, upload-time = "2023-12-13T08:44:35.304Z" }, +] + [[package]] name = "py-key-value-aio" version = "0.2.8" @@ -1234,6 +1293,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/46/f5af3402b579fd5e11573ce652019a67074317e18c1935cc0b4ba9b35552/secretstorage-3.5.0-py3-none-any.whl", hash = "sha256:0ce65888c0725fcb2c5bc0fdb8e5438eece02c523557ea40ce0703c266248137", size = 15554, upload-time = "2025-11-23T19:02:51.545Z" }, ] +[[package]] +name = "setuptools" +version = "80.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c", size = 1319958, upload-time = "2025-05-27T00:56:51.443Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", size = 1201486, upload-time = "2025-05-27T00:56:49.664Z" }, +] + [[package]] name = "six" version = "1.17.0" @@ -1276,6 +1344,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/be/72/2db2f49247d0a18b4f1bb9a5a39a0162869acf235f3a96418363947b3d46/starlette-0.48.0-py3-none-any.whl", hash = "sha256:0764ca97b097582558ecb498132ed0c7d942f233f365b86ba37770e026510659", size = 73736, upload-time = "2025-09-13T08:41:03.869Z" }, ] +[[package]] +name = "terminaltables" +version = "3.1.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/fc/0b73d782f5ab7feba8d007573a3773c58255f223c5940a7b7085f02153c3/terminaltables-3.1.10.tar.gz", hash = "sha256:ba6eca5cb5ba02bba4c9f4f985af80c54ec3dccf94cfcd190154386255e47543", size = 12264, upload-time = "2021-12-07T19:03:35.758Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/fb/ea621e0a19733e01fe4005d46087d383693c0f4a8f824b47d8d4122c87e0/terminaltables-3.1.10-py2.py3-none-any.whl", hash = "sha256:e4fdc4179c9e4aab5f674d80f09d76fa436b96fdc698a8505e0a36bf0804a874", size = 15155, upload-time = "2021-12-07T19:03:34.013Z" }, +] + [[package]] name = "typing-extensions" version = "4.15.0" @@ -1297,6 +1374,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/17/69/cd203477f944c353c31bade965f880aa1061fd6bf05ded0726ca845b6ff7/typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51", size = 14552, upload-time = "2025-05-21T18:55:22.152Z" }, ] +[[package]] +name = "tzdata" +version = "2025.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload-time = "2025-03-23T13:54:43.652Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload-time = "2025-03-23T13:54:41.845Z" }, +] + [[package]] name = "urllib3" version = "2.5.0" @@ -1319,6 +1405,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/96/06/5cc0542b47c0338c1cb676b348e24a1c29acabc81000bced518231dded6f/uvicorn-0.36.0-py3-none-any.whl", hash = "sha256:6bb4ba67f16024883af8adf13aba3a9919e415358604ce46780d3f9bdc36d731", size = 67675, upload-time = "2025-09-20T01:07:12.984Z" }, ] +[[package]] +name = "wcwidth" +version = "0.2.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/30/6b0809f4510673dc723187aeaf24c7f5459922d01e2f794277a3dfb90345/wcwidth-0.2.14.tar.gz", hash = "sha256:4d478375d31bc5395a3c55c40ccdf3354688364cd61c4f6adacaa9215d0b3605", size = 102293, upload-time = "2025-09-22T16:29:53.023Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl", hash = "sha256:a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1", size = 37286, upload-time = "2025-09-22T16:29:51.641Z" }, +] + [[package]] name = "websockets" version = "15.0.1" diff --git a/src/oci-network-load-balancer-mcp-server/Dockerfile b/src/oci-network-load-balancer-mcp-server/Dockerfile new file mode 100644 index 00000000..a9239441 --- /dev/null +++ b/src/oci-network-load-balancer-mcp-server/Dockerfile @@ -0,0 +1,30 @@ +# Copyright (c) 2025, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v1.0 as shown at +# https://oss.oracle.com/licenses/upl. + +FROM ghcr.io/oracle/oraclelinux@sha256:1950389c3dd619841813520b4e69d7f3112c4c10f713fcb90680703d184c33ad + +# Install python 3.13 +RUN microdnf install epel-release && \ + microdnf install python3.13 python3.13-pip \ + && rm -rf /var/cache/dnf/* \ + && useradd -m -d /app oracle + +# Copy the MCP server to the docker container +WORKDIR /app +COPY --chown=oracle:oracle . /app + +# Install dependencies +RUN pip3.13 install --no-cache-dir uv && \ + uv --no-cache sync --locked --all-extras + +# Change user +USER oracle + +# HTTP support +ENV ORACLE_MCP_HOST="" +ENV ORACLE_MCP_PORT="" + +# Start the MCP server +ENTRYPOINT ["uv", "run"] +CMD ["oracle.oci-network-load-balancer-mcp-server"] diff --git a/src/oci-network-load-balancer-mcp-server/oracle/oci_network_load_balancer_mcp_server/__init__.py b/src/oci-network-load-balancer-mcp-server/oracle/oci_network_load_balancer_mcp_server/__init__.py index 88c20fc0..adc89bfc 100644 --- a/src/oci-network-load-balancer-mcp-server/oracle/oci_network_load_balancer_mcp_server/__init__.py +++ b/src/oci-network-load-balancer-mcp-server/oracle/oci_network_load_balancer_mcp_server/__init__.py @@ -5,4 +5,4 @@ """ __project__ = "oracle.oci-network-load-balancer-mcp-server" -__version__ = "2.1.0" +__version__ = "2.1.1" diff --git a/src/oci-network-load-balancer-mcp-server/oracle/oci_network_load_balancer_mcp_server/server.py b/src/oci-network-load-balancer-mcp-server/oracle/oci_network_load_balancer_mcp_server/server.py index e4af8de6..5a9d9b98 100644 --- a/src/oci-network-load-balancer-mcp-server/oracle/oci_network_load_balancer_mcp_server/server.py +++ b/src/oci-network-load-balancer-mcp-server/oracle/oci_network_load_balancer_mcp_server/server.py @@ -36,7 +36,7 @@ def get_nlb_client(): ) private_key = oci.signer.load_private_key_from_file(config["key_file"]) - token_file = config["security_token_file"] + token_file = os.path.expanduser(config["security_token_file"]) token = None with open(token_file, "r") as f: token = f.read() diff --git a/src/oci-network-load-balancer-mcp-server/pyproject.toml b/src/oci-network-load-balancer-mcp-server/pyproject.toml index 89d2d897..244f7a84 100644 --- a/src/oci-network-load-balancer-mcp-server/pyproject.toml +++ b/src/oci-network-load-balancer-mcp-server/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "oracle.oci-network-load-balancer-mcp-server" -version = "2.1.0" +version = "2.1.1" description = "OCI Network Load Balancer MCP server" readme = "README.md" requires-python = ">=3.13" @@ -11,7 +11,7 @@ authors = [ ] dependencies = [ "fastmcp==2.13.0", - "oci==2.160.0", + "oci-cli==3.71.1", ] classifiers = [ diff --git a/src/oci-network-load-balancer-mcp-server/uv.lock b/src/oci-network-load-balancer-mcp-server/uv.lock index 9befe36f..1f5ae33a 100644 --- a/src/oci-network-load-balancer-mcp-server/uv.lock +++ b/src/oci-network-load-balancer-mcp-server/uv.lock @@ -24,6 +24,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6f/12/e5e0282d673bb9746bacfb6e2dba8719989d3660cdb2ea79aee9a9651afb/anyio-4.10.0-py3-none-any.whl", hash = "sha256:60e474ac86736bbfd6f210f7a61218939c318f43f9972497381f1c5e930ed3d1", size = 107213, upload-time = "2025-08-04T08:54:24.882Z" }, ] +[[package]] +name = "arrow" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-dateutil" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/33/032cdc44182491aa708d06a68b62434140d8c50820a087fac7af37703357/arrow-1.4.0.tar.gz", hash = "sha256:ed0cc050e98001b8779e84d461b0098c4ac597e88704a655582b21d116e526d7", size = 152931, upload-time = "2025-10-18T17:46:46.761Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/c9/d7977eaacb9df673210491da99e6a247e93df98c715fc43fd136ce1d3d33/arrow-1.4.0-py3-none-any.whl", hash = "sha256:749f0769958ebdc79c173ff0b0670d59051a535fa26e8eba02953dc19eb43205", size = 68797, upload-time = "2025-10-18T17:46:45.663Z" }, +] + [[package]] name = "attrs" version = "25.3.0" @@ -159,14 +172,14 @@ wheels = [ [[package]] name = "click" -version = "8.3.0" +version = "8.0.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/46/61/de6cd827efad202d7057d93e0fed9294b96952e188f7384832791c7b2254/click-8.3.0.tar.gz", hash = "sha256:e7b8232224eba16f4ebe410c25ced9f7875cb5f3263ffc93cc3e8da705e229c4", size = 276943, upload-time = "2025-09-18T17:32:23.696Z" } +sdist = { url = "https://files.pythonhosted.org/packages/dd/cf/706c1ad49ab26abed0b77a2f867984c1341ed7387b8030a6aa914e2942a0/click-8.0.4.tar.gz", hash = "sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb", size = 329520, upload-time = "2022-02-18T20:31:30.105Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/db/d3/9dcc0f5797f070ec8edf30fbadfb200e71d9db6b84d211e3b2085a7589a0/click-8.3.0-py3-none-any.whl", hash = "sha256:9b9f285302c6e3064f4330c05f05b81945b2a39544279343e6e7c5f27a9baddc", size = 107295, upload-time = "2025-09-18T17:32:22.42Z" }, + { url = "https://files.pythonhosted.org/packages/4a/a8/0b2ced25639fb20cc1c9784de90a8c25f9504a7f18cd8b5397bd61696d7d/click-8.0.4-py3-none-any.whl", hash = "sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1", size = 97486, upload-time = "2022-02-18T20:31:27.733Z" }, ] [[package]] @@ -487,6 +500,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b2/a3/e137168c9c44d18eff0376253da9f1e9234d0239e0ee230d2fee6cea8e55/jeepney-0.9.0-py3-none-any.whl", hash = "sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683", size = 49010, upload-time = "2025-02-27T18:51:00.104Z" }, ] +[[package]] +name = "jmespath" +version = "0.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3c/56/3f325b1eef9791759784aa5046a8f6a1aff8f7c898a2e34506771d3b99d8/jmespath-0.10.0.tar.gz", hash = "sha256:b85d0567b8666149a93172712e68920734333c0ce7e89b78b3e987f71e5ed4f9", size = 21607, upload-time = "2020-05-12T22:03:47.267Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/cb/5f001272b6faeb23c1c9e0acc04d48eaaf5c862c17709d20e3469c6e0139/jmespath-0.10.0-py2.py3-none-any.whl", hash = "sha256:cdf6525904cc597730141d61b36f2e4b8ecc257c420fa2f4549bac2c2d0cb72f", size = 24489, upload-time = "2020-05-12T22:03:45.643Z" }, +] + [[package]] name = "jsonschema" version = "4.25.1" @@ -657,7 +679,7 @@ wheels = [ [[package]] name = "oci" -version = "2.160.0" +version = "2.164.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, @@ -667,9 +689,34 @@ dependencies = [ { name = "python-dateutil" }, { name = "pytz" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f3/7b/c9d7fc28f11c25c7875db3584eab5d52ccb2d7df553d07ac47f19a14d075/oci-2.160.0.tar.gz", hash = "sha256:f8e3410204c1405b40247179550cf74f5145a8e17025c4f2a92f2b9ffdc7d26b", size = 15601606, upload-time = "2025-09-09T04:17:43.728Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6e/fc/1c227e66ad949858b4388b18df76c9ef834228c3ca4b3c38c4cc7a099171/oci-2.164.1.tar.gz", hash = "sha256:2089632da42e9f556de046b6663050f2a046b06603eeefb90dc79810e91ee2c5", size = 16177816, upload-time = "2025-12-09T10:39:25.947Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/71/7c5725cd015aded721b3c36c25d1be302dfc11dc80ab966243663f9e1a1a/oci-2.164.1-py3-none-any.whl", hash = "sha256:65869381433e7a48ba5adfb63cf275e77bad4dd2ea79887e0a61110962252e3a", size = 32980817, upload-time = "2025-12-09T10:39:15.459Z" }, +] + +[[package]] +name = "oci-cli" +version = "3.71.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "arrow" }, + { name = "certifi" }, + { name = "click" }, + { name = "cryptography" }, + { name = "jmespath" }, + { name = "oci" }, + { name = "prompt-toolkit" }, + { name = "pyopenssl" }, + { name = "python-dateutil" }, + { name = "pytz" }, + { name = "pyyaml" }, + { name = "setuptools" }, + { name = "six" }, + { name = "terminaltables" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0f/34/f49d7a531968edc727a0ed6da2c66dc5317738c8c75e224cca690ba11cbd/oci_cli-3.71.1.tar.gz", hash = "sha256:91e1674f6c2f59d3c955be77e68b209967fa3fc3be53a5421177bb0bf3d5557d", size = 7726932, upload-time = "2025-12-09T13:13:29.326Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/78/51/752375a4e0d2de371c2788414157eda337417010d2ef7383cd7140388f1e/oci-2.160.0-py3-none-any.whl", hash = "sha256:3dba1ec671ebea23f255fabf836cb0fd08aea0913a8df85610fccaa5a4344ee9", size = 31715365, upload-time = "2025-09-09T04:17:34.998Z" }, + { url = "https://files.pythonhosted.org/packages/e2/9d/ea8a5583eb97174eb997f2050e47a422d24cf229888fcfe0ddb7c9b8b452/oci_cli-3.71.1-py3-none-any.whl", hash = "sha256:e91e8ffaeb373db3ad0c95d49b6137e59c3277f3911a099927efedae55a3d761", size = 25219923, upload-time = "2025-12-09T13:13:23.387Z" }, ] [[package]] @@ -735,11 +782,11 @@ wheels = [ [[package]] name = "oracle-oci-network-load-balancer-mcp-server" -version = "2.1.0" +version = "2.1.1" source = { editable = "." } dependencies = [ { name = "fastmcp" }, - { name = "oci" }, + { name = "oci-cli" }, ] [package.dev-dependencies] @@ -752,7 +799,7 @@ dev = [ [package.metadata] requires-dist = [ { name = "fastmcp", specifier = "==2.13.0" }, - { name = "oci", specifier = "==2.160.0" }, + { name = "oci-cli", specifier = "==3.71.1" }, ] [package.metadata.requires-dev] @@ -816,6 +863,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, ] +[[package]] +name = "prompt-toolkit" +version = "3.0.43" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cc/c6/25b6a3d5cd295304de1e32c9edbcf319a52e965b339629d37d42bb7126ca/prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d", size = 425733, upload-time = "2023-12-13T08:44:39.127Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ee/fd/ca7bf3869e7caa7a037e23078539467b433a4e01eebd93f77180ab927766/prompt_toolkit-3.0.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6", size = 386072, upload-time = "2023-12-13T08:44:35.304Z" }, +] + [[package]] name = "py-key-value-aio" version = "0.2.8" @@ -1234,6 +1293,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/46/f5af3402b579fd5e11573ce652019a67074317e18c1935cc0b4ba9b35552/secretstorage-3.5.0-py3-none-any.whl", hash = "sha256:0ce65888c0725fcb2c5bc0fdb8e5438eece02c523557ea40ce0703c266248137", size = 15554, upload-time = "2025-11-23T19:02:51.545Z" }, ] +[[package]] +name = "setuptools" +version = "80.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c", size = 1319958, upload-time = "2025-05-27T00:56:51.443Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", size = 1201486, upload-time = "2025-05-27T00:56:49.664Z" }, +] + [[package]] name = "six" version = "1.17.0" @@ -1276,6 +1344,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/be/72/2db2f49247d0a18b4f1bb9a5a39a0162869acf235f3a96418363947b3d46/starlette-0.48.0-py3-none-any.whl", hash = "sha256:0764ca97b097582558ecb498132ed0c7d942f233f365b86ba37770e026510659", size = 73736, upload-time = "2025-09-13T08:41:03.869Z" }, ] +[[package]] +name = "terminaltables" +version = "3.1.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/fc/0b73d782f5ab7feba8d007573a3773c58255f223c5940a7b7085f02153c3/terminaltables-3.1.10.tar.gz", hash = "sha256:ba6eca5cb5ba02bba4c9f4f985af80c54ec3dccf94cfcd190154386255e47543", size = 12264, upload-time = "2021-12-07T19:03:35.758Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/fb/ea621e0a19733e01fe4005d46087d383693c0f4a8f824b47d8d4122c87e0/terminaltables-3.1.10-py2.py3-none-any.whl", hash = "sha256:e4fdc4179c9e4aab5f674d80f09d76fa436b96fdc698a8505e0a36bf0804a874", size = 15155, upload-time = "2021-12-07T19:03:34.013Z" }, +] + [[package]] name = "typing-extensions" version = "4.15.0" @@ -1297,6 +1374,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/17/69/cd203477f944c353c31bade965f880aa1061fd6bf05ded0726ca845b6ff7/typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51", size = 14552, upload-time = "2025-05-21T18:55:22.152Z" }, ] +[[package]] +name = "tzdata" +version = "2025.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload-time = "2025-03-23T13:54:43.652Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload-time = "2025-03-23T13:54:41.845Z" }, +] + [[package]] name = "urllib3" version = "2.5.0" @@ -1319,6 +1405,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d2/e2/dc81b1bd1dcfe91735810265e9d26bc8ec5da45b4c0f6237e286819194c3/uvicorn-0.35.0-py3-none-any.whl", hash = "sha256:197535216b25ff9b785e29a0b79199f55222193d47f820816e7da751e9bc8d4a", size = 66406, upload-time = "2025-06-28T16:15:44.816Z" }, ] +[[package]] +name = "wcwidth" +version = "0.2.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/30/6b0809f4510673dc723187aeaf24c7f5459922d01e2f794277a3dfb90345/wcwidth-0.2.14.tar.gz", hash = "sha256:4d478375d31bc5395a3c55c40ccdf3354688364cd61c4f6adacaa9215d0b3605", size = 102293, upload-time = "2025-09-22T16:29:53.023Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl", hash = "sha256:a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1", size = 37286, upload-time = "2025-09-22T16:29:51.641Z" }, +] + [[package]] name = "websockets" version = "15.0.1" diff --git a/src/oci-networking-mcp-server/.dockerignore b/src/oci-networking-mcp-server/.dockerignore new file mode 100644 index 00000000..451067cc --- /dev/null +++ b/src/oci-networking-mcp-server/.dockerignore @@ -0,0 +1,10 @@ +.venv +venv +bldvenv + +.pytest_cache +dist +**/__pycache__ + +htmlcov +.coverage diff --git a/src/oci-networking-mcp-server/Dockerfile b/src/oci-networking-mcp-server/Dockerfile new file mode 100644 index 00000000..084f661b --- /dev/null +++ b/src/oci-networking-mcp-server/Dockerfile @@ -0,0 +1,30 @@ +# Copyright (c) 2025, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v1.0 as shown at +# https://oss.oracle.com/licenses/upl. + +FROM ghcr.io/oracle/oraclelinux@sha256:1950389c3dd619841813520b4e69d7f3112c4c10f713fcb90680703d184c33ad + +# Install python 3.13 +RUN microdnf install epel-release && \ + microdnf install python3.13 python3.13-pip \ + && rm -rf /var/cache/dnf/* \ + && useradd -m -d /app oracle + +# Copy the MCP server to the docker container +WORKDIR /app +COPY --chown=oracle:oracle . /app + +# Install dependencies +RUN pip3.13 install --no-cache-dir uv && \ + uv --no-cache sync --locked --all-extras + +# Change user +USER oracle + +# HTTP support +ENV ORACLE_MCP_HOST="" +ENV ORACLE_MCP_PORT="" + +# Start the MCP server +ENTRYPOINT ["uv", "run"] +CMD ["oracle.oci-networking-mcp-server"] diff --git a/src/oci-networking-mcp-server/oracle/oci_networking_mcp_server/__init__.py b/src/oci-networking-mcp-server/oracle/oci_networking_mcp_server/__init__.py index bc2dfdf3..f169e3ac 100644 --- a/src/oci-networking-mcp-server/oracle/oci_networking_mcp_server/__init__.py +++ b/src/oci-networking-mcp-server/oracle/oci_networking_mcp_server/__init__.py @@ -5,4 +5,4 @@ """ __project__ = "oracle.oci-networking-mcp-server" -__version__ = "1.2.0" +__version__ = "1.2.1" diff --git a/src/oci-networking-mcp-server/oracle/oci_networking_mcp_server/server.py b/src/oci-networking-mcp-server/oracle/oci_networking_mcp_server/server.py index bfa80efb..37a8da33 100644 --- a/src/oci-networking-mcp-server/oracle/oci_networking_mcp_server/server.py +++ b/src/oci-networking-mcp-server/oracle/oci_networking_mcp_server/server.py @@ -40,7 +40,7 @@ def get_networking_client(): user_agent_name = __project__.split("oracle.", 1)[1].split("-server", 1)[0] config["additional_user_agent"] = f"{user_agent_name}/{__version__}" private_key = oci.signer.load_private_key_from_file(config["key_file"]) - token_file = config["security_token_file"] + token_file = os.path.expanduser(config["security_token_file"]) token = None with open(token_file, "r") as f: token = f.read() diff --git a/src/oci-networking-mcp-server/pyproject.toml b/src/oci-networking-mcp-server/pyproject.toml index 317c418d..5763b499 100644 --- a/src/oci-networking-mcp-server/pyproject.toml +++ b/src/oci-networking-mcp-server/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "oracle.oci-networking-mcp-server" -version = "1.2.0" +version = "1.2.1" description = "OCI Networking Service MCP server" readme = "README.md" requires-python = ">=3.13" @@ -11,7 +11,7 @@ authors = [ ] dependencies = [ "fastmcp==2.13.0", - "oci==2.160.0", + "oci-cli==3.71.1", ] classifiers = [ @@ -48,6 +48,6 @@ omit = [ [tool.coverage.report] precision = 2 -fail_under = 65.18 +fail_under = 65.05 diff --git a/src/oci-networking-mcp-server/uv.lock b/src/oci-networking-mcp-server/uv.lock index 7ae1bc70..63a188ed 100644 --- a/src/oci-networking-mcp-server/uv.lock +++ b/src/oci-networking-mcp-server/uv.lock @@ -24,6 +24,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6f/12/e5e0282d673bb9746bacfb6e2dba8719989d3660cdb2ea79aee9a9651afb/anyio-4.10.0-py3-none-any.whl", hash = "sha256:60e474ac86736bbfd6f210f7a61218939c318f43f9972497381f1c5e930ed3d1", size = 107213, upload-time = "2025-08-04T08:54:24.882Z" }, ] +[[package]] +name = "arrow" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-dateutil" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/33/032cdc44182491aa708d06a68b62434140d8c50820a087fac7af37703357/arrow-1.4.0.tar.gz", hash = "sha256:ed0cc050e98001b8779e84d461b0098c4ac597e88704a655582b21d116e526d7", size = 152931, upload-time = "2025-10-18T17:46:46.761Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/c9/d7977eaacb9df673210491da99e6a247e93df98c715fc43fd136ce1d3d33/arrow-1.4.0-py3-none-any.whl", hash = "sha256:749f0769958ebdc79c173ff0b0670d59051a535fa26e8eba02953dc19eb43205", size = 68797, upload-time = "2025-10-18T17:46:45.663Z" }, +] + [[package]] name = "attrs" version = "25.3.0" @@ -159,14 +172,14 @@ wheels = [ [[package]] name = "click" -version = "8.3.0" +version = "8.0.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/46/61/de6cd827efad202d7057d93e0fed9294b96952e188f7384832791c7b2254/click-8.3.0.tar.gz", hash = "sha256:e7b8232224eba16f4ebe410c25ced9f7875cb5f3263ffc93cc3e8da705e229c4", size = 276943, upload-time = "2025-09-18T17:32:23.696Z" } +sdist = { url = "https://files.pythonhosted.org/packages/dd/cf/706c1ad49ab26abed0b77a2f867984c1341ed7387b8030a6aa914e2942a0/click-8.0.4.tar.gz", hash = "sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb", size = 329520, upload-time = "2022-02-18T20:31:30.105Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/db/d3/9dcc0f5797f070ec8edf30fbadfb200e71d9db6b84d211e3b2085a7589a0/click-8.3.0-py3-none-any.whl", hash = "sha256:9b9f285302c6e3064f4330c05f05b81945b2a39544279343e6e7c5f27a9baddc", size = 107295, upload-time = "2025-09-18T17:32:22.42Z" }, + { url = "https://files.pythonhosted.org/packages/4a/a8/0b2ced25639fb20cc1c9784de90a8c25f9504a7f18cd8b5397bd61696d7d/click-8.0.4-py3-none-any.whl", hash = "sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1", size = 97486, upload-time = "2022-02-18T20:31:27.733Z" }, ] [[package]] @@ -487,6 +500,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b2/a3/e137168c9c44d18eff0376253da9f1e9234d0239e0ee230d2fee6cea8e55/jeepney-0.9.0-py3-none-any.whl", hash = "sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683", size = 49010, upload-time = "2025-02-27T18:51:00.104Z" }, ] +[[package]] +name = "jmespath" +version = "0.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3c/56/3f325b1eef9791759784aa5046a8f6a1aff8f7c898a2e34506771d3b99d8/jmespath-0.10.0.tar.gz", hash = "sha256:b85d0567b8666149a93172712e68920734333c0ce7e89b78b3e987f71e5ed4f9", size = 21607, upload-time = "2020-05-12T22:03:47.267Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/cb/5f001272b6faeb23c1c9e0acc04d48eaaf5c862c17709d20e3469c6e0139/jmespath-0.10.0-py2.py3-none-any.whl", hash = "sha256:cdf6525904cc597730141d61b36f2e4b8ecc257c420fa2f4549bac2c2d0cb72f", size = 24489, upload-time = "2020-05-12T22:03:45.643Z" }, +] + [[package]] name = "jsonschema" version = "4.25.1" @@ -657,7 +679,7 @@ wheels = [ [[package]] name = "oci" -version = "2.160.0" +version = "2.164.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, @@ -667,9 +689,34 @@ dependencies = [ { name = "python-dateutil" }, { name = "pytz" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f3/7b/c9d7fc28f11c25c7875db3584eab5d52ccb2d7df553d07ac47f19a14d075/oci-2.160.0.tar.gz", hash = "sha256:f8e3410204c1405b40247179550cf74f5145a8e17025c4f2a92f2b9ffdc7d26b", size = 15601606, upload-time = "2025-09-09T04:17:43.728Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6e/fc/1c227e66ad949858b4388b18df76c9ef834228c3ca4b3c38c4cc7a099171/oci-2.164.1.tar.gz", hash = "sha256:2089632da42e9f556de046b6663050f2a046b06603eeefb90dc79810e91ee2c5", size = 16177816, upload-time = "2025-12-09T10:39:25.947Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/71/7c5725cd015aded721b3c36c25d1be302dfc11dc80ab966243663f9e1a1a/oci-2.164.1-py3-none-any.whl", hash = "sha256:65869381433e7a48ba5adfb63cf275e77bad4dd2ea79887e0a61110962252e3a", size = 32980817, upload-time = "2025-12-09T10:39:15.459Z" }, +] + +[[package]] +name = "oci-cli" +version = "3.71.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "arrow" }, + { name = "certifi" }, + { name = "click" }, + { name = "cryptography" }, + { name = "jmespath" }, + { name = "oci" }, + { name = "prompt-toolkit" }, + { name = "pyopenssl" }, + { name = "python-dateutil" }, + { name = "pytz" }, + { name = "pyyaml" }, + { name = "setuptools" }, + { name = "six" }, + { name = "terminaltables" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0f/34/f49d7a531968edc727a0ed6da2c66dc5317738c8c75e224cca690ba11cbd/oci_cli-3.71.1.tar.gz", hash = "sha256:91e1674f6c2f59d3c955be77e68b209967fa3fc3be53a5421177bb0bf3d5557d", size = 7726932, upload-time = "2025-12-09T13:13:29.326Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/78/51/752375a4e0d2de371c2788414157eda337417010d2ef7383cd7140388f1e/oci-2.160.0-py3-none-any.whl", hash = "sha256:3dba1ec671ebea23f255fabf836cb0fd08aea0913a8df85610fccaa5a4344ee9", size = 31715365, upload-time = "2025-09-09T04:17:34.998Z" }, + { url = "https://files.pythonhosted.org/packages/e2/9d/ea8a5583eb97174eb997f2050e47a422d24cf229888fcfe0ddb7c9b8b452/oci_cli-3.71.1-py3-none-any.whl", hash = "sha256:e91e8ffaeb373db3ad0c95d49b6137e59c3277f3911a099927efedae55a3d761", size = 25219923, upload-time = "2025-12-09T13:13:23.387Z" }, ] [[package]] @@ -735,11 +782,11 @@ wheels = [ [[package]] name = "oracle-oci-networking-mcp-server" -version = "1.1.0" +version = "1.2.1" source = { editable = "." } dependencies = [ { name = "fastmcp" }, - { name = "oci" }, + { name = "oci-cli" }, ] [package.dev-dependencies] @@ -752,7 +799,7 @@ dev = [ [package.metadata] requires-dist = [ { name = "fastmcp", specifier = "==2.13.0" }, - { name = "oci", specifier = "==2.160.0" }, + { name = "oci-cli", specifier = "==3.71.1" }, ] [package.metadata.requires-dev] @@ -816,6 +863,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, ] +[[package]] +name = "prompt-toolkit" +version = "3.0.43" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cc/c6/25b6a3d5cd295304de1e32c9edbcf319a52e965b339629d37d42bb7126ca/prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d", size = 425733, upload-time = "2023-12-13T08:44:39.127Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ee/fd/ca7bf3869e7caa7a037e23078539467b433a4e01eebd93f77180ab927766/prompt_toolkit-3.0.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6", size = 386072, upload-time = "2023-12-13T08:44:35.304Z" }, +] + [[package]] name = "py-key-value-aio" version = "0.2.8" @@ -1234,6 +1293,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/46/f5af3402b579fd5e11573ce652019a67074317e18c1935cc0b4ba9b35552/secretstorage-3.5.0-py3-none-any.whl", hash = "sha256:0ce65888c0725fcb2c5bc0fdb8e5438eece02c523557ea40ce0703c266248137", size = 15554, upload-time = "2025-11-23T19:02:51.545Z" }, ] +[[package]] +name = "setuptools" +version = "80.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c", size = 1319958, upload-time = "2025-05-27T00:56:51.443Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", size = 1201486, upload-time = "2025-05-27T00:56:49.664Z" }, +] + [[package]] name = "six" version = "1.17.0" @@ -1276,6 +1344,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/be/72/2db2f49247d0a18b4f1bb9a5a39a0162869acf235f3a96418363947b3d46/starlette-0.48.0-py3-none-any.whl", hash = "sha256:0764ca97b097582558ecb498132ed0c7d942f233f365b86ba37770e026510659", size = 73736, upload-time = "2025-09-13T08:41:03.869Z" }, ] +[[package]] +name = "terminaltables" +version = "3.1.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/fc/0b73d782f5ab7feba8d007573a3773c58255f223c5940a7b7085f02153c3/terminaltables-3.1.10.tar.gz", hash = "sha256:ba6eca5cb5ba02bba4c9f4f985af80c54ec3dccf94cfcd190154386255e47543", size = 12264, upload-time = "2021-12-07T19:03:35.758Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/fb/ea621e0a19733e01fe4005d46087d383693c0f4a8f824b47d8d4122c87e0/terminaltables-3.1.10-py2.py3-none-any.whl", hash = "sha256:e4fdc4179c9e4aab5f674d80f09d76fa436b96fdc698a8505e0a36bf0804a874", size = 15155, upload-time = "2021-12-07T19:03:34.013Z" }, +] + [[package]] name = "typing-extensions" version = "4.15.0" @@ -1297,6 +1374,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/17/69/cd203477f944c353c31bade965f880aa1061fd6bf05ded0726ca845b6ff7/typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51", size = 14552, upload-time = "2025-05-21T18:55:22.152Z" }, ] +[[package]] +name = "tzdata" +version = "2025.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload-time = "2025-03-23T13:54:43.652Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload-time = "2025-03-23T13:54:41.845Z" }, +] + [[package]] name = "urllib3" version = "2.5.0" @@ -1319,6 +1405,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/96/06/5cc0542b47c0338c1cb676b348e24a1c29acabc81000bced518231dded6f/uvicorn-0.36.0-py3-none-any.whl", hash = "sha256:6bb4ba67f16024883af8adf13aba3a9919e415358604ce46780d3f9bdc36d731", size = 67675, upload-time = "2025-09-20T01:07:12.984Z" }, ] +[[package]] +name = "wcwidth" +version = "0.2.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/30/6b0809f4510673dc723187aeaf24c7f5459922d01e2f794277a3dfb90345/wcwidth-0.2.14.tar.gz", hash = "sha256:4d478375d31bc5395a3c55c40ccdf3354688364cd61c4f6adacaa9215d0b3605", size = 102293, upload-time = "2025-09-22T16:29:53.023Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl", hash = "sha256:a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1", size = 37286, upload-time = "2025-09-22T16:29:51.641Z" }, +] + [[package]] name = "websockets" version = "15.0.1" diff --git a/src/oci-object-storage-mcp-server/Dockerfile b/src/oci-object-storage-mcp-server/Dockerfile new file mode 100644 index 00000000..f768ef35 --- /dev/null +++ b/src/oci-object-storage-mcp-server/Dockerfile @@ -0,0 +1,30 @@ +# Copyright (c) 2025, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v1.0 as shown at +# https://oss.oracle.com/licenses/upl. + +FROM ghcr.io/oracle/oraclelinux@sha256:1950389c3dd619841813520b4e69d7f3112c4c10f713fcb90680703d184c33ad + +# Install python 3.13 +RUN microdnf install epel-release && \ + microdnf install python3.13 python3.13-pip \ + && rm -rf /var/cache/dnf/* \ + && useradd -m -d /app oracle + +# Copy the MCP server to the docker container +WORKDIR /app +COPY --chown=oracle:oracle . /app + +# Install dependencies +RUN pip3.13 install --no-cache-dir uv && \ + uv --no-cache sync --locked --all-extras + +# Change user +USER oracle + +# HTTP support +ENV ORACLE_MCP_HOST="" +ENV ORACLE_MCP_PORT="" + +# Start the MCP server +ENTRYPOINT ["uv", "run"] +CMD ["oracle.oci-object-storage-mcp-server"] diff --git a/src/oci-object-storage-mcp-server/oracle/oci_object_storage_mcp_server/__init__.py b/src/oci-object-storage-mcp-server/oracle/oci_object_storage_mcp_server/__init__.py index 7ede3609..cdb0b584 100644 --- a/src/oci-object-storage-mcp-server/oracle/oci_object_storage_mcp_server/__init__.py +++ b/src/oci-object-storage-mcp-server/oracle/oci_object_storage_mcp_server/__init__.py @@ -5,4 +5,4 @@ """ __project__ = "oracle.oci-object-storage-mcp-server" -__version__ = "1.1.0" +__version__ = "1.1.1" diff --git a/src/oci-object-storage-mcp-server/oracle/oci_object_storage_mcp_server/server.py b/src/oci-object-storage-mcp-server/oracle/oci_object_storage_mcp_server/server.py index ff33639f..c59e5849 100644 --- a/src/oci-object-storage-mcp-server/oracle/oci_object_storage_mcp_server/server.py +++ b/src/oci-object-storage-mcp-server/oracle/oci_object_storage_mcp_server/server.py @@ -37,7 +37,7 @@ def get_object_storage_client(): config["additional_user_agent"] = f"{user_agent_name}/{__version__}" private_key = oci.signer.load_private_key_from_file(config["key_file"]) - token_file = config["security_token_file"] + token_file = os.path.expanduser(config["security_token_file"]) token = None with open(token_file, "r") as f: token = f.read() diff --git a/src/oci-object-storage-mcp-server/pyproject.toml b/src/oci-object-storage-mcp-server/pyproject.toml index 6de0a5b3..266c1dc8 100644 --- a/src/oci-object-storage-mcp-server/pyproject.toml +++ b/src/oci-object-storage-mcp-server/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "oracle.oci-object-storage-mcp-server" -version = "1.1.0" +version = "1.1.1" description = "OCI Object Storage Service MCP server" readme = "README.md" authors = [ @@ -9,7 +9,7 @@ authors = [ requires-python = ">=3.13" dependencies = [ "fastmcp==2.13.0", - "oci==2.160.0", + "oci-cli==3.71.1", ] classifiers = [ diff --git a/src/oci-object-storage-mcp-server/uv.lock b/src/oci-object-storage-mcp-server/uv.lock index c86dc255..faf30cc3 100644 --- a/src/oci-object-storage-mcp-server/uv.lock +++ b/src/oci-object-storage-mcp-server/uv.lock @@ -24,6 +24,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6f/12/e5e0282d673bb9746bacfb6e2dba8719989d3660cdb2ea79aee9a9651afb/anyio-4.10.0-py3-none-any.whl", hash = "sha256:60e474ac86736bbfd6f210f7a61218939c318f43f9972497381f1c5e930ed3d1", size = 107213, upload-time = "2025-08-04T08:54:24.882Z" }, ] +[[package]] +name = "arrow" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-dateutil" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/33/032cdc44182491aa708d06a68b62434140d8c50820a087fac7af37703357/arrow-1.4.0.tar.gz", hash = "sha256:ed0cc050e98001b8779e84d461b0098c4ac597e88704a655582b21d116e526d7", size = 152931, upload-time = "2025-10-18T17:46:46.761Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/c9/d7977eaacb9df673210491da99e6a247e93df98c715fc43fd136ce1d3d33/arrow-1.4.0-py3-none-any.whl", hash = "sha256:749f0769958ebdc79c173ff0b0670d59051a535fa26e8eba02953dc19eb43205", size = 68797, upload-time = "2025-10-18T17:46:45.663Z" }, +] + [[package]] name = "attrs" version = "25.3.0" @@ -159,14 +172,14 @@ wheels = [ [[package]] name = "click" -version = "8.3.0" +version = "8.0.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/46/61/de6cd827efad202d7057d93e0fed9294b96952e188f7384832791c7b2254/click-8.3.0.tar.gz", hash = "sha256:e7b8232224eba16f4ebe410c25ced9f7875cb5f3263ffc93cc3e8da705e229c4", size = 276943, upload-time = "2025-09-18T17:32:23.696Z" } +sdist = { url = "https://files.pythonhosted.org/packages/dd/cf/706c1ad49ab26abed0b77a2f867984c1341ed7387b8030a6aa914e2942a0/click-8.0.4.tar.gz", hash = "sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb", size = 329520, upload-time = "2022-02-18T20:31:30.105Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/db/d3/9dcc0f5797f070ec8edf30fbadfb200e71d9db6b84d211e3b2085a7589a0/click-8.3.0-py3-none-any.whl", hash = "sha256:9b9f285302c6e3064f4330c05f05b81945b2a39544279343e6e7c5f27a9baddc", size = 107295, upload-time = "2025-09-18T17:32:22.42Z" }, + { url = "https://files.pythonhosted.org/packages/4a/a8/0b2ced25639fb20cc1c9784de90a8c25f9504a7f18cd8b5397bd61696d7d/click-8.0.4-py3-none-any.whl", hash = "sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1", size = 97486, upload-time = "2022-02-18T20:31:27.733Z" }, ] [[package]] @@ -487,6 +500,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b2/a3/e137168c9c44d18eff0376253da9f1e9234d0239e0ee230d2fee6cea8e55/jeepney-0.9.0-py3-none-any.whl", hash = "sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683", size = 49010, upload-time = "2025-02-27T18:51:00.104Z" }, ] +[[package]] +name = "jmespath" +version = "0.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3c/56/3f325b1eef9791759784aa5046a8f6a1aff8f7c898a2e34506771d3b99d8/jmespath-0.10.0.tar.gz", hash = "sha256:b85d0567b8666149a93172712e68920734333c0ce7e89b78b3e987f71e5ed4f9", size = 21607, upload-time = "2020-05-12T22:03:47.267Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/cb/5f001272b6faeb23c1c9e0acc04d48eaaf5c862c17709d20e3469c6e0139/jmespath-0.10.0-py2.py3-none-any.whl", hash = "sha256:cdf6525904cc597730141d61b36f2e4b8ecc257c420fa2f4549bac2c2d0cb72f", size = 24489, upload-time = "2020-05-12T22:03:45.643Z" }, +] + [[package]] name = "jsonschema" version = "4.25.1" @@ -657,7 +679,7 @@ wheels = [ [[package]] name = "oci" -version = "2.160.0" +version = "2.164.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, @@ -667,9 +689,34 @@ dependencies = [ { name = "python-dateutil" }, { name = "pytz" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f3/7b/c9d7fc28f11c25c7875db3584eab5d52ccb2d7df553d07ac47f19a14d075/oci-2.160.0.tar.gz", hash = "sha256:f8e3410204c1405b40247179550cf74f5145a8e17025c4f2a92f2b9ffdc7d26b", size = 15601606, upload-time = "2025-09-09T04:17:43.728Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6e/fc/1c227e66ad949858b4388b18df76c9ef834228c3ca4b3c38c4cc7a099171/oci-2.164.1.tar.gz", hash = "sha256:2089632da42e9f556de046b6663050f2a046b06603eeefb90dc79810e91ee2c5", size = 16177816, upload-time = "2025-12-09T10:39:25.947Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/71/7c5725cd015aded721b3c36c25d1be302dfc11dc80ab966243663f9e1a1a/oci-2.164.1-py3-none-any.whl", hash = "sha256:65869381433e7a48ba5adfb63cf275e77bad4dd2ea79887e0a61110962252e3a", size = 32980817, upload-time = "2025-12-09T10:39:15.459Z" }, +] + +[[package]] +name = "oci-cli" +version = "3.71.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "arrow" }, + { name = "certifi" }, + { name = "click" }, + { name = "cryptography" }, + { name = "jmespath" }, + { name = "oci" }, + { name = "prompt-toolkit" }, + { name = "pyopenssl" }, + { name = "python-dateutil" }, + { name = "pytz" }, + { name = "pyyaml" }, + { name = "setuptools" }, + { name = "six" }, + { name = "terminaltables" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0f/34/f49d7a531968edc727a0ed6da2c66dc5317738c8c75e224cca690ba11cbd/oci_cli-3.71.1.tar.gz", hash = "sha256:91e1674f6c2f59d3c955be77e68b209967fa3fc3be53a5421177bb0bf3d5557d", size = 7726932, upload-time = "2025-12-09T13:13:29.326Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/78/51/752375a4e0d2de371c2788414157eda337417010d2ef7383cd7140388f1e/oci-2.160.0-py3-none-any.whl", hash = "sha256:3dba1ec671ebea23f255fabf836cb0fd08aea0913a8df85610fccaa5a4344ee9", size = 31715365, upload-time = "2025-09-09T04:17:34.998Z" }, + { url = "https://files.pythonhosted.org/packages/e2/9d/ea8a5583eb97174eb997f2050e47a422d24cf229888fcfe0ddb7c9b8b452/oci_cli-3.71.1-py3-none-any.whl", hash = "sha256:e91e8ffaeb373db3ad0c95d49b6137e59c3277f3911a099927efedae55a3d761", size = 25219923, upload-time = "2025-12-09T13:13:23.387Z" }, ] [[package]] @@ -735,11 +782,11 @@ wheels = [ [[package]] name = "oracle-oci-object-storage-mcp-server" -version = "1.1.0" +version = "1.1.1" source = { editable = "." } dependencies = [ { name = "fastmcp" }, - { name = "oci" }, + { name = "oci-cli" }, ] [package.dev-dependencies] @@ -752,7 +799,7 @@ dev = [ [package.metadata] requires-dist = [ { name = "fastmcp", specifier = "==2.13.0" }, - { name = "oci", specifier = "==2.160.0" }, + { name = "oci-cli", specifier = "==3.71.1" }, ] [package.metadata.requires-dev] @@ -816,6 +863,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, ] +[[package]] +name = "prompt-toolkit" +version = "3.0.43" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cc/c6/25b6a3d5cd295304de1e32c9edbcf319a52e965b339629d37d42bb7126ca/prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d", size = 425733, upload-time = "2023-12-13T08:44:39.127Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ee/fd/ca7bf3869e7caa7a037e23078539467b433a4e01eebd93f77180ab927766/prompt_toolkit-3.0.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6", size = 386072, upload-time = "2023-12-13T08:44:35.304Z" }, +] + [[package]] name = "py-key-value-aio" version = "0.2.8" @@ -1234,6 +1293,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/46/f5af3402b579fd5e11573ce652019a67074317e18c1935cc0b4ba9b35552/secretstorage-3.5.0-py3-none-any.whl", hash = "sha256:0ce65888c0725fcb2c5bc0fdb8e5438eece02c523557ea40ce0703c266248137", size = 15554, upload-time = "2025-11-23T19:02:51.545Z" }, ] +[[package]] +name = "setuptools" +version = "80.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c", size = 1319958, upload-time = "2025-05-27T00:56:51.443Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", size = 1201486, upload-time = "2025-05-27T00:56:49.664Z" }, +] + [[package]] name = "six" version = "1.17.0" @@ -1276,6 +1344,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/be/72/2db2f49247d0a18b4f1bb9a5a39a0162869acf235f3a96418363947b3d46/starlette-0.48.0-py3-none-any.whl", hash = "sha256:0764ca97b097582558ecb498132ed0c7d942f233f365b86ba37770e026510659", size = 73736, upload-time = "2025-09-13T08:41:03.869Z" }, ] +[[package]] +name = "terminaltables" +version = "3.1.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/fc/0b73d782f5ab7feba8d007573a3773c58255f223c5940a7b7085f02153c3/terminaltables-3.1.10.tar.gz", hash = "sha256:ba6eca5cb5ba02bba4c9f4f985af80c54ec3dccf94cfcd190154386255e47543", size = 12264, upload-time = "2021-12-07T19:03:35.758Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/fb/ea621e0a19733e01fe4005d46087d383693c0f4a8f824b47d8d4122c87e0/terminaltables-3.1.10-py2.py3-none-any.whl", hash = "sha256:e4fdc4179c9e4aab5f674d80f09d76fa436b96fdc698a8505e0a36bf0804a874", size = 15155, upload-time = "2021-12-07T19:03:34.013Z" }, +] + [[package]] name = "typing-extensions" version = "4.15.0" @@ -1297,6 +1374,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/17/69/cd203477f944c353c31bade965f880aa1061fd6bf05ded0726ca845b6ff7/typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51", size = 14552, upload-time = "2025-05-21T18:55:22.152Z" }, ] +[[package]] +name = "tzdata" +version = "2025.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload-time = "2025-03-23T13:54:43.652Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload-time = "2025-03-23T13:54:41.845Z" }, +] + [[package]] name = "urllib3" version = "2.5.0" @@ -1319,6 +1405,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/96/06/5cc0542b47c0338c1cb676b348e24a1c29acabc81000bced518231dded6f/uvicorn-0.36.0-py3-none-any.whl", hash = "sha256:6bb4ba67f16024883af8adf13aba3a9919e415358604ce46780d3f9bdc36d731", size = 67675, upload-time = "2025-09-20T01:07:12.984Z" }, ] +[[package]] +name = "wcwidth" +version = "0.2.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/30/6b0809f4510673dc723187aeaf24c7f5459922d01e2f794277a3dfb90345/wcwidth-0.2.14.tar.gz", hash = "sha256:4d478375d31bc5395a3c55c40ccdf3354688364cd61c4f6adacaa9215d0b3605", size = 102293, upload-time = "2025-09-22T16:29:53.023Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl", hash = "sha256:a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1", size = 37286, upload-time = "2025-09-22T16:29:51.641Z" }, +] + [[package]] name = "websockets" version = "15.0.1" diff --git a/src/oci-registry-mcp-server/.dockerignore b/src/oci-registry-mcp-server/.dockerignore new file mode 100644 index 00000000..451067cc --- /dev/null +++ b/src/oci-registry-mcp-server/.dockerignore @@ -0,0 +1,10 @@ +.venv +venv +bldvenv + +.pytest_cache +dist +**/__pycache__ + +htmlcov +.coverage diff --git a/src/oci-registry-mcp-server/Dockerfile b/src/oci-registry-mcp-server/Dockerfile new file mode 100644 index 00000000..51a47771 --- /dev/null +++ b/src/oci-registry-mcp-server/Dockerfile @@ -0,0 +1,30 @@ +# Copyright (c) 2025, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v1.0 as shown at +# https://oss.oracle.com/licenses/upl. + +FROM ghcr.io/oracle/oraclelinux@sha256:1950389c3dd619841813520b4e69d7f3112c4c10f713fcb90680703d184c33ad + +# Install python 3.13 +RUN microdnf install epel-release && \ + microdnf install python3.13 python3.13-pip \ + && rm -rf /var/cache/dnf/* \ + && useradd -m -d /app oracle + +# Copy the MCP server to the docker container +WORKDIR /app +COPY --chown=oracle:oracle . /app + +# Install dependencies +RUN pip3.13 install --no-cache-dir uv && \ + uv --no-cache sync --locked --all-extras + +# Change user +USER oracle + +# HTTP support +ENV ORACLE_MCP_HOST="" +ENV ORACLE_MCP_PORT="" + +# Start the MCP server +ENTRYPOINT ["uv", "run"] +CMD ["oracle.oci-registry-mcp-server"] diff --git a/src/oci-registry-mcp-server/oracle/oci_registry_mcp_server/__init__.py b/src/oci-registry-mcp-server/oracle/oci_registry_mcp_server/__init__.py index 0841c84a..75650fcb 100644 --- a/src/oci-registry-mcp-server/oracle/oci_registry_mcp_server/__init__.py +++ b/src/oci-registry-mcp-server/oracle/oci_registry_mcp_server/__init__.py @@ -5,4 +5,4 @@ """ __project__ = "oracle.oci-registry-mcp-server" -__version__ = "2.1.0" +__version__ = "2.1.1" diff --git a/src/oci-registry-mcp-server/oracle/oci_registry_mcp_server/server.py b/src/oci-registry-mcp-server/oracle/oci_registry_mcp_server/server.py index 1e7f14a6..c6ca6b62 100644 --- a/src/oci-registry-mcp-server/oracle/oci_registry_mcp_server/server.py +++ b/src/oci-registry-mcp-server/oracle/oci_registry_mcp_server/server.py @@ -33,7 +33,7 @@ def get_ocir_client(): config["additional_user_agent"] = f"{__project__}/{__version__}" private_key = oci.signer.load_private_key_from_file(config["key_file"]) - token_file = config["security_token_file"] + token_file = os.path.expanduser(config["security_token_file"]) token = None with open(token_file, "r") as f: token = f.read() diff --git a/src/oci-registry-mcp-server/pyproject.toml b/src/oci-registry-mcp-server/pyproject.toml index 872c803b..533235ca 100644 --- a/src/oci-registry-mcp-server/pyproject.toml +++ b/src/oci-registry-mcp-server/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "oracle.oci-registry-mcp-server" -version = "2.1.0" +version = "2.1.1" description = "OCI Registry Service MCP server" readme = "README.md" requires-python = ">=3.13" @@ -11,7 +11,7 @@ authors = [ ] dependencies = [ "fastmcp==2.13.0", - "oci==2.160.0", + "oci-cli==3.71.1", ] classifiers = [ diff --git a/src/oci-registry-mcp-server/uv.lock b/src/oci-registry-mcp-server/uv.lock index e54160ee..ccd66d54 100644 --- a/src/oci-registry-mcp-server/uv.lock +++ b/src/oci-registry-mcp-server/uv.lock @@ -24,6 +24,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6f/12/e5e0282d673bb9746bacfb6e2dba8719989d3660cdb2ea79aee9a9651afb/anyio-4.10.0-py3-none-any.whl", hash = "sha256:60e474ac86736bbfd6f210f7a61218939c318f43f9972497381f1c5e930ed3d1", size = 107213, upload-time = "2025-08-04T08:54:24.882Z" }, ] +[[package]] +name = "arrow" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-dateutil" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/33/032cdc44182491aa708d06a68b62434140d8c50820a087fac7af37703357/arrow-1.4.0.tar.gz", hash = "sha256:ed0cc050e98001b8779e84d461b0098c4ac597e88704a655582b21d116e526d7", size = 152931, upload-time = "2025-10-18T17:46:46.761Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/c9/d7977eaacb9df673210491da99e6a247e93df98c715fc43fd136ce1d3d33/arrow-1.4.0-py3-none-any.whl", hash = "sha256:749f0769958ebdc79c173ff0b0670d59051a535fa26e8eba02953dc19eb43205", size = 68797, upload-time = "2025-10-18T17:46:45.663Z" }, +] + [[package]] name = "attrs" version = "25.3.0" @@ -159,14 +172,14 @@ wheels = [ [[package]] name = "click" -version = "8.3.0" +version = "8.0.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/46/61/de6cd827efad202d7057d93e0fed9294b96952e188f7384832791c7b2254/click-8.3.0.tar.gz", hash = "sha256:e7b8232224eba16f4ebe410c25ced9f7875cb5f3263ffc93cc3e8da705e229c4", size = 276943, upload-time = "2025-09-18T17:32:23.696Z" } +sdist = { url = "https://files.pythonhosted.org/packages/dd/cf/706c1ad49ab26abed0b77a2f867984c1341ed7387b8030a6aa914e2942a0/click-8.0.4.tar.gz", hash = "sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb", size = 329520, upload-time = "2022-02-18T20:31:30.105Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/db/d3/9dcc0f5797f070ec8edf30fbadfb200e71d9db6b84d211e3b2085a7589a0/click-8.3.0-py3-none-any.whl", hash = "sha256:9b9f285302c6e3064f4330c05f05b81945b2a39544279343e6e7c5f27a9baddc", size = 107295, upload-time = "2025-09-18T17:32:22.42Z" }, + { url = "https://files.pythonhosted.org/packages/4a/a8/0b2ced25639fb20cc1c9784de90a8c25f9504a7f18cd8b5397bd61696d7d/click-8.0.4-py3-none-any.whl", hash = "sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1", size = 97486, upload-time = "2022-02-18T20:31:27.733Z" }, ] [[package]] @@ -487,6 +500,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b2/a3/e137168c9c44d18eff0376253da9f1e9234d0239e0ee230d2fee6cea8e55/jeepney-0.9.0-py3-none-any.whl", hash = "sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683", size = 49010, upload-time = "2025-02-27T18:51:00.104Z" }, ] +[[package]] +name = "jmespath" +version = "0.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3c/56/3f325b1eef9791759784aa5046a8f6a1aff8f7c898a2e34506771d3b99d8/jmespath-0.10.0.tar.gz", hash = "sha256:b85d0567b8666149a93172712e68920734333c0ce7e89b78b3e987f71e5ed4f9", size = 21607, upload-time = "2020-05-12T22:03:47.267Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/cb/5f001272b6faeb23c1c9e0acc04d48eaaf5c862c17709d20e3469c6e0139/jmespath-0.10.0-py2.py3-none-any.whl", hash = "sha256:cdf6525904cc597730141d61b36f2e4b8ecc257c420fa2f4549bac2c2d0cb72f", size = 24489, upload-time = "2020-05-12T22:03:45.643Z" }, +] + [[package]] name = "jsonschema" version = "4.25.1" @@ -657,7 +679,7 @@ wheels = [ [[package]] name = "oci" -version = "2.160.0" +version = "2.164.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, @@ -667,9 +689,34 @@ dependencies = [ { name = "python-dateutil" }, { name = "pytz" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f3/7b/c9d7fc28f11c25c7875db3584eab5d52ccb2d7df553d07ac47f19a14d075/oci-2.160.0.tar.gz", hash = "sha256:f8e3410204c1405b40247179550cf74f5145a8e17025c4f2a92f2b9ffdc7d26b", size = 15601606, upload-time = "2025-09-09T04:17:43.728Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6e/fc/1c227e66ad949858b4388b18df76c9ef834228c3ca4b3c38c4cc7a099171/oci-2.164.1.tar.gz", hash = "sha256:2089632da42e9f556de046b6663050f2a046b06603eeefb90dc79810e91ee2c5", size = 16177816, upload-time = "2025-12-09T10:39:25.947Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/71/7c5725cd015aded721b3c36c25d1be302dfc11dc80ab966243663f9e1a1a/oci-2.164.1-py3-none-any.whl", hash = "sha256:65869381433e7a48ba5adfb63cf275e77bad4dd2ea79887e0a61110962252e3a", size = 32980817, upload-time = "2025-12-09T10:39:15.459Z" }, +] + +[[package]] +name = "oci-cli" +version = "3.71.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "arrow" }, + { name = "certifi" }, + { name = "click" }, + { name = "cryptography" }, + { name = "jmespath" }, + { name = "oci" }, + { name = "prompt-toolkit" }, + { name = "pyopenssl" }, + { name = "python-dateutil" }, + { name = "pytz" }, + { name = "pyyaml" }, + { name = "setuptools" }, + { name = "six" }, + { name = "terminaltables" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0f/34/f49d7a531968edc727a0ed6da2c66dc5317738c8c75e224cca690ba11cbd/oci_cli-3.71.1.tar.gz", hash = "sha256:91e1674f6c2f59d3c955be77e68b209967fa3fc3be53a5421177bb0bf3d5557d", size = 7726932, upload-time = "2025-12-09T13:13:29.326Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/78/51/752375a4e0d2de371c2788414157eda337417010d2ef7383cd7140388f1e/oci-2.160.0-py3-none-any.whl", hash = "sha256:3dba1ec671ebea23f255fabf836cb0fd08aea0913a8df85610fccaa5a4344ee9", size = 31715365, upload-time = "2025-09-09T04:17:34.998Z" }, + { url = "https://files.pythonhosted.org/packages/e2/9d/ea8a5583eb97174eb997f2050e47a422d24cf229888fcfe0ddb7c9b8b452/oci_cli-3.71.1-py3-none-any.whl", hash = "sha256:e91e8ffaeb373db3ad0c95d49b6137e59c3277f3911a099927efedae55a3d761", size = 25219923, upload-time = "2025-12-09T13:13:23.387Z" }, ] [[package]] @@ -735,11 +782,11 @@ wheels = [ [[package]] name = "oracle-oci-registry-mcp-server" -version = "2.1.0" +version = "2.1.1" source = { editable = "." } dependencies = [ { name = "fastmcp" }, - { name = "oci" }, + { name = "oci-cli" }, ] [package.dev-dependencies] @@ -752,7 +799,7 @@ dev = [ [package.metadata] requires-dist = [ { name = "fastmcp", specifier = "==2.13.0" }, - { name = "oci", specifier = "==2.160.0" }, + { name = "oci-cli", specifier = "==3.71.1" }, ] [package.metadata.requires-dev] @@ -816,6 +863,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, ] +[[package]] +name = "prompt-toolkit" +version = "3.0.43" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cc/c6/25b6a3d5cd295304de1e32c9edbcf319a52e965b339629d37d42bb7126ca/prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d", size = 425733, upload-time = "2023-12-13T08:44:39.127Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ee/fd/ca7bf3869e7caa7a037e23078539467b433a4e01eebd93f77180ab927766/prompt_toolkit-3.0.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6", size = 386072, upload-time = "2023-12-13T08:44:35.304Z" }, +] + [[package]] name = "py-key-value-aio" version = "0.2.8" @@ -1234,6 +1293,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/46/f5af3402b579fd5e11573ce652019a67074317e18c1935cc0b4ba9b35552/secretstorage-3.5.0-py3-none-any.whl", hash = "sha256:0ce65888c0725fcb2c5bc0fdb8e5438eece02c523557ea40ce0703c266248137", size = 15554, upload-time = "2025-11-23T19:02:51.545Z" }, ] +[[package]] +name = "setuptools" +version = "80.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c", size = 1319958, upload-time = "2025-05-27T00:56:51.443Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", size = 1201486, upload-time = "2025-05-27T00:56:49.664Z" }, +] + [[package]] name = "six" version = "1.17.0" @@ -1276,6 +1344,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/be/72/2db2f49247d0a18b4f1bb9a5a39a0162869acf235f3a96418363947b3d46/starlette-0.48.0-py3-none-any.whl", hash = "sha256:0764ca97b097582558ecb498132ed0c7d942f233f365b86ba37770e026510659", size = 73736, upload-time = "2025-09-13T08:41:03.869Z" }, ] +[[package]] +name = "terminaltables" +version = "3.1.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/fc/0b73d782f5ab7feba8d007573a3773c58255f223c5940a7b7085f02153c3/terminaltables-3.1.10.tar.gz", hash = "sha256:ba6eca5cb5ba02bba4c9f4f985af80c54ec3dccf94cfcd190154386255e47543", size = 12264, upload-time = "2021-12-07T19:03:35.758Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/fb/ea621e0a19733e01fe4005d46087d383693c0f4a8f824b47d8d4122c87e0/terminaltables-3.1.10-py2.py3-none-any.whl", hash = "sha256:e4fdc4179c9e4aab5f674d80f09d76fa436b96fdc698a8505e0a36bf0804a874", size = 15155, upload-time = "2021-12-07T19:03:34.013Z" }, +] + [[package]] name = "typing-extensions" version = "4.15.0" @@ -1297,6 +1374,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/17/69/cd203477f944c353c31bade965f880aa1061fd6bf05ded0726ca845b6ff7/typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51", size = 14552, upload-time = "2025-05-21T18:55:22.152Z" }, ] +[[package]] +name = "tzdata" +version = "2025.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload-time = "2025-03-23T13:54:43.652Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload-time = "2025-03-23T13:54:41.845Z" }, +] + [[package]] name = "urllib3" version = "2.5.0" @@ -1319,6 +1405,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/96/06/5cc0542b47c0338c1cb676b348e24a1c29acabc81000bced518231dded6f/uvicorn-0.36.0-py3-none-any.whl", hash = "sha256:6bb4ba67f16024883af8adf13aba3a9919e415358604ce46780d3f9bdc36d731", size = 67675, upload-time = "2025-09-20T01:07:12.984Z" }, ] +[[package]] +name = "wcwidth" +version = "0.2.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/30/6b0809f4510673dc723187aeaf24c7f5459922d01e2f794277a3dfb90345/wcwidth-0.2.14.tar.gz", hash = "sha256:4d478375d31bc5395a3c55c40ccdf3354688364cd61c4f6adacaa9215d0b3605", size = 102293, upload-time = "2025-09-22T16:29:53.023Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl", hash = "sha256:a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1", size = 37286, upload-time = "2025-09-22T16:29:51.641Z" }, +] + [[package]] name = "websockets" version = "15.0.1" diff --git a/src/oci-resource-search-mcp-server/Dockerfile b/src/oci-resource-search-mcp-server/Dockerfile new file mode 100644 index 00000000..1fc4ed2b --- /dev/null +++ b/src/oci-resource-search-mcp-server/Dockerfile @@ -0,0 +1,30 @@ +# Copyright (c) 2025, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v1.0 as shown at +# https://oss.oracle.com/licenses/upl. + +FROM ghcr.io/oracle/oraclelinux@sha256:1950389c3dd619841813520b4e69d7f3112c4c10f713fcb90680703d184c33ad + +# Install python 3.13 +RUN microdnf install epel-release && \ + microdnf install python3.13 python3.13-pip \ + && rm -rf /var/cache/dnf/* \ + && useradd -m -d /app oracle + +# Copy the MCP server to the docker container +WORKDIR /app +COPY --chown=oracle:oracle . /app + +# Install dependencies +RUN pip3.13 install --no-cache-dir uv && \ + uv --no-cache sync --locked --all-extras + +# Change user +USER oracle + +# HTTP support +ENV ORACLE_MCP_HOST="" +ENV ORACLE_MCP_PORT="" + +# Start the MCP server +ENTRYPOINT ["uv", "run"] +CMD ["oracle.oci-resource-search-mcp-server"] diff --git a/src/oci-resource-search-mcp-server/oracle/oci_resource_search_mcp_server/__init__.py b/src/oci-resource-search-mcp-server/oracle/oci_resource_search_mcp_server/__init__.py index 5bba1af3..98f03b1c 100644 --- a/src/oci-resource-search-mcp-server/oracle/oci_resource_search_mcp_server/__init__.py +++ b/src/oci-resource-search-mcp-server/oracle/oci_resource_search_mcp_server/__init__.py @@ -5,4 +5,4 @@ """ __project__ = "oracle.oci-resource-search-mcp-server" -__version__ = "2.1.0" +__version__ = "2.1.1" diff --git a/src/oci-resource-search-mcp-server/oracle/oci_resource_search_mcp_server/server.py b/src/oci-resource-search-mcp-server/oracle/oci_resource_search_mcp_server/server.py index fedc2e0c..be753d50 100644 --- a/src/oci-resource-search-mcp-server/oracle/oci_resource_search_mcp_server/server.py +++ b/src/oci-resource-search-mcp-server/oracle/oci_resource_search_mcp_server/server.py @@ -34,7 +34,7 @@ def get_search_client(): config["additional_user_agent"] = f"{user_agent_name}/{__version__}" private_key = oci.signer.load_private_key_from_file(config["key_file"]) - token_file = config["security_token_file"] + token_file = os.path.expanduser(config["security_token_file"]) token = None with open(token_file, "r") as f: token = f.read() diff --git a/src/oci-resource-search-mcp-server/pyproject.toml b/src/oci-resource-search-mcp-server/pyproject.toml index 66ac6ea2..41f7498b 100644 --- a/src/oci-resource-search-mcp-server/pyproject.toml +++ b/src/oci-resource-search-mcp-server/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "oracle.oci-resource-search-mcp-server" -version = "2.1.0" +version = "2.1.1" description = "OCI Resource Search Service MCP server" readme = "README.md" requires-python = ">=3.13" @@ -11,7 +11,7 @@ authors = [ ] dependencies = [ "fastmcp==2.13.0", - "oci==2.160.0", + "oci-cli==3.71.1", ] classifiers = [ diff --git a/src/oci-resource-search-mcp-server/uv.lock b/src/oci-resource-search-mcp-server/uv.lock index c6138fbd..e4edb38b 100644 --- a/src/oci-resource-search-mcp-server/uv.lock +++ b/src/oci-resource-search-mcp-server/uv.lock @@ -24,6 +24,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6f/12/e5e0282d673bb9746bacfb6e2dba8719989d3660cdb2ea79aee9a9651afb/anyio-4.10.0-py3-none-any.whl", hash = "sha256:60e474ac86736bbfd6f210f7a61218939c318f43f9972497381f1c5e930ed3d1", size = 107213, upload-time = "2025-08-04T08:54:24.882Z" }, ] +[[package]] +name = "arrow" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-dateutil" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/33/032cdc44182491aa708d06a68b62434140d8c50820a087fac7af37703357/arrow-1.4.0.tar.gz", hash = "sha256:ed0cc050e98001b8779e84d461b0098c4ac597e88704a655582b21d116e526d7", size = 152931, upload-time = "2025-10-18T17:46:46.761Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/c9/d7977eaacb9df673210491da99e6a247e93df98c715fc43fd136ce1d3d33/arrow-1.4.0-py3-none-any.whl", hash = "sha256:749f0769958ebdc79c173ff0b0670d59051a535fa26e8eba02953dc19eb43205", size = 68797, upload-time = "2025-10-18T17:46:45.663Z" }, +] + [[package]] name = "attrs" version = "25.3.0" @@ -159,14 +172,14 @@ wheels = [ [[package]] name = "click" -version = "8.3.0" +version = "8.0.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/46/61/de6cd827efad202d7057d93e0fed9294b96952e188f7384832791c7b2254/click-8.3.0.tar.gz", hash = "sha256:e7b8232224eba16f4ebe410c25ced9f7875cb5f3263ffc93cc3e8da705e229c4", size = 276943, upload-time = "2025-09-18T17:32:23.696Z" } +sdist = { url = "https://files.pythonhosted.org/packages/dd/cf/706c1ad49ab26abed0b77a2f867984c1341ed7387b8030a6aa914e2942a0/click-8.0.4.tar.gz", hash = "sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb", size = 329520, upload-time = "2022-02-18T20:31:30.105Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/db/d3/9dcc0f5797f070ec8edf30fbadfb200e71d9db6b84d211e3b2085a7589a0/click-8.3.0-py3-none-any.whl", hash = "sha256:9b9f285302c6e3064f4330c05f05b81945b2a39544279343e6e7c5f27a9baddc", size = 107295, upload-time = "2025-09-18T17:32:22.42Z" }, + { url = "https://files.pythonhosted.org/packages/4a/a8/0b2ced25639fb20cc1c9784de90a8c25f9504a7f18cd8b5397bd61696d7d/click-8.0.4-py3-none-any.whl", hash = "sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1", size = 97486, upload-time = "2022-02-18T20:31:27.733Z" }, ] [[package]] @@ -487,6 +500,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b2/a3/e137168c9c44d18eff0376253da9f1e9234d0239e0ee230d2fee6cea8e55/jeepney-0.9.0-py3-none-any.whl", hash = "sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683", size = 49010, upload-time = "2025-02-27T18:51:00.104Z" }, ] +[[package]] +name = "jmespath" +version = "0.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3c/56/3f325b1eef9791759784aa5046a8f6a1aff8f7c898a2e34506771d3b99d8/jmespath-0.10.0.tar.gz", hash = "sha256:b85d0567b8666149a93172712e68920734333c0ce7e89b78b3e987f71e5ed4f9", size = 21607, upload-time = "2020-05-12T22:03:47.267Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/cb/5f001272b6faeb23c1c9e0acc04d48eaaf5c862c17709d20e3469c6e0139/jmespath-0.10.0-py2.py3-none-any.whl", hash = "sha256:cdf6525904cc597730141d61b36f2e4b8ecc257c420fa2f4549bac2c2d0cb72f", size = 24489, upload-time = "2020-05-12T22:03:45.643Z" }, +] + [[package]] name = "jsonschema" version = "4.25.1" @@ -657,7 +679,7 @@ wheels = [ [[package]] name = "oci" -version = "2.160.0" +version = "2.164.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, @@ -667,9 +689,34 @@ dependencies = [ { name = "python-dateutil" }, { name = "pytz" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f3/7b/c9d7fc28f11c25c7875db3584eab5d52ccb2d7df553d07ac47f19a14d075/oci-2.160.0.tar.gz", hash = "sha256:f8e3410204c1405b40247179550cf74f5145a8e17025c4f2a92f2b9ffdc7d26b", size = 15601606, upload-time = "2025-09-09T04:17:43.728Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6e/fc/1c227e66ad949858b4388b18df76c9ef834228c3ca4b3c38c4cc7a099171/oci-2.164.1.tar.gz", hash = "sha256:2089632da42e9f556de046b6663050f2a046b06603eeefb90dc79810e91ee2c5", size = 16177816, upload-time = "2025-12-09T10:39:25.947Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/71/7c5725cd015aded721b3c36c25d1be302dfc11dc80ab966243663f9e1a1a/oci-2.164.1-py3-none-any.whl", hash = "sha256:65869381433e7a48ba5adfb63cf275e77bad4dd2ea79887e0a61110962252e3a", size = 32980817, upload-time = "2025-12-09T10:39:15.459Z" }, +] + +[[package]] +name = "oci-cli" +version = "3.71.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "arrow" }, + { name = "certifi" }, + { name = "click" }, + { name = "cryptography" }, + { name = "jmespath" }, + { name = "oci" }, + { name = "prompt-toolkit" }, + { name = "pyopenssl" }, + { name = "python-dateutil" }, + { name = "pytz" }, + { name = "pyyaml" }, + { name = "setuptools" }, + { name = "six" }, + { name = "terminaltables" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0f/34/f49d7a531968edc727a0ed6da2c66dc5317738c8c75e224cca690ba11cbd/oci_cli-3.71.1.tar.gz", hash = "sha256:91e1674f6c2f59d3c955be77e68b209967fa3fc3be53a5421177bb0bf3d5557d", size = 7726932, upload-time = "2025-12-09T13:13:29.326Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/78/51/752375a4e0d2de371c2788414157eda337417010d2ef7383cd7140388f1e/oci-2.160.0-py3-none-any.whl", hash = "sha256:3dba1ec671ebea23f255fabf836cb0fd08aea0913a8df85610fccaa5a4344ee9", size = 31715365, upload-time = "2025-09-09T04:17:34.998Z" }, + { url = "https://files.pythonhosted.org/packages/e2/9d/ea8a5583eb97174eb997f2050e47a422d24cf229888fcfe0ddb7c9b8b452/oci_cli-3.71.1-py3-none-any.whl", hash = "sha256:e91e8ffaeb373db3ad0c95d49b6137e59c3277f3911a099927efedae55a3d761", size = 25219923, upload-time = "2025-12-09T13:13:23.387Z" }, ] [[package]] @@ -735,11 +782,11 @@ wheels = [ [[package]] name = "oracle-oci-resource-search-mcp-server" -version = "2.1.0" +version = "2.1.1" source = { editable = "." } dependencies = [ { name = "fastmcp" }, - { name = "oci" }, + { name = "oci-cli" }, ] [package.dev-dependencies] @@ -752,7 +799,7 @@ dev = [ [package.metadata] requires-dist = [ { name = "fastmcp", specifier = "==2.13.0" }, - { name = "oci", specifier = "==2.160.0" }, + { name = "oci-cli", specifier = "==3.71.1" }, ] [package.metadata.requires-dev] @@ -816,6 +863,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, ] +[[package]] +name = "prompt-toolkit" +version = "3.0.43" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cc/c6/25b6a3d5cd295304de1e32c9edbcf319a52e965b339629d37d42bb7126ca/prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d", size = 425733, upload-time = "2023-12-13T08:44:39.127Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ee/fd/ca7bf3869e7caa7a037e23078539467b433a4e01eebd93f77180ab927766/prompt_toolkit-3.0.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6", size = 386072, upload-time = "2023-12-13T08:44:35.304Z" }, +] + [[package]] name = "py-key-value-aio" version = "0.2.8" @@ -1234,6 +1293,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/46/f5af3402b579fd5e11573ce652019a67074317e18c1935cc0b4ba9b35552/secretstorage-3.5.0-py3-none-any.whl", hash = "sha256:0ce65888c0725fcb2c5bc0fdb8e5438eece02c523557ea40ce0703c266248137", size = 15554, upload-time = "2025-11-23T19:02:51.545Z" }, ] +[[package]] +name = "setuptools" +version = "80.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c", size = 1319958, upload-time = "2025-05-27T00:56:51.443Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", size = 1201486, upload-time = "2025-05-27T00:56:49.664Z" }, +] + [[package]] name = "six" version = "1.17.0" @@ -1276,6 +1344,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/be/72/2db2f49247d0a18b4f1bb9a5a39a0162869acf235f3a96418363947b3d46/starlette-0.48.0-py3-none-any.whl", hash = "sha256:0764ca97b097582558ecb498132ed0c7d942f233f365b86ba37770e026510659", size = 73736, upload-time = "2025-09-13T08:41:03.869Z" }, ] +[[package]] +name = "terminaltables" +version = "3.1.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/fc/0b73d782f5ab7feba8d007573a3773c58255f223c5940a7b7085f02153c3/terminaltables-3.1.10.tar.gz", hash = "sha256:ba6eca5cb5ba02bba4c9f4f985af80c54ec3dccf94cfcd190154386255e47543", size = 12264, upload-time = "2021-12-07T19:03:35.758Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/fb/ea621e0a19733e01fe4005d46087d383693c0f4a8f824b47d8d4122c87e0/terminaltables-3.1.10-py2.py3-none-any.whl", hash = "sha256:e4fdc4179c9e4aab5f674d80f09d76fa436b96fdc698a8505e0a36bf0804a874", size = 15155, upload-time = "2021-12-07T19:03:34.013Z" }, +] + [[package]] name = "typing-extensions" version = "4.15.0" @@ -1297,6 +1374,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/17/69/cd203477f944c353c31bade965f880aa1061fd6bf05ded0726ca845b6ff7/typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51", size = 14552, upload-time = "2025-05-21T18:55:22.152Z" }, ] +[[package]] +name = "tzdata" +version = "2025.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload-time = "2025-03-23T13:54:43.652Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload-time = "2025-03-23T13:54:41.845Z" }, +] + [[package]] name = "urllib3" version = "2.5.0" @@ -1319,6 +1405,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/96/06/5cc0542b47c0338c1cb676b348e24a1c29acabc81000bced518231dded6f/uvicorn-0.36.0-py3-none-any.whl", hash = "sha256:6bb4ba67f16024883af8adf13aba3a9919e415358604ce46780d3f9bdc36d731", size = 67675, upload-time = "2025-09-20T01:07:12.984Z" }, ] +[[package]] +name = "wcwidth" +version = "0.2.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/30/6b0809f4510673dc723187aeaf24c7f5459922d01e2f794277a3dfb90345/wcwidth-0.2.14.tar.gz", hash = "sha256:4d478375d31bc5395a3c55c40ccdf3354688364cd61c4f6adacaa9215d0b3605", size = 102293, upload-time = "2025-09-22T16:29:53.023Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl", hash = "sha256:a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1", size = 37286, upload-time = "2025-09-22T16:29:51.641Z" }, +] + [[package]] name = "websockets" version = "15.0.1" diff --git a/src/oci-usage-mcp-server/Dockerfile b/src/oci-usage-mcp-server/Dockerfile new file mode 100644 index 00000000..8189bfda --- /dev/null +++ b/src/oci-usage-mcp-server/Dockerfile @@ -0,0 +1,22 @@ +FROM ghcr.io/oracle/oraclelinux@sha256:1950389c3dd619841813520b4e69d7f3112c4c10f713fcb90680703d184c33ad + +# Install python 3.13 +RUN microdnf install epel-release && \ + microdnf install python3.13 python3.13-pip \ + && rm -rf /var/cache/dnf/* \ + && useradd -m -d /app oracle + +# Copy the MCP server to the docker container +WORKDIR /app +COPY --chown=oracle:oracle . /app + +# Install dependencies +RUN pip3.13 install --no-cache-dir uv && \ + uv --no-cache sync --locked --all-extras + +# Change user +USER oracle + +# Start the MCP server +ENTRYPOINT ["uv", "run"] +CMD ["oracle.oci-usage-mcp-server"] diff --git a/src/oci-usage-mcp-server/oracle/oci_usage_mcp_server/__init__.py b/src/oci-usage-mcp-server/oracle/oci_usage_mcp_server/__init__.py index ea934379..d49f8b63 100644 --- a/src/oci-usage-mcp-server/oracle/oci_usage_mcp_server/__init__.py +++ b/src/oci-usage-mcp-server/oracle/oci_usage_mcp_server/__init__.py @@ -5,4 +5,4 @@ """ __project__ = "oracle.oci-usage-mcp-server" -__version__ = "1.1.0" +__version__ = "1.1.1" diff --git a/src/oci-usage-mcp-server/oracle/oci_usage_mcp_server/server.py b/src/oci-usage-mcp-server/oracle/oci_usage_mcp_server/server.py index 119f77e0..2f6f7ebc 100644 --- a/src/oci-usage-mcp-server/oracle/oci_usage_mcp_server/server.py +++ b/src/oci-usage-mcp-server/oracle/oci_usage_mcp_server/server.py @@ -28,7 +28,7 @@ def get_usage_client(): config["additional_user_agent"] = f"{user_agent_name}/{__version__}" private_key = oci.signer.load_private_key_from_file(config["key_file"]) - token_file = config["security_token_file"] + token_file = os.path.expanduser(config["security_token_file"]) token = None with open(token_file, "r") as f: token = f.read() diff --git a/src/oci-usage-mcp-server/pyproject.toml b/src/oci-usage-mcp-server/pyproject.toml index 5bfa1bcc..e181b6ba 100644 --- a/src/oci-usage-mcp-server/pyproject.toml +++ b/src/oci-usage-mcp-server/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "oracle.oci-usage-mcp-server" -version = "1.1.0" +version = "1.1.1" description = "OCI Usage MCP server" readme = "README.md" license = "UPL-1.0" @@ -11,7 +11,7 @@ authors = [ requires-python = ">=3.13" dependencies = [ "fastmcp==2.13.0", - "oci==2.160.0", + "oci-cli==3.71.1" ] classifiers = [ diff --git a/src/oci-usage-mcp-server/uv.lock b/src/oci-usage-mcp-server/uv.lock index b498fa3a..bd746e1f 100644 --- a/src/oci-usage-mcp-server/uv.lock +++ b/src/oci-usage-mcp-server/uv.lock @@ -24,6 +24,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6f/12/e5e0282d673bb9746bacfb6e2dba8719989d3660cdb2ea79aee9a9651afb/anyio-4.10.0-py3-none-any.whl", hash = "sha256:60e474ac86736bbfd6f210f7a61218939c318f43f9972497381f1c5e930ed3d1", size = 107213, upload-time = "2025-08-04T08:54:24.882Z" }, ] +[[package]] +name = "arrow" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-dateutil" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/33/032cdc44182491aa708d06a68b62434140d8c50820a087fac7af37703357/arrow-1.4.0.tar.gz", hash = "sha256:ed0cc050e98001b8779e84d461b0098c4ac597e88704a655582b21d116e526d7", size = 152931, upload-time = "2025-10-18T17:46:46.761Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/c9/d7977eaacb9df673210491da99e6a247e93df98c715fc43fd136ce1d3d33/arrow-1.4.0-py3-none-any.whl", hash = "sha256:749f0769958ebdc79c173ff0b0670d59051a535fa26e8eba02953dc19eb43205", size = 68797, upload-time = "2025-10-18T17:46:45.663Z" }, +] + [[package]] name = "attrs" version = "25.3.0" @@ -159,14 +172,14 @@ wheels = [ [[package]] name = "click" -version = "8.3.0" +version = "8.0.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/46/61/de6cd827efad202d7057d93e0fed9294b96952e188f7384832791c7b2254/click-8.3.0.tar.gz", hash = "sha256:e7b8232224eba16f4ebe410c25ced9f7875cb5f3263ffc93cc3e8da705e229c4", size = 276943, upload-time = "2025-09-18T17:32:23.696Z" } +sdist = { url = "https://files.pythonhosted.org/packages/dd/cf/706c1ad49ab26abed0b77a2f867984c1341ed7387b8030a6aa914e2942a0/click-8.0.4.tar.gz", hash = "sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb", size = 329520, upload-time = "2022-02-18T20:31:30.105Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/db/d3/9dcc0f5797f070ec8edf30fbadfb200e71d9db6b84d211e3b2085a7589a0/click-8.3.0-py3-none-any.whl", hash = "sha256:9b9f285302c6e3064f4330c05f05b81945b2a39544279343e6e7c5f27a9baddc", size = 107295, upload-time = "2025-09-18T17:32:22.42Z" }, + { url = "https://files.pythonhosted.org/packages/4a/a8/0b2ced25639fb20cc1c9784de90a8c25f9504a7f18cd8b5397bd61696d7d/click-8.0.4-py3-none-any.whl", hash = "sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1", size = 97486, upload-time = "2022-02-18T20:31:27.733Z" }, ] [[package]] @@ -487,6 +500,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b2/a3/e137168c9c44d18eff0376253da9f1e9234d0239e0ee230d2fee6cea8e55/jeepney-0.9.0-py3-none-any.whl", hash = "sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683", size = 49010, upload-time = "2025-02-27T18:51:00.104Z" }, ] +[[package]] +name = "jmespath" +version = "0.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3c/56/3f325b1eef9791759784aa5046a8f6a1aff8f7c898a2e34506771d3b99d8/jmespath-0.10.0.tar.gz", hash = "sha256:b85d0567b8666149a93172712e68920734333c0ce7e89b78b3e987f71e5ed4f9", size = 21607, upload-time = "2020-05-12T22:03:47.267Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/cb/5f001272b6faeb23c1c9e0acc04d48eaaf5c862c17709d20e3469c6e0139/jmespath-0.10.0-py2.py3-none-any.whl", hash = "sha256:cdf6525904cc597730141d61b36f2e4b8ecc257c420fa2f4549bac2c2d0cb72f", size = 24489, upload-time = "2020-05-12T22:03:45.643Z" }, +] + [[package]] name = "jsonschema" version = "4.25.1" @@ -657,7 +679,7 @@ wheels = [ [[package]] name = "oci" -version = "2.160.0" +version = "2.164.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, @@ -667,9 +689,34 @@ dependencies = [ { name = "python-dateutil" }, { name = "pytz" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f3/7b/c9d7fc28f11c25c7875db3584eab5d52ccb2d7df553d07ac47f19a14d075/oci-2.160.0.tar.gz", hash = "sha256:f8e3410204c1405b40247179550cf74f5145a8e17025c4f2a92f2b9ffdc7d26b", size = 15601606, upload-time = "2025-09-09T04:17:43.728Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6e/fc/1c227e66ad949858b4388b18df76c9ef834228c3ca4b3c38c4cc7a099171/oci-2.164.1.tar.gz", hash = "sha256:2089632da42e9f556de046b6663050f2a046b06603eeefb90dc79810e91ee2c5", size = 16177816, upload-time = "2025-12-09T10:39:25.947Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/71/7c5725cd015aded721b3c36c25d1be302dfc11dc80ab966243663f9e1a1a/oci-2.164.1-py3-none-any.whl", hash = "sha256:65869381433e7a48ba5adfb63cf275e77bad4dd2ea79887e0a61110962252e3a", size = 32980817, upload-time = "2025-12-09T10:39:15.459Z" }, +] + +[[package]] +name = "oci-cli" +version = "3.71.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "arrow" }, + { name = "certifi" }, + { name = "click" }, + { name = "cryptography" }, + { name = "jmespath" }, + { name = "oci" }, + { name = "prompt-toolkit" }, + { name = "pyopenssl" }, + { name = "python-dateutil" }, + { name = "pytz" }, + { name = "pyyaml" }, + { name = "setuptools" }, + { name = "six" }, + { name = "terminaltables" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0f/34/f49d7a531968edc727a0ed6da2c66dc5317738c8c75e224cca690ba11cbd/oci_cli-3.71.1.tar.gz", hash = "sha256:91e1674f6c2f59d3c955be77e68b209967fa3fc3be53a5421177bb0bf3d5557d", size = 7726932, upload-time = "2025-12-09T13:13:29.326Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/78/51/752375a4e0d2de371c2788414157eda337417010d2ef7383cd7140388f1e/oci-2.160.0-py3-none-any.whl", hash = "sha256:3dba1ec671ebea23f255fabf836cb0fd08aea0913a8df85610fccaa5a4344ee9", size = 31715365, upload-time = "2025-09-09T04:17:34.998Z" }, + { url = "https://files.pythonhosted.org/packages/e2/9d/ea8a5583eb97174eb997f2050e47a422d24cf229888fcfe0ddb7c9b8b452/oci_cli-3.71.1-py3-none-any.whl", hash = "sha256:e91e8ffaeb373db3ad0c95d49b6137e59c3277f3911a099927efedae55a3d761", size = 25219923, upload-time = "2025-12-09T13:13:23.387Z" }, ] [[package]] @@ -735,11 +782,11 @@ wheels = [ [[package]] name = "oracle-oci-usage-mcp-server" -version = "1.1.0" +version = "1.1.1" source = { editable = "." } dependencies = [ { name = "fastmcp" }, - { name = "oci" }, + { name = "oci-cli" }, ] [package.dev-dependencies] @@ -752,7 +799,7 @@ dev = [ [package.metadata] requires-dist = [ { name = "fastmcp", specifier = "==2.13.0" }, - { name = "oci", specifier = "==2.160.0" }, + { name = "oci-cli", specifier = "==3.71.1" }, ] [package.metadata.requires-dev] @@ -816,6 +863,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, ] +[[package]] +name = "prompt-toolkit" +version = "3.0.43" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cc/c6/25b6a3d5cd295304de1e32c9edbcf319a52e965b339629d37d42bb7126ca/prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d", size = 425733, upload-time = "2023-12-13T08:44:39.127Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ee/fd/ca7bf3869e7caa7a037e23078539467b433a4e01eebd93f77180ab927766/prompt_toolkit-3.0.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6", size = 386072, upload-time = "2023-12-13T08:44:35.304Z" }, +] + [[package]] name = "py-key-value-aio" version = "0.2.8" @@ -1234,6 +1293,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/46/f5af3402b579fd5e11573ce652019a67074317e18c1935cc0b4ba9b35552/secretstorage-3.5.0-py3-none-any.whl", hash = "sha256:0ce65888c0725fcb2c5bc0fdb8e5438eece02c523557ea40ce0703c266248137", size = 15554, upload-time = "2025-11-23T19:02:51.545Z" }, ] +[[package]] +name = "setuptools" +version = "80.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c", size = 1319958, upload-time = "2025-05-27T00:56:51.443Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", size = 1201486, upload-time = "2025-05-27T00:56:49.664Z" }, +] + [[package]] name = "six" version = "1.17.0" @@ -1276,6 +1344,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/be/72/2db2f49247d0a18b4f1bb9a5a39a0162869acf235f3a96418363947b3d46/starlette-0.48.0-py3-none-any.whl", hash = "sha256:0764ca97b097582558ecb498132ed0c7d942f233f365b86ba37770e026510659", size = 73736, upload-time = "2025-09-13T08:41:03.869Z" }, ] +[[package]] +name = "terminaltables" +version = "3.1.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/fc/0b73d782f5ab7feba8d007573a3773c58255f223c5940a7b7085f02153c3/terminaltables-3.1.10.tar.gz", hash = "sha256:ba6eca5cb5ba02bba4c9f4f985af80c54ec3dccf94cfcd190154386255e47543", size = 12264, upload-time = "2021-12-07T19:03:35.758Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/fb/ea621e0a19733e01fe4005d46087d383693c0f4a8f824b47d8d4122c87e0/terminaltables-3.1.10-py2.py3-none-any.whl", hash = "sha256:e4fdc4179c9e4aab5f674d80f09d76fa436b96fdc698a8505e0a36bf0804a874", size = 15155, upload-time = "2021-12-07T19:03:34.013Z" }, +] + [[package]] name = "typing-extensions" version = "4.15.0" @@ -1297,6 +1374,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/17/69/cd203477f944c353c31bade965f880aa1061fd6bf05ded0726ca845b6ff7/typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51", size = 14552, upload-time = "2025-05-21T18:55:22.152Z" }, ] +[[package]] +name = "tzdata" +version = "2025.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload-time = "2025-03-23T13:54:43.652Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload-time = "2025-03-23T13:54:41.845Z" }, +] + [[package]] name = "urllib3" version = "2.5.0" @@ -1319,6 +1405,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/96/06/5cc0542b47c0338c1cb676b348e24a1c29acabc81000bced518231dded6f/uvicorn-0.36.0-py3-none-any.whl", hash = "sha256:6bb4ba67f16024883af8adf13aba3a9919e415358604ce46780d3f9bdc36d731", size = 67675, upload-time = "2025-09-20T01:07:12.984Z" }, ] +[[package]] +name = "wcwidth" +version = "0.2.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/30/6b0809f4510673dc723187aeaf24c7f5459922d01e2f794277a3dfb90345/wcwidth-0.2.14.tar.gz", hash = "sha256:4d478375d31bc5395a3c55c40ccdf3354688364cd61c4f6adacaa9215d0b3605", size = 102293, upload-time = "2025-09-22T16:29:53.023Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl", hash = "sha256:a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1", size = 37286, upload-time = "2025-09-22T16:29:51.641Z" }, +] + [[package]] name = "websockets" version = "15.0.1"