You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
A3 — tickerResolveEndpoint in _meta:
Reads global AxisConfiguration parameter "mcpTickerResolveService"
(set in axis2.xml as "<parameter name="mcpTickerResolveService">
ServiceName/operationName</parameter>"). When present, adds
_meta.tickerResolveEndpoint = "POST /services/<value>" to the catalog
so MCP clients can discover the ticker→assetId resolution service
without out-of-band documentation. Field is omitted entirely when the
parameter is not configured. 2 new tests.
Update json-rpc-mcp-guide.xml:
- Section 7 limitations table: mark A1 (descriptions), A2 (annotation
tuning), A3 (ticker endpoint) as Implemented with config instructions
- Section 6.1 test table: add 13 new tests for A1/A2/A3
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
<tr><td><code>testAllAnnotationHintsAreBooleans</code></td><td>All MCP 2025-03-26 hints are booleans, not strings</td></tr>
401
401
<tr><td><code>testMcpToolsMatchOpenApiPaths</code></td><td>Every MCP tool endpoint has a matching OpenAPI path</td></tr>
402
+
<tr><td><code>testTickerResolveEndpointPresentWhenConfigured</code></td><td>_meta.tickerResolveEndpoint appears when mcpTickerResolveService global param is set</td></tr>
403
+
<tr><td><code>testTickerResolveEndpointAbsentWhenNotConfigured</code></td><td>tickerResolveEndpoint absent from _meta when param not set (no misleading field)</td></tr>
404
+
<tr><td><code>testOperationLevelMcpDescriptionOverridesDefault</code></td><td>mcpDescription on AxisOperation replaces auto-generated "ServiceName: opName"</td></tr>
405
+
<tr><td><code>testServiceLevelMcpDescriptionUsedWhenNoOperationLevel</code></td><td>Service-level mcpDescription used as fallback when operation has none</td></tr>
406
+
<tr><td><code>testOperationLevelMcpDescriptionTakesPrecedenceOverServiceLevel</code></td><td>Operation-level wins over service-level when both set</td></tr>
407
+
<tr><td><code>testDescriptionFallsBackToAutoGeneratedWhenNoMcpDescriptionParam</code></td><td>Auto-generated fallback still produced when no mcpDescription param present</td></tr>
408
+
<tr><td><code>testServiceLevelMcpReadOnlySetsTrueOnAnnotation</code></td><td>mcpReadOnly=true on service → readOnlyHint: true on all its tools</td></tr>
409
+
<tr><td><code>testOperationLevelMcpReadOnlyOverridesServiceLevel</code></td><td>Operation-level mcpReadOnly takes precedence over service-level</td></tr>
<tr><td><code>testAnnotationDefaultsAreConservativeWhenNoParamsSet</code></td><td>All four hints remain false when no MCP params set (no regression)</td></tr>
@@ -487,8 +498,8 @@ Each item notes whether the gap is architectural (won't be added to Axis2) or de
487
498
</tr>
488
499
<tr>
489
500
<td>Natural language tool descriptions</td>
490
-
<td>Not implemented — architectural gap</td>
491
-
<td><code>description</code> is auto-generated as "ServiceName: operationName". Compare rapi-mcp's curated descriptions: "Get all assets in a fund with optional calculation data". If Claude or another LLM uses the catalog for tool selection, it will have less context. Workaround: add descriptions via an OpenAPI customizer.</td>
501
+
<td><strong>Implemented</strong> — set <code>mcpDescription</code> parameter on <code><operation></code> or <code><service></code> in services.xml</td>
502
+
<td>Operation-level parameter takes precedence over service-level; falls back to auto-generated "ServiceName: operationName".</td>
492
503
</tr>
493
504
<tr>
494
505
<td>MCP Resources and Prompts</td>
@@ -497,8 +508,8 @@ Each item notes whether the gap is architectural (won't be added to Axis2) or de
497
508
</tr>
498
509
<tr>
499
510
<td>MCP 2025-03-26 annotation tuning</td>
500
-
<td>Deferred</td>
501
-
<td>All annotations (<code>readOnlyHint</code>, <code>destructiveHint</code>, <code>idempotentHint</code>, <code>openWorldHint</code>) default to <code>false</code>. Read-only services like <code>GetAssetCalculationsService</code> should have <code>readOnlyHint: true</code>. Requires per-service configuration or introspection of service annotations.</td>
511
+
<td><strong>Implemented</strong> — set <code>mcpReadOnly</code>, <code>mcpIdempotent</code>, <code>mcpDestructive</code>, <code>mcpOpenWorld</code> on <code><operation></code> or <code><service></code> in services.xml</td>
512
+
<td>Conservative <code>false</code> defaults preserved when parameters absent. Operation-level overrides service-level.</td>
502
513
</tr>
503
514
<tr>
504
515
<td>Streaming / SSE responses</td>
@@ -517,8 +528,8 @@ Each item notes whether the gap is architectural (won't be added to Axis2) or de
<td>Ticker resolution exists as an Axis2 service (used by pyRapi's <code>search_assets</code> tool) but the catalog does not expose a dedicated resolution endpoint. Callers must know fund IDs and asset IDs or call the appropriate lookup service separately.</td>
531
+
<td><strong>Implemented</strong> — set global parameter <code>mcpTickerResolveService</code> in axis2.xml</td>
532
+
<td>When set to <code>ServiceName/operationName</code>, <code>_meta.tickerResolveEndpoint</code> is added to the catalog. Omitted entirely when not configured so deployments without a ticker service are unaffected.</td>
0 commit comments