Skip to content

Commit ef59809

Browse files
Doug Borgclaude
andcommitted
feat(mcp): apply Unpack decorator to all remaining MCP tools
Apply the @unpack_pydantic_params decorator to all remaining MCP tools to enable flat parameter calls from Claude Code. Tools updated: - catalog.py: create_product, create_material - items.py: search_items - purchase_orders.py: create_purchase_order, receive_purchase_order, verify_order_document - manufacturing_orders.py: create_manufacturing_order - orders.py: fulfill_order All 10 MCP tools now support flat parameters like: mcp__katana-erp__search_items(query="widget", limit=10) Instead of requiring nested request objects like: mcp__katana-erp__search_items(request={"query": "widget", "limit": 10}) This completes the rollout of the Unpack decorator to the entire MCP server. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 14f1835 commit ef59809

7 files changed

Lines changed: 27 additions & 12 deletions

File tree

katana_mcp_server/katana_mcp_server/docs/release-checklist-v0.1.0.md renamed to katana_mcp_server/docs/release-checklist-v0.1.0.md

File renamed without changes.

katana_mcp_server/src/katana_mcp/tools/foundation/catalog.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,14 @@
77
from __future__ import annotations
88

99
import time
10+
from typing import Annotated
1011

1112
from fastmcp import Context, FastMCP
1213
from pydantic import BaseModel, Field
1314

1415
from katana_mcp.logging import get_logger
1516
from katana_mcp.services import get_services
17+
from katana_mcp.unpack import Unpack, unpack_pydantic_params
1618
from katana_public_api_client.client_types import UNSET
1719
from katana_public_api_client.models import (
1820
CreateMaterialRequest as ApiCreateMaterialRequest,
@@ -144,8 +146,9 @@ async def _create_product_impl(
144146
raise
145147

146148

149+
@unpack_pydantic_params
147150
async def create_product(
148-
request: CreateProductRequest, context: Context
151+
request: Annotated[CreateProductRequest, Unpack()], context: Context
149152
) -> CreateProductResponse:
150153
"""Create a new product in Katana.
151154
@@ -295,8 +298,9 @@ async def _create_material_impl(
295298
raise
296299

297300

301+
@unpack_pydantic_params
298302
async def create_material(
299-
request: CreateMaterialRequest, context: Context
303+
request: Annotated[CreateMaterialRequest, Unpack()], context: Context
300304
) -> CreateMaterialResponse:
301305
"""Create a new material in Katana.
302306

katana_mcp_server/src/katana_mcp/tools/foundation/items.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,14 @@
88

99
import time
1010
from enum import Enum
11+
from typing import Annotated
1112

1213
from fastmcp import Context, FastMCP
1314
from pydantic import BaseModel, Field
1415

1516
from katana_mcp.logging import get_logger
1617
from katana_mcp.services import get_services
18+
from katana_mcp.unpack import Unpack, unpack_pydantic_params
1719
from katana_public_api_client.client_types import UNSET
1820
from katana_public_api_client.models import (
1921
CreateMaterialRequest,
@@ -148,8 +150,9 @@ async def _search_items_impl(
148150
raise
149151

150152

153+
@unpack_pydantic_params
151154
async def search_items(
152-
request: SearchItemsRequest, context: Context
155+
request: Annotated[SearchItemsRequest, Unpack()], context: Context
153156
) -> SearchItemsResponse:
154157
"""Search for items by name or SKU.
155158

katana_mcp_server/src/katana_mcp/tools/foundation/manufacturing_orders.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,13 @@
1010

1111
import logging
1212
from datetime import datetime
13-
from typing import cast
13+
from typing import Annotated, cast
1414

1515
from fastmcp import Context, FastMCP
1616
from pydantic import BaseModel, Field
1717

1818
from katana_mcp.services import get_services
19+
from katana_mcp.unpack import Unpack, unpack_pydantic_params
1920
from katana_public_api_client.client_types import UNSET
2021
from katana_public_api_client.models import (
2122
CreateManufacturingOrderRequest as APICreateManufacturingOrderRequest,
@@ -235,8 +236,9 @@ async def _create_manufacturing_order_impl(
235236
raise
236237

237238

239+
@unpack_pydantic_params
238240
async def create_manufacturing_order(
239-
request: CreateManufacturingOrderRequest, context: Context
241+
request: Annotated[CreateManufacturingOrderRequest, Unpack()], context: Context
240242
) -> ManufacturingOrderResponse:
241243
"""Create a manufacturing order with two-step confirmation.
242244

katana_mcp_server/src/katana_mcp/tools/foundation/orders.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,13 @@
99
from __future__ import annotations
1010

1111
import logging
12-
from typing import Literal, cast
12+
from typing import Annotated, Literal, cast
1313

1414
from fastmcp import Context, FastMCP
1515
from pydantic import BaseModel, Field
1616

1717
from katana_mcp.services import get_services
18+
from katana_mcp.unpack import Unpack, unpack_pydantic_params
1819
from katana_public_api_client.client_types import UNSET
1920
from katana_public_api_client.models import (
2021
CreateSalesOrderFulfillmentBody,
@@ -345,8 +346,9 @@ async def _fulfill_order_impl(
345346
raise
346347

347348

349+
@unpack_pydantic_params
348350
async def fulfill_order(
349-
request: FulfillOrderRequest, context: Context
351+
request: Annotated[FulfillOrderRequest, Unpack()], context: Context
350352
) -> FulfillOrderResponse:
351353
"""Fulfill a manufacturing order or sales order with two-step confirmation.
352354

katana_mcp_server/src/katana_mcp/tools/foundation/purchase_orders.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,13 @@
1313
import logging
1414
from datetime import UTC, datetime
1515
from enum import Enum
16-
from typing import Any, cast
16+
from typing import Annotated, Any, cast
1717

1818
from fastmcp import Context, FastMCP
1919
from pydantic import BaseModel, Field
2020

2121
from katana_mcp.services import get_services
22+
from katana_mcp.unpack import Unpack, unpack_pydantic_params
2223
from katana_public_api_client.client_types import UNSET
2324
from katana_public_api_client.models import (
2425
CreatePurchaseOrderRequest as APICreatePurchaseOrderRequest,
@@ -230,8 +231,9 @@ async def _create_purchase_order_impl(
230231
raise
231232

232233

234+
@unpack_pydantic_params
233235
async def create_purchase_order(
234-
request: CreatePurchaseOrderRequest, context: Context
236+
request: Annotated[CreatePurchaseOrderRequest, Unpack()], context: Context
235237
) -> PurchaseOrderResponse:
236238
"""Create a purchase order with two-step confirmation.
237239
@@ -409,8 +411,9 @@ async def _receive_purchase_order_impl(
409411
raise
410412

411413

414+
@unpack_pydantic_params
412415
async def receive_purchase_order(
413-
request: ReceivePurchaseOrderRequest, context: Context
416+
request: Annotated[ReceivePurchaseOrderRequest, Unpack()], context: Context
414417
) -> ReceivePurchaseOrderResponse:
415418
"""Receive items from a purchase order with two-step confirmation.
416419
@@ -718,8 +721,9 @@ async def _verify_order_document_impl(
718721
raise
719722

720723

724+
@unpack_pydantic_params
721725
async def verify_order_document(
722-
request: VerifyOrderDocumentRequest, context: Context
726+
request: Annotated[VerifyOrderDocumentRequest, Unpack()], context: Context
723727
) -> VerifyOrderDocumentResponse:
724728
"""Verify a document against a purchase order.
725729

uv.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)