4.3 KiB
MCP Header Contract Implementation Plan
For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (
- [ ]) syntax for tracking.
Goal: Replace the legacy Tool Pod request headers with the approved 12-header contract and propagate every value through execution and outbound HTTP calls.
Architecture: McpRequestHeaders is the normalized immutable carrier. Both MCP filtering and the legacy REST adapter populate it, McpToolExecutionService returns the transport-safe correlation headers, and AxhubHttpComponent forwards the complete contract to downstream HTTP services. All headers remain optional.
Tech Stack: Java 21, Spring Web, Jakarta Servlet, JUnit 5, AssertJ, Gradle
Spec: User-approved header list in the 2026-08-25 Codex task.
Global Constraints
- Canonical headers are exactly
X-Guid,X-Praf-No,X-Request-Id,X-Request-Time,X-Vrtl-Praf-No,X-App-Code,X-Project-Code,X-User-Ip,X-Caller-Ip,X-Caller-Host,X-Channel, andX-Agent-Id. - Remove legacy
guid,employee-no, andvirtual-employee-no; do not retain aliases. - Keep
mcp-session-idbecause it is MCP transport metadata rather than a replaced business header. - Do not reject absent headers; capture and propagate values only when present.
- Do not commit or push unless the user requests it separately.
Task 1: Request Capture Contract
Files:
- Modify:
dat-was-lib/src/test/java/io/shinhanlife/dat/mcc/mcp/McpRequestHeaderFilterTest.java - Modify:
dat-was-lib/src/test/java/io/shinhanlife/dat/mcc/presentation/BusinessToolControllerHeaderContractTest.java - Modify:
dat-was-lib/src/main/java/io/shinhanlife/dat/lib/mcp/McpRequestHeaders.java - Modify:
dat-was-lib/src/main/java/io/shinhanlife/dat/lib/mcp/McpRequestHeaderFilter.java - Modify:
dat-was-lib/src/main/java/io/shinhanlife/dat/mcc/presentation/BusinessToolController.java
Interfaces:
-
Produces:
McpRequestHeadersaccessors for all 12 canonical values plusmcpSessionId(). -
Change the filter test fixture to send literal canonical headers and assert every record component.
-
Change the controller contract test to assert the exact 12 canonical names plus
mcp-session-id, all withrequired=false. -
Run the two tests and confirm failure because the record and controller still expose legacy fields.
-
Expand the record and populate it from both HTTP entry points.
-
Run the two tests and confirm they pass.
Task 2: Execution Response and Downstream Propagation
Files:
- Modify:
dat-was-lib/src/test/java/io/shinhanlife/dat/lib/mcp/ToolExecutionServiceTest.java - Modify:
dat-was-lib/src/test/java/io/shinhanlife/dat/lib/integration/http/component/AxhubHttpComponentTest.java - Modify:
dat-was-lib/src/main/java/io/shinhanlife/dat/lib/mcp/McpToolExecutionService.java - Modify:
dat-was-lib/src/main/java/io/shinhanlife/dat/lib/integration/http/component/AxhubHttpComponent.java
Interfaces:
-
Consumes: the expanded
McpRequestHeadersrecord from Task 1. -
Produces: response headers
X-Request-Id,X-Guid, andmcp-session-id; downstream calls receive all 12 canonical headers plus the MCP session header. -
Update execution and HTTP integration tests with hand-written literal values for every field.
-
Run both tests and confirm failure on missing canonical propagation.
-
Return canonical correlation headers and forward all present request headers.
-
Run both tests and confirm they pass.
Task 3: Documentation and Console Contract
Files:
- Modify:
README.md - Modify:
dat-was-lib/src/main/resources/static/tool-test-console.html - Modify:
dat-was-lib/src/test/java/io/shinhanlife/dat/mcc/presentation/ToolTestConsoleResourceTest.java
Interfaces:
-
Consumes: the canonical header names from Tasks 1 and 2.
-
Produces: runnable examples and console calls that no longer send removed headers.
-
Update the console resource test to require canonical header labels and calls.
-
Run the resource test and confirm failure on legacy header text.
-
Update README examples/table and console request/response labels.
-
Run the resource test and confirm it passes.
-
Run
./gradlew.bat :dat-was-lib:testand confirm the full module suite passes.