You are viewing a plain text version of this content. The canonical link for it is here.
Posted to c-commits@axis.apache.org by ro...@apache.org on 2026/04/16 13:20:38 UTC
(axis-axis2-c-core) 04/04: Generalize MCP client references in docs and samples
This is an automated email from the ASF dual-hosted git repository.
robertlazarski pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/axis-axis2-c-core.git
commit 3b537884c0287d8b0aecbb7ed99c44efa174c8ab
Author: Robert Lazarski <ro...@gmail.com>
AuthorDate: Wed Apr 15 14:52:23 2026 -1000
Generalize MCP client references in docs and samples
Replaces narrative mentions of specific MCP client products (Claude
Desktop, Cursor) with vendor-neutral terminology ("an MCP client",
"stdio-based MCP client", "the MCP host") across docs and sample
source/build files. Concrete configuration examples are kept since
they are load-bearing setup instructions, but framed consistently as
"Example MCP client config (path varies by client; Claude Desktop's
~/.config/claude/claude_desktop_config.json shown)" so the product
name appears once per file as a concrete example rather than being
implied as a default or required client.
The MCP protocol name itself is retained (it is a public specification
at modelcontextprotocol.io) — only gratuitous product-name mentions
are scrubbed.
Reviewed with gemini-2.5-pro (vendor-neutrality, documentation utility,
information-preservation, consistency, fresh-leak checks all passed).
Co-Authored-By: Claude Opus 4.6 (1M context) <no...@anthropic.com>
---
docs/MCP.md | 22 +++++++++++-----------
docs/MCP_EXAMPLES.md | 18 ++++++++++--------
.../financial-benchmark-service/Makefile.am | 5 +++--
.../build_financial_service.sh | 7 ++++---
.../financial-benchmark-service/src/finbench_mcp.c | 2 +-
.../financial-benchmark-service/src/finbench_mcp.h | 5 +++--
.../src/finbench_mcp_main.c | 3 ++-
7 files changed, 34 insertions(+), 28 deletions(-)
diff --git a/docs/MCP.md b/docs/MCP.md
index 2d9e72bb8..becd429fd 100644
--- a/docs/MCP.md
+++ b/docs/MCP.md
@@ -10,7 +10,7 @@ status: Active — Java A1/A2/A3 complete, C1 complete, mcpInputSchema deployed
**Summary**: Axis2/C gains MCP (Model Context Protocol) support by porting from the
Axis2/Java reference implementation — the same pattern used successfully for HTTP/2.
The C implementation targets hardware where Java cannot run: edge devices, embedded
-systems, Android phones. One MCP client (Claude Desktop, Claude API) connects to
+systems, Android phones. One MCP client (stdio or HTTP) connects to
both runtimes via identical protocol. One AI protocol, the full hardware spectrum.
MCP is JSON-RPC 2.0. Three required methods: `initialize`, `tools/list`, `tools/call`.
@@ -37,11 +37,11 @@ MCP is a better candidate than HTTP/2 was:
the only addition.
- **stdio in C is trivial**: `fgets(stdin)` / `fprintf(stdout)`. In Java this
requires thread management and stream handling. In C it is a 30-line loop.
-- **No JVM startup**: Claude Desktop starts MCP servers as subprocesses. JVM
+- **No JVM startup**: stdio-based MCP clients start MCP servers as subprocesses. JVM
cold-start is 1–3 seconds. A C binary starts in under 100ms. For stdio MCP
- (process-per-client), this is visible every time Claude Desktop opens.
+ (process-per-client), this is visible every time the MCP client opens.
- **Port is mechanical once Java proves the protocol**: After Axis2/Java validates
- the `initialize`/`tools/list`/`tools/call` handshake against Claude Desktop,
+ the `initialize`/`tools/list`/`tools/call` handshake against a compliant MCP client,
the C port translates proven behavior rather than discovering it.
**Estimated new C code**: ~500 lines for stdio, ~800 for HTTP/SSE. The HTTP/2 port
@@ -89,11 +89,11 @@ Android phone.
| `springbootdemo-tomcat11` | ✅ Reference implementation, Java 25 + Tomcat 11 |
| `/openapi-mcp.json` endpoint | ✅ Done (A1) |
| `axis2-mcp-bridge` stdio JAR | ✅ Done (A2) — with mTLS (port 8443, IoT CA) |
-| A3 end-to-end validation | ✅ Done — Claude Desktop → bridge → mTLS → BigDataH2Service confirmed |
+| A3 end-to-end validation | ✅ Done — MCP client → bridge → mTLS → BigDataH2Service confirmed |
| `axis2-transport-mcp` Java native | ❌ Not started (B1) |
**C1 is now unblocked.** Java A2 was the gate: the JSON-RPC 2.0 handshake
-(`initialize` / `tools/list` / `tools/call`) is validated against Claude Desktop.
+(`initialize` / `tools/list` / `tools/call`) is validated against a compliant MCP client.
The C port translates proven behavior rather than discovering it.
The Java bridge uses no MCP SDK — just Jackson + Java stdlib HttpClient. The C port
@@ -204,7 +204,7 @@ static const finbench_mcp_tool_t finbench_mcp_tools[] = {
Each `_mcp_handler` is a thin wrapper: extract arguments from `json_object *`,
call the existing `finbench_*_json_only()` function, return the result string.
-**Claude Desktop config** (the demo deliverable):
+**Example MCP client config** (stdio transport; the demo deliverable):
```json
{
"mcpServers": {
@@ -293,7 +293,7 @@ assistants consume.
Where the implementations compete is on the deployment edge: C runs where
Java cannot (Android phones, IoT gateways, embedded systems) and starts
-instantly for stdio MCP (where Claude Desktop spawns a subprocess per
+instantly for stdio MCP (where the MCP client spawns a subprocess per
session). Java runs where enterprise infrastructure already exists
(WildFly, Tomcat, Spring Boot) with richer integration tooling.
@@ -315,9 +315,9 @@ services dynamically.
**Why `isatty()` for mode detection**
The same binary serves both HTTP/2 JSON (via Apache httpd as a shared library) and
-MCP stdio (as a subprocess launched by Claude Desktop). The `isatty()` check is the
+MCP stdio (as a subprocess launched by an MCP client). The `isatty()` check is the
POSIX-standard way to detect whether stdin is connected to an interactive terminal or
-a pipe. When Claude Desktop launches the binary, stdin is a pipe — MCP mode. When
+a pipe. When an MCP client launches the binary, stdin is a pipe — MCP mode. When
httpd loads the shared library, stdin is not opened at all.
In production the binary and the shared library would be separate build targets from
@@ -361,7 +361,7 @@ is serving them.
When C1 and Java B1 are both complete, the demonstration is:
```
-Claude Desktop
+MCP client (stdio)
├── axis2c-financial (stdio, $20 Android phone)
│ portfolioVariance — 500 assets in 5ms, 30MB memory
│ monteCarlo VaR — 10,000 GBM simulations in 100ms
diff --git a/docs/MCP_EXAMPLES.md b/docs/MCP_EXAMPLES.md
index 7c1e02a7f..9995675ed 100644
--- a/docs/MCP_EXAMPLES.md
+++ b/docs/MCP_EXAMPLES.md
@@ -101,7 +101,7 @@ Three MCP methods handle everything:
- `tools/list` — what calculations are available and their input schemas
- `tools/call` — run a specific calculation with arguments
-The wire protocol is JSON-RPC 2.0 over stdio (Claude Desktop) or HTTP/SSE
+The wire protocol is JSON-RPC 2.0 over stdio (subprocess-based MCP clients) or HTTP/SSE
(persistent server). Axis2/C implements stdio today; HTTP/SSE is planned.
---
@@ -147,7 +147,7 @@ curl -k --http2 -s \
multiply-accumulate throughput — the 929M figure comes from the 500-asset
benchmark below, not this 3-asset example.)
-**MCP stdio (Claude Desktop):**
+**MCP stdio (subprocess-based MCP client):**
```bash
echo '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"portfolioVariance","arguments":{"n_assets":3,"weights":[0.4,0.3,0.3],"covariance_matrix":[0.04,0.006,0.002,0.006,0.09,0.009,0.002,0.009,0.01]}}}' \
| /usr/local/axis2c/bin/financial-benchmark-mcp
@@ -966,13 +966,13 @@ the highest overhead.
| Startup time | **instant** (shared lib) | 1-3 sec (interpreter/JVM startup) |
| MCP stdio startup | **< 50 ms** | 500 ms+ (module import / classloading) |
-The MCP stdio startup matters because Claude Desktop launches MCP servers
+The MCP stdio startup matters because MCP clients launch MCP servers
as subprocesses. Every time you open a conversation, the server starts. A
50ms C startup is invisible; a 3-second JVM startup is noticeable every time.
### The bigger picture: AI assistants embedded in financial platforms
-The examples above show a standalone MCP server called from Claude Desktop.
+The examples above show a standalone MCP server called from a stdio-based MCP client.
The real payoff is when the same MCP tools power an **AI assistant embedded
directly in a portfolio management application**.
@@ -1019,7 +1019,7 @@ breaks the flow. The PM asks a follow-up, and the answer is already there.
The same MCP protocol works for both:
- A chat assistant embedded in a web application (HTTP/SSE transport)
-- Claude Desktop analyzing a portfolio from a terminal (stdio transport)
+- An MCP client analyzing a portfolio from a terminal (stdio transport)
- A scheduled risk report that runs overnight (batch MCP calls)
- A mobile app showing position alerts on a phone (lightweight client)
@@ -1039,10 +1039,12 @@ VaR computation on hardware that costs less than a Bloomberg terminal.
---
-## Claude Desktop Configuration
+## Example MCP Client Configuration
-To connect Claude Desktop to the Axis2/C MCP server, add to
-`~/.config/claude/claude_desktop_config.json`:
+To connect a stdio-based MCP client to the Axis2/C MCP server, add an
+entry to its configuration file. The path varies by client; Claude
+Desktop's `~/.config/claude/claude_desktop_config.json` is shown as
+an example:
```json
{
diff --git a/samples/user_guide/financial-benchmark-service/Makefile.am b/samples/user_guide/financial-benchmark-service/Makefile.am
index 0f10b9102..e7012eb6d 100644
--- a/samples/user_guide/financial-benchmark-service/Makefile.am
+++ b/samples/user_guide/financial-benchmark-service/Makefile.am
@@ -55,10 +55,11 @@ libfinancial_benchmark_service_la_LDFLAGS = \
# ─── MCP stdio binary (C1) ────────────────────────────────────────────────────
#
-# Standalone binary launched by Claude Desktop (and Cursor) as an MCP subprocess.
+# Standalone binary launched by a stdio-based MCP client as an MCP subprocess.
# Links financial_benchmark_service.c directly (no shared library dependency).
#
-# Claude Desktop config (~/.config/claude/claude_desktop_config.json):
+# Example MCP client config (path varies by client; Claude Desktop's
+# ~/.config/claude/claude_desktop_config.json shown):
# { "mcpServers": { "axis2c-financial": {
# "command": "/usr/local/axis2c/bin/financial-benchmark-mcp" } } }
diff --git a/samples/user_guide/financial-benchmark-service/build_financial_service.sh b/samples/user_guide/financial-benchmark-service/build_financial_service.sh
index f8e868bba..e4ae308fc 100755
--- a/samples/user_guide/financial-benchmark-service/build_financial_service.sh
+++ b/samples/user_guide/financial-benchmark-service/build_financial_service.sh
@@ -22,7 +22,7 @@ echo " • Monte Carlo VaR - Compute-intensive simulation"
echo " • Scenario Analysis - Hash table lookups"
echo ""
echo "🤖 MCP (Model Context Protocol) binary also built:"
-echo " • financial-benchmark-mcp — JSON-RPC 2.0 stdio, runs as Claude Desktop subprocess"
+echo " • financial-benchmark-mcp — JSON-RPC 2.0 stdio, runs as an MCP client subprocess"
echo ""
# ── 1. Build the httpd shared library ─────────────────────────────────────────
@@ -129,9 +129,10 @@ if [ -f "libfinancial_benchmark_service.so" ] && [ -f "financial-benchmark-mcp"
echo ' -d '\''{"n_simulations":10000,"n_periods":252,"initial_value":1000000,"expected_return":0.08,"volatility":0.20}'\'' \'
echo ' https://localhost:443/services/FinancialBenchmarkService/monteCarlo'
echo ""
- echo "── MCP stdio (Claude Desktop) ──"
+ echo "── MCP stdio (stdio-based MCP client) ──"
echo ""
- echo "6. Add to ~/.config/claude/claude_desktop_config.json:"
+ echo "6. Add to your MCP client config (path varies by client;"
+ echo " Claude Desktop's ~/.config/claude/claude_desktop_config.json shown):"
echo ' {"mcpServers":{"axis2c-financial":{"command":"/usr/local/axis2c/bin/financial-benchmark-mcp"}}}'
echo ""
echo "7. Smoke-test MCP stdio directly:"
diff --git a/samples/user_guide/financial-benchmark-service/src/finbench_mcp.c b/samples/user_guide/financial-benchmark-service/src/finbench_mcp.c
index 486c35b1a..32e496f6c 100644
--- a/samples/user_guide/financial-benchmark-service/src/finbench_mcp.c
+++ b/samples/user_guide/financial-benchmark-service/src/finbench_mcp.c
@@ -59,7 +59,7 @@
* Tool catalog — input schemas (snake_case, matching C service field names)
*
* These are the same JSON field names accepted by the HTTP/2 JSON endpoints.
- * MCP clients (Claude Desktop, Cursor) use these schemas to populate requests.
+ * MCP clients use these schemas to populate requests.
* ============================================================================
*/
diff --git a/samples/user_guide/financial-benchmark-service/src/finbench_mcp.h b/samples/user_guide/financial-benchmark-service/src/finbench_mcp.h
index b21b44c2c..455becfbe 100644
--- a/samples/user_guide/financial-benchmark-service/src/finbench_mcp.h
+++ b/samples/user_guide/financial-benchmark-service/src/finbench_mcp.h
@@ -29,7 +29,8 @@
* The same JSON request/response schemas are reused — MCP adds only the
* JSON-RPC 2.0 framing (method, id, params.arguments, result.content).
*
- * Usage (Claude Desktop claude_desktop_config.json):
+ * Example MCP client config (path varies by client; Claude Desktop's
+ * ~/.config/claude/claude_desktop_config.json shown):
* @code
* {
* "mcpServers": {
@@ -64,7 +65,7 @@ extern "C" {
*
* Reads newline-delimited JSON requests from stdin, dispatches to the
* financial benchmark operations, and writes JSON-RPC 2.0 responses to stdout.
- * Returns when stdin reaches EOF (Claude Desktop terminates the process).
+ * Returns when stdin reaches EOF (the MCP client terminates the process).
*
* @param env Axis2/C environment. The associated logger MUST write to a file,
* not stdout. Use axutil_env_create_all("/tmp/finbench_mcp.log", ...).
diff --git a/samples/user_guide/financial-benchmark-service/src/finbench_mcp_main.c b/samples/user_guide/financial-benchmark-service/src/finbench_mcp_main.c
index 43f84cbab..f80709494 100644
--- a/samples/user_guide/financial-benchmark-service/src/finbench_mcp_main.c
+++ b/samples/user_guide/financial-benchmark-service/src/finbench_mcp_main.c
@@ -19,7 +19,8 @@
* @file finbench_mcp_main.c
* @brief Entry point for the financial-benchmark-mcp standalone binary (C1)
*
- * Claude Desktop config (~/.config/claude/claude_desktop_config.json):
+ * Example MCP client config (path varies by client; Claude Desktop's
+ * ~/.config/claude/claude_desktop_config.json shown):
* @code
* {
* "mcpServers": {