From ac7c351ed0b02ec6b87057835dc4d966ea72c43b Mon Sep 17 00:00:00 2001 From: Steve Hillier Date: Fri, 28 Aug 2026 20:44:26 -0700 Subject: [PATCH 1/3] fix geojson model --- src/planet_mcp/models.py | 11 ++++++++--- tests/test_server.py | 32 +++++++++++++++++++++++++++++++- 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/src/planet_mcp/models.py b/src/planet_mcp/models.py index 50d0760..31fbd5c 100644 --- a/src/planet_mcp/models.py +++ b/src/planet_mcp/models.py @@ -1,8 +1,13 @@ -from typing import Any +from typing import NotRequired from typing_extensions import TypedDict +Position = list[float] +Coordinates = ( + Position | list[Position] | list[list[Position]] | list[list[list[Position]]] +) + class Geometry(TypedDict): type: str - coordinates: Any - content: str | None + coordinates: NotRequired[Coordinates] + content: NotRequired[str] diff --git a/tests/test_server.py b/tests/test_server.py index 1313ea4..81d8e24 100644 --- a/tests/test_server.py +++ b/tests/test_server.py @@ -1,4 +1,6 @@ from http import HTTPStatus +import json + import httpx import pytest from fastmcp import Client @@ -23,9 +25,37 @@ async def test_search_tool(): "item_types": ["SkySatScene"], "start_date": "2023-01-01", "end_date": "2023-01-02", - "geometry": {"type": "Point", "coordinates": [0, 0], "content": None}, + "geometry": {"type": "Point", "coordinates": [0, 0]}, }, ) assert len(result.content) == 1 assert result.content[0].type == "text" assert result.content[0].text == '[{"type":"Feature"}]' + + request = json.loads(respx.calls.last.request.content) + assert request["geometry"] == {"type": "Point", "coordinates": [0, 0]} + + +@pytest.mark.asyncio +@respx.mock +async def test_search_tool_feature_reference(): + respx.request( + "POST", "https://api.planet.com/data/v1/quick-search" + ).return_value = httpx.Response( + HTTPStatus.OK, json={"features": [{"type": "Feature"}]} + ) + ref = "pl:features/my/test-collection-123/my-feature-id" + async with client: + result = await client.call_tool( + "sdk_data_search", + { + "item_types": ["SkySatScene"], + "start_date": None, + "end_date": None, + "geometry": {"type": "ref", "content": ref}, + }, + ) + assert result.content[0].text == '[{"type":"Feature"}]' + + request = json.loads(respx.calls.last.request.content) + assert request["geometry"] == {"type": "ref", "content": ref} From 75175792306bab26bb3d5f3fcf17bd616c57ee02 Mon Sep 17 00:00:00 2001 From: Steve Hillier Date: Fri, 28 Aug 2026 20:59:43 -0700 Subject: [PATCH 2/3] lint fixes and pin ruff --- __init__.py | 0 noxfile.py | 7 +++-- pyproject.toml | 2 +- src/planet_mcp/main.py | 3 +- src/planet_mcp/models.py | 1 + src/planet_mcp/server.py | 12 +++++--- src/planet_mcp/servers/__init__.py | 4 +-- src/planet_mcp/servers/sdk.py | 12 ++++---- src/planet_mcp/servers/search.py | 8 ++--- src/planet_mcp/servers/tiles.py | 5 ++-- tests/conftest.py | 1 + tests/test_server.py | 5 ++-- uv.lock | 47 +++++++++++++++--------------- 13 files changed, 56 insertions(+), 51 deletions(-) delete mode 100644 __init__.py diff --git a/__init__.py b/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/noxfile.py b/noxfile.py index 558f4c5..b5e0302 100644 --- a/noxfile.py +++ b/noxfile.py @@ -1,6 +1,7 @@ +import shutil from pathlib import Path + import nox -import shutil nox.options.stop_on_first_error = True nox.options.reuse_existing_virtualenvs = False @@ -33,7 +34,7 @@ def lint(session): session.run( "uv", "tool", "run", "black", "--verbose", "--check", "--diff", "--color", "." ) - session.run("uv", "tool", "run", "ruff", "--verbose", "check", ".") + session.run("uv", "tool", "run", "ruff@0.16.5", "--verbose", "check", ".") @nox.session @@ -68,7 +69,7 @@ def build(session): session.install("build", "twine", "check-wheel-contents") - session.run(*"python -m build --sdist --wheel".split()) + session.run(*["python", "-m", "build", "--sdist", "--wheel"]) session.run("check-wheel-contents", "dist") diff --git a/pyproject.toml b/pyproject.toml index 4f2bdcc..81d3719 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -45,7 +45,7 @@ addopts = ["-v", "--tb=short"] dev = [ "black>=25.1.0", "pyright>=1.1.403", - "ruff>=0.12.4", + "ruff==0.16.5", ] test = [ "pytest>=8.0.0", diff --git a/src/planet_mcp/main.py b/src/planet_mcp/main.py index 977e55d..464157a 100644 --- a/src/planet_mcp/main.py +++ b/src/planet_mcp/main.py @@ -4,12 +4,13 @@ """ import argparse + from planet_mcp.server import init def parse_args() -> argparse.Namespace: def csv(value): - return set(t.strip() for t in (value or "").split(",")) + return {t.strip() for t in (value or "").split(",")} parser = argparse.ArgumentParser( description="Planet MCP Server", diff --git a/src/planet_mcp/models.py b/src/planet_mcp/models.py index 31fbd5c..ef6e409 100644 --- a/src/planet_mcp/models.py +++ b/src/planet_mcp/models.py @@ -1,4 +1,5 @@ from typing import NotRequired + from typing_extensions import TypedDict Position = list[float] diff --git a/src/planet_mcp/server.py b/src/planet_mcp/server.py index 0b3a18d..06f36f1 100644 --- a/src/planet_mcp/server.py +++ b/src/planet_mcp/server.py @@ -1,6 +1,8 @@ +from collections.abc import AsyncIterator from contextlib import asynccontextmanager -from typing import AsyncIterator + from fastmcp import FastMCP + from planet_mcp import servers _instructions = """ @@ -41,13 +43,15 @@ def init( for server in servers.all: try: # server protocol is either a variable or callable named mcp - entry = getattr(server, "mcp") + entry = server.mcp except AttributeError: - raise Exception(f"programmer error, mcp attribute not in {server}") + raise AttributeError( + f"programmer error, mcp attribute not in {server}" + ) from None if callable(entry): entry = entry() if not isinstance(entry, FastMCP): - raise Exception( + raise TypeError( f"programmer error, expected FastMCP type, got {type(entry)}" ) if enabled_servers is None or entry.name in enabled_servers: diff --git a/src/planet_mcp/servers/__init__.py b/src/planet_mcp/servers/__init__.py index 78ca397..340d0ef 100644 --- a/src/planet_mcp/servers/__init__.py +++ b/src/planet_mcp/servers/__init__.py @@ -1,6 +1,4 @@ -from . import sdk -from . import tiles -from . import search +from . import sdk, search, tiles all = [ sdk, diff --git a/src/planet_mcp/servers/sdk.py b/src/planet_mcp/servers/sdk.py index 6bf1c54..d25895b 100644 --- a/src/planet_mcp/servers/sdk.py +++ b/src/planet_mcp/servers/sdk.py @@ -1,14 +1,16 @@ import functools import inspect -from types import NoneType import typing +from types import NoneType +from typing import Union + +import planet +from fastmcp import FastMCP from planet_mcp import models from planet_mcp.clients import session + from . import descriptions -from fastmcp import FastMCP -import planet -from typing import Union # tools we don't want enabled at all. # they simply don't work well in an AI context. @@ -165,7 +167,7 @@ async def wrapper(*args, **kwargs): hint = hint | None wrapper.__annotations__[param_name] = hint - except Exception as e: + except Exception as e: # noqa: BLE001 print(f"Error modifying signature: {e}") wrapper.__annotations__ = {} diff --git a/src/planet_mcp/servers/search.py b/src/planet_mcp/servers/search.py index dc6e154..a144b15 100644 --- a/src/planet_mcp/servers/search.py +++ b/src/planet_mcp/servers/search.py @@ -37,13 +37,9 @@ async def data_search( if start_date is not None or end_date is not None: datefilter_config = {} if start_date is not None: - datefilter_config["gte"] = datetime.fromisoformat( - start_date.replace("Z", "+00:00") - ).isoformat() + datefilter_config["gte"] = datetime.fromisoformat(start_date).isoformat() if end_date is not None: - datefilter_config["lte"] = datetime.fromisoformat( - end_date.replace("Z", "+00:00") - ).isoformat() + datefilter_config["lte"] = datetime.fromisoformat(end_date).isoformat() datefilter = { "type": "DateRangeFilter", "field_name": "acquired", diff --git a/src/planet_mcp/servers/tiles.py b/src/planet_mcp/servers/tiles.py index 9d5f07f..6178fcb 100644 --- a/src/planet_mcp/servers/tiles.py +++ b/src/planet_mcp/servers/tiles.py @@ -1,8 +1,9 @@ from typing import Annotated -from fastmcp import FastMCP -from fastmcp.utilities.types import Image + import httpx import mercantile +from fastmcp import FastMCP +from fastmcp.utilities.types import Image from pydantic import Field from planet_mcp.clients import session diff --git a/tests/conftest.py b/tests/conftest.py index cffd9f1..55d479a 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,4 +1,5 @@ from http import HTTPStatus + import httpx import pytest import respx diff --git a/tests/test_server.py b/tests/test_server.py index 81d8e24..2ed060e 100644 --- a/tests/test_server.py +++ b/tests/test_server.py @@ -1,10 +1,11 @@ -from http import HTTPStatus import json +from http import HTTPStatus import httpx import pytest -from fastmcp import Client import respx +from fastmcp import Client + from planet_mcp.server import init client = Client(init()) diff --git a/uv.lock b/uv.lock index 05ea416..909f1fe 100644 --- a/uv.lock +++ b/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 2 +revision = 3 requires-python = ">=3.11" [[package]] @@ -908,7 +908,7 @@ requires-dist = [ dev = [ { name = "black", specifier = ">=25.1.0" }, { name = "pyright", specifier = ">=1.1.403" }, - { name = "ruff", specifier = ">=0.12.4" }, + { name = "ruff", specifier = "==0.16.5" }, ] test = [ { name = "httpx", specifier = ">=0.25.0" }, @@ -1439,28 +1439,27 @@ wheels = [ [[package]] name = "ruff" -version = "0.12.10" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3b/eb/8c073deb376e46ae767f4961390d17545e8535921d2f65101720ed8bd434/ruff-0.12.10.tar.gz", hash = "sha256:189ab65149d11ea69a2d775343adf5f49bb2426fc4780f65ee33b423ad2e47f9", size = 5310076, upload-time = "2025-08-21T18:23:22.595Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/24/e7/560d049d15585d6c201f9eeacd2fd130def3741323e5ccf123786e0e3c95/ruff-0.12.10-py3-none-linux_armv6l.whl", hash = "sha256:8b593cb0fb55cc8692dac7b06deb29afda78c721c7ccfed22db941201b7b8f7b", size = 11935161, upload-time = "2025-08-21T18:22:26.965Z" }, - { url = "https://files.pythonhosted.org/packages/d1/b0/ad2464922a1113c365d12b8f80ed70fcfb39764288ac77c995156080488d/ruff-0.12.10-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ebb7333a45d56efc7c110a46a69a1b32365d5c5161e7244aaf3aa20ce62399c1", size = 12660884, upload-time = "2025-08-21T18:22:30.925Z" }, - { url = "https://files.pythonhosted.org/packages/d7/f1/97f509b4108d7bae16c48389f54f005b62ce86712120fd8b2d8e88a7cb49/ruff-0.12.10-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d59e58586829f8e4a9920788f6efba97a13d1fa320b047814e8afede381c6839", size = 11872754, upload-time = "2025-08-21T18:22:34.035Z" }, - { url = "https://files.pythonhosted.org/packages/12/ad/44f606d243f744a75adc432275217296095101f83f966842063d78eee2d3/ruff-0.12.10-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:822d9677b560f1fdeab69b89d1f444bf5459da4aa04e06e766cf0121771ab844", size = 12092276, upload-time = "2025-08-21T18:22:36.764Z" }, - { url = "https://files.pythonhosted.org/packages/06/1f/ed6c265e199568010197909b25c896d66e4ef2c5e1c3808caf461f6f3579/ruff-0.12.10-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:37b4a64f4062a50c75019c61c7017ff598cb444984b638511f48539d3a1c98db", size = 11734700, upload-time = "2025-08-21T18:22:39.822Z" }, - { url = "https://files.pythonhosted.org/packages/63/c5/b21cde720f54a1d1db71538c0bc9b73dee4b563a7dd7d2e404914904d7f5/ruff-0.12.10-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2c6f4064c69d2542029b2a61d39920c85240c39837599d7f2e32e80d36401d6e", size = 13468783, upload-time = "2025-08-21T18:22:42.559Z" }, - { url = "https://files.pythonhosted.org/packages/02/9e/39369e6ac7f2a1848f22fb0b00b690492f20811a1ac5c1fd1d2798329263/ruff-0.12.10-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:059e863ea3a9ade41407ad71c1de2badfbe01539117f38f763ba42a1206f7559", size = 14436642, upload-time = "2025-08-21T18:22:45.612Z" }, - { url = "https://files.pythonhosted.org/packages/e3/03/5da8cad4b0d5242a936eb203b58318016db44f5c5d351b07e3f5e211bb89/ruff-0.12.10-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1bef6161e297c68908b7218fa6e0e93e99a286e5ed9653d4be71e687dff101cf", size = 13859107, upload-time = "2025-08-21T18:22:48.886Z" }, - { url = "https://files.pythonhosted.org/packages/19/19/dd7273b69bf7f93a070c9cec9494a94048325ad18fdcf50114f07e6bf417/ruff-0.12.10-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4f1345fbf8fb0531cd722285b5f15af49b2932742fc96b633e883da8d841896b", size = 12886521, upload-time = "2025-08-21T18:22:51.567Z" }, - { url = "https://files.pythonhosted.org/packages/c0/1d/b4207ec35e7babaee62c462769e77457e26eb853fbdc877af29417033333/ruff-0.12.10-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f68433c4fbc63efbfa3ba5db31727db229fa4e61000f452c540474b03de52a9", size = 13097528, upload-time = "2025-08-21T18:22:54.609Z" }, - { url = "https://files.pythonhosted.org/packages/ff/00/58f7b873b21114456e880b75176af3490d7a2836033779ca42f50de3b47a/ruff-0.12.10-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:141ce3d88803c625257b8a6debf4a0473eb6eed9643a6189b68838b43e78165a", size = 13080443, upload-time = "2025-08-21T18:22:57.413Z" }, - { url = "https://files.pythonhosted.org/packages/12/8c/9e6660007fb10189ccb78a02b41691288038e51e4788bf49b0a60f740604/ruff-0.12.10-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:f3fc21178cd44c98142ae7590f42ddcb587b8e09a3b849cbc84edb62ee95de60", size = 11896759, upload-time = "2025-08-21T18:23:00.473Z" }, - { url = "https://files.pythonhosted.org/packages/67/4c/6d092bb99ea9ea6ebda817a0e7ad886f42a58b4501a7e27cd97371d0ba54/ruff-0.12.10-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:7d1a4e0bdfafcd2e3e235ecf50bf0176f74dd37902f241588ae1f6c827a36c56", size = 11701463, upload-time = "2025-08-21T18:23:03.211Z" }, - { url = "https://files.pythonhosted.org/packages/59/80/d982c55e91df981f3ab62559371380616c57ffd0172d96850280c2b04fa8/ruff-0.12.10-py3-none-musllinux_1_2_i686.whl", hash = "sha256:e67d96827854f50b9e3e8327b031647e7bcc090dbe7bb11101a81a3a2cbf1cc9", size = 12691603, upload-time = "2025-08-21T18:23:06.935Z" }, - { url = "https://files.pythonhosted.org/packages/ad/37/63a9c788bbe0b0850611669ec6b8589838faf2f4f959647f2d3e320383ae/ruff-0.12.10-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:ae479e1a18b439c59138f066ae79cc0f3ee250712a873d00dbafadaad9481e5b", size = 13164356, upload-time = "2025-08-21T18:23:10.225Z" }, - { url = "https://files.pythonhosted.org/packages/47/d4/1aaa7fb201a74181989970ebccd12f88c0fc074777027e2a21de5a90657e/ruff-0.12.10-py3-none-win32.whl", hash = "sha256:9de785e95dc2f09846c5e6e1d3a3d32ecd0b283a979898ad427a9be7be22b266", size = 11896089, upload-time = "2025-08-21T18:23:14.232Z" }, - { url = "https://files.pythonhosted.org/packages/ad/14/2ad38fd4037daab9e023456a4a40ed0154e9971f8d6aed41bdea390aabd9/ruff-0.12.10-py3-none-win_amd64.whl", hash = "sha256:7837eca8787f076f67aba2ca559cefd9c5cbc3a9852fd66186f4201b87c1563e", size = 13004616, upload-time = "2025-08-21T18:23:17.422Z" }, - { url = "https://files.pythonhosted.org/packages/24/3c/21cf283d67af33a8e6ed242396863af195a8a6134ec581524fd22b9811b6/ruff-0.12.10-py3-none-win_arm64.whl", hash = "sha256:cc138cc06ed9d4bfa9d667a65af7172b47840e1a98b02ce7011c391e54635ffc", size = 12074225, upload-time = "2025-08-21T18:23:20.137Z" }, +version = "0.16.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/85/c8e12473c93018f92d19dd988a294202e1c27426c47ec4de53ffb847b8d8/ruff-0.16.5.tar.gz", hash = "sha256:1b88500f9ffbcab3dedb0082c9f9492e91ec3d618aac1236a3e0189938f7040b", size = 4912003, upload-time = "2026-08-27T16:34:18.258Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/b6/77c90a970fe2dae17a723acbd011043ea97c98d7deacccefdc4ba74ec512/ruff-0.16.5-py3-none-linux_armv6l.whl", hash = "sha256:12e5f673e774c35fbb62f288809c7653b73445f8ecec6b6063fd6ea3521aa14b", size = 10011941, upload-time = "2026-08-27T16:33:41.287Z" }, + { url = "https://files.pythonhosted.org/packages/4b/46/6cf67cf6411885a1d6f7f6d801682f155536a85176d10b605e2ceffed8bd/ruff-0.16.5-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:eda58a5802de40e7ed5b32b64e0b32539338cc6fcd2c78f61e3ad6a0d79f51c3", size = 10204049, upload-time = "2026-08-27T16:33:44.056Z" }, + { url = "https://files.pythonhosted.org/packages/46/fd/c8720ca7a090abf0c2fef4abe8a5ef6e5127ed15196d8886ff75a2b370e2/ruff-0.16.5-py3-none-macosx_11_0_arm64.whl", hash = "sha256:c5ae9a7b9a8875131f40f8fe967cc86abf899779efd663cb7ce3d572d01da7eb", size = 9809037, upload-time = "2026-08-27T16:33:46.257Z" }, + { url = "https://files.pythonhosted.org/packages/43/45/a684caacdedaca180f52bacccc40bf0789d2c5a7c75f25324853e9eaedb5/ruff-0.16.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b719b0a1f4d59710d283ab2965f621684a108a9e41da622e3b23f0326cd0025", size = 9964129, upload-time = "2026-08-27T16:33:48.352Z" }, + { url = "https://files.pythonhosted.org/packages/9e/f2/5d2bcdaca6b5b93d1b4dfc166cd2aebf7680143a1b38a28759df13a94d31/ruff-0.16.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2298f2780ed1be0c5cb1361e32ab7b1467f3cce7dabe101d2210a314f2fe42e9", size = 9821518, upload-time = "2026-08-27T16:33:50.57Z" }, + { url = "https://files.pythonhosted.org/packages/aa/ff/011cce29accf9257d5974145b733fc653a37985ed6825413a3987cefbfe0/ruff-0.16.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:258f29035a2dd021e7861e631b227a5b3f14e50c1184c9a6a122c5f4576154d7", size = 10534835, upload-time = "2026-08-27T16:33:52.522Z" }, + { url = "https://files.pythonhosted.org/packages/d7/5a/f0cf109bada9bba0e96c90c21c9f9251803f57225c32d293327a03c710d6/ruff-0.16.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b9a4f0432966834019c74d1b7e5c51224305d7713f3d7faf3e7451f1a3be3cde", size = 11252550, upload-time = "2026-08-27T16:33:54.521Z" }, + { url = "https://files.pythonhosted.org/packages/63/4d/1d481aaea2046c6a7ed7c291f9004c669cce3c087b6b376ed5b08271e3fe/ruff-0.16.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b5eb3a8c3d0ade9cea42b591fd530368e8798380e30e0a308b85a5cf718f09ea", size = 10777949, upload-time = "2026-08-27T16:33:56.88Z" }, + { url = "https://files.pythonhosted.org/packages/ee/34/ee245ca55f64443233034b3d02b03236b19242004281247c079390b7facd/ruff-0.16.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef0f69e191a13a3c9816f63163c88790cb12cd157bbbb384e9c44745702ab105", size = 10311656, upload-time = "2026-08-27T16:33:59.12Z" }, + { url = "https://files.pythonhosted.org/packages/a7/4d/c33a333e341c0a2b96c715b52d89a606f5a34cd4ac493cd9b8d0187186b8/ruff-0.16.5-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:0eeab41fbea2c42f98dfb9822cdccda9d24ba38d49f6dc945b5c236d48f0ef29", size = 10532125, upload-time = "2026-08-27T16:34:01.166Z" }, + { url = "https://files.pythonhosted.org/packages/30/e1/a64cef78b40192497bb98a27a8aa8f2c98ee9ee15bc97f7712d94ef32937/ruff-0.16.5-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:f0768e9df4300713fff30733c87575f68b6f1d8de41184e505b7fdd9c0c95eaf", size = 10097648, upload-time = "2026-08-27T16:34:03.16Z" }, + { url = "https://files.pythonhosted.org/packages/cc/4e/4cdc9ed3c3e109d2f71e62572a37457298d7bc7501ec3138babb7ed32bbd/ruff-0.16.5-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:95cc70cdc7aa80c338de356279d2adbeb2de0f520b9ecd8aba75b94e95e02f91", size = 9829344, upload-time = "2026-08-27T16:34:05.134Z" }, + { url = "https://files.pythonhosted.org/packages/39/4a/31ed35ce31729955fc583ee0d176d6e784c1290cb0b0a75cb2134c1ab72a/ruff-0.16.5-py3-none-musllinux_1_2_i686.whl", hash = "sha256:d185c8398ded1bfd91c0c2cb258346307571eccc473a8490af8c3977399c384a", size = 10277117, upload-time = "2026-08-27T16:34:07.425Z" }, + { url = "https://files.pythonhosted.org/packages/a8/a0/60356d86687b4b666d593df213f4dc3041750d024cb7bf2cfa81cfd65c2e/ruff-0.16.5-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:fb8e3a3c4c6a784150a7ced53b015f4b253fc2bf97a610886419ead64b4756ef", size = 10711653, upload-time = "2026-08-27T16:34:09.712Z" }, + { url = "https://files.pythonhosted.org/packages/ed/20/656d67f5b25ca9bda4e02b1de25867b2954e1d19e03648060f167ad0f4cc/ruff-0.16.5-py3-none-win32.whl", hash = "sha256:288b0a5f080492fe5635db849f9e2e84aa3cce7b7f0e955997d416c507c76a26", size = 10034250, upload-time = "2026-08-27T16:34:11.8Z" }, + { url = "https://files.pythonhosted.org/packages/5b/42/ee8e68a207b9127fcde6c3d7e197def432f346cb1af159e1fa14ca0d1cdc/ruff-0.16.5-py3-none-win_amd64.whl", hash = "sha256:ddc6385fb2137f616357ca03d6c74f4be987f80fed4008566b754f6032b8546f", size = 10516714, upload-time = "2026-08-27T16:34:13.963Z" }, + { url = "https://files.pythonhosted.org/packages/73/e3/7df5a396e445b9ba49ce9a9437439a4d80042c61c0ade199abf8d16de1ac/ruff-0.16.5-py3-none-win_arm64.whl", hash = "sha256:a64abe90968719b851bb7cedffaa8753fbdbdadab483089682db623f3edc587e", size = 10391564, upload-time = "2026-08-27T16:34:16.064Z" }, ] [[package]] From 65e6be4eee98cb1af8a75d8ce157477f8f2a3f77 Mon Sep 17 00:00:00 2001 From: Steve Hillier Date: Tue, 8 Sep 2026 17:32:42 -0700 Subject: [PATCH 3/3] version 0.4.0 --- pyproject.toml | 2 +- uv.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 81d3719..44e840c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "planet-mcp" -version = "0.3.0" +version = "0.4.0" readme = "README.md" dependencies = [ "aiocache>=0.12.3", diff --git a/uv.lock b/uv.lock index 909f1fe..b9ab3b4 100644 --- a/uv.lock +++ b/uv.lock @@ -872,7 +872,7 @@ wheels = [ [[package]] name = "planet-mcp" -version = "0.3.0" +version = "0.4.0" source = { editable = "." } dependencies = [ { name = "aiocache" },