Skip to content

Commit 4c0eb13

Browse files
cpoderclaude
andcommitted
Enrich RAG resources with real-world patterns from 3 projects (v2.4.0)
Added 5 new putNode examples from demoOrderManagement and obsCustomerManagement: Example 6: JDBC query result to typed document (listOrders) - /selectOrdersOutput;2;0/results;2;0/field -> nested typed doc with customer/address Example 7: JMS message processing (processOrder) - Extract JMS body -> JSON -> persist to DB with typed doc mappings Example 8: HTTP response with JSON body (REST API pattern) - pub.flow:setHTTPResponse with /httpResponse;2;0/responseCode etc via MAPSET Example 9: JMS send (postOrder) - Convert to XML -> pub.jms:send with connectionAlias/destination/body mapping Example 10: REST connector with BRANCH on status code - wm.server.openapi:invoke -> BRANCH label-expressions -> map per status code Key patterns documented: - JDBC results: /selectOutput;2;0/results;2;0/column;1;0 - JMS body: /JMSMessage;4;0;pub.jms:JMSMessage/body;2;0/data;2;0 - HTTP response: /httpResponse;2;0 nested MAPSET - REST connector: openapi:invoke + BRANCH on 'code = NNN' - RecordRef copy preserves type info Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 7914c7e commit 4c0eb13

4 files changed

Lines changed: 130 additions & 5 deletions

File tree

mcp-server-rs/Cargo.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.

mcp-server-rs/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "wm-mcp-server"
3-
version = "2.3.0"
3+
version = "2.4.0"
44
edition = "2024"
55
description = "MCP server for managing webMethods Integration Server via pure HTTP API"
66
license = "MIT"

mcp-server-rs/src/resources.rs

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -494,6 +494,133 @@ Build a search pattern by concatenating prefix + input + suffix.
494494
]}
495495
]}
496496
```
497+
498+
## Example 6: JDBC query result to typed document (listOrders pattern)
499+
500+
Map JDBC adapter output fields to a typed document. Each field uses full nested path.
501+
502+
```json
503+
{"type":"MAP","mode":"STANDALONE","nodes":[
504+
{"type":"MAPCOPY","from":"/selectOrdersOutput;2;0/results;2;0/order_id;1;0","to":"/orders;4;0;mypkg.docTypes:OrderCanonical/id;1;0"},
505+
{"type":"MAPCOPY","from":"/selectOrdersOutput;2;0/results;2;0/order_date;1;0","to":"/orders;4;0;mypkg.docTypes:OrderCanonical/date;1;0"},
506+
{"type":"MAPCOPY","from":"/selectOrdersOutput;2;0/results;2;0/status;1;0","to":"/orders;4;0;mypkg.docTypes:OrderCanonical/status;1;0"},
507+
{"type":"MAPCOPY","from":"/selectOrdersOutput;2;0/results;2;0/customer_id;1;0","to":"/orders;4;0;mypkg.docTypes:OrderCanonical/customer;2;0/id;1;0"},
508+
{"type":"MAPCOPY","from":"/selectOrdersOutput;2;0/results;2;0/customer_name;1;0","to":"/orders;4;0;mypkg.docTypes:OrderCanonical/customer;2;0/name;1;0"},
509+
{"type":"MAPDELETE","field":"/selectOrdersOutput;2;0"}
510+
]}
511+
```
512+
**Key:** Nested TO paths like `/orders;4;0;.../customer;2;0/name;1;0` create nested doc structures automatically.
513+
514+
## Example 7: JMS message processing (processOrder pattern)
515+
516+
Receive JMS message, extract body, convert to JSON, persist to DB.
517+
518+
```json
519+
{"flow":{"type":"ROOT","version":"3.2","cleanup":"true","nodes":[
520+
{"type":"INVOKE","service":"pub.json:documentToJSON","validate-in":"$none","validate-out":"$none","nodes":[
521+
{"type":"MAP","mode":"INPUT","nodes":[
522+
{"type":"MAPCOPY","from":"/JMSMessage;4;0;pub.jms:JMSMessage/body;2;0/data;2;0","to":"/document;2;0"}
523+
]},
524+
{"type":"MAP","mode":"OUTPUT","nodes":[
525+
{"type":"MAPDELETE","field":"/document;2;0"}
526+
]}
527+
]},
528+
{"type":"MAP","mode":"STANDALONE","nodes":[
529+
{"type":"MAPCOPY","from":"/JMSMessage;4;0;pub.jms:JMSMessage/body;2;0/data;2;0","to":"/order;4;0;mypkg.docTypes:OrderCanonical"},
530+
{"type":"MAPDELETE","field":"/JMSMessage;4;0;pub.jms:JMSMessage"}
531+
]},
532+
{"type":"INVOKE","service":"mypkg.jdbc:createOrder","validate-in":"$none","validate-out":"$none","nodes":[
533+
{"type":"MAP","mode":"INPUT","nodes":[
534+
{"type":"MAPCOPY","from":"/order;4;0;mypkg.docTypes:OrderCanonical/id;1;0","to":"/createOrderInput;2;0/order_id;1;0"},
535+
{"type":"MAPCOPY","from":"/order;4;0;mypkg.docTypes:OrderCanonical/status;1;0","to":"/createOrderInput;2;0/status;1;0"}
536+
]}
537+
]}
538+
]}}
539+
```
540+
541+
## Example 8: HTTP response with JSON body (REST API pattern)
542+
543+
Set HTTP response code, content type, and JSON body for a REST endpoint.
544+
545+
```json
546+
{"type":"INVOKE","service":"pub.flow:setHTTPResponse","validate-in":"$none","validate-out":"$none","nodes":[
547+
{"type":"MAP","mode":"INPUT","nodes":[
548+
{"type":"MAPSET","field":"/httpResponse;2;0/responseCode;1;0","overwrite":"true","d_enc":"XMLValues","mapseti18n":"true",
549+
"data":"<Values version=\"2.0\"><value name=\"xml\">200</value></Values>"},
550+
{"type":"MAPSET","field":"/httpResponse;2;0/reasonPhrase;1;0","overwrite":"true","d_enc":"XMLValues","mapseti18n":"true",
551+
"data":"<Values version=\"2.0\"><value name=\"xml\">OK</value></Values>"},
552+
{"type":"MAPSET","field":"/httpResponse;2;0/contentType;1;0","overwrite":"true","d_enc":"XMLValues","mapseti18n":"true",
553+
"data":"<Values version=\"2.0\"><value name=\"xml\">application/json</value></Values>"}
554+
]}
555+
]}
556+
```
557+
558+
## Example 9: JMS send pattern (postOrder)
559+
560+
Convert document to XML, send to JMS queue, return HTTP 202.
561+
562+
```json
563+
{"flow":{"type":"ROOT","version":"3.2","cleanup":"true","nodes":[
564+
{"type":"INVOKE","service":"pub.xml:documentToXMLString","validate-in":"$none","validate-out":"$none","nodes":[
565+
{"type":"MAP","mode":"INPUT","nodes":[
566+
{"type":"MAPCOPY","from":"/request;4;0;mypkg.docTypes:OrderRequest","to":"/document;2;0"}
567+
]}
568+
]},
569+
{"type":"INVOKE","service":"pub.jms:send","validate-in":"$none","validate-out":"$none","nodes":[
570+
{"type":"MAP","mode":"INPUT","nodes":[
571+
{"type":"MAPSET","field":"/connectionAliasName;1;0","overwrite":"true","d_enc":"XMLValues","mapseti18n":"true",
572+
"data":"<Values version=\"2.0\"><value name=\"xml\">DEFAULT_IS_JMS_CONNECTION</value></Values>"},
573+
{"type":"MAPSET","field":"/destinationName;1;0","overwrite":"true","d_enc":"XMLValues","mapseti18n":"true",
574+
"data":"<Values version=\"2.0\"><value name=\"xml\">/orders/posts</value></Values>"},
575+
{"type":"MAPSET","field":"/destinationType;1;0","overwrite":"true","d_enc":"XMLValues","mapseti18n":"true",
576+
"data":"<Values version=\"2.0\"><value name=\"xml\">QUEUE</value></Values>"},
577+
{"type":"MAPCOPY","from":"/xmldata;1;0","to":"/JMSMessage;2;0/body;2;0/string;1;0"}
578+
]}
579+
]}
580+
]}}
581+
```
582+
583+
## Example 10: REST connector with BRANCH on HTTP status code
584+
585+
Call external REST API, branch on response code, map success/error responses.
586+
587+
```json
588+
{"type":"SEQUENCE","exit-on":"FAILURE","nodes":[
589+
{"type":"INVOKE","service":"wm.server.openapi:invoke","validate-in":"$none","validate-out":"$none","nodes":[
590+
{"type":"MAP","mode":"INPUT","nodes":[
591+
{"type":"MAPSET","field":"/path;1;0","overwrite":"true","d_enc":"XMLValues","mapseti18n":"true",
592+
"data":"<Values version=\"2.0\"><value name=\"xml\">/customers</value></Values>"},
593+
{"type":"MAPSET","field":"/httpMethod;1;0","overwrite":"true","d_enc":"XMLValues","mapseti18n":"true",
594+
"data":"<Values version=\"2.0\"><value name=\"xml\">POST</value></Values>"},
595+
{"type":"MAPSET","field":"/radNamespace;1;0","overwrite":"false","d_enc":"XMLValues","mapseti18n":"true",
596+
"data":"<Values version=\"2.0\"><value name=\"xml\">mypkg.client:apiDescriptor</value></Values>"}
597+
]}
598+
]},
599+
{"type":"BRANCH","switch":"","label-expressions":"true","nodes":[
600+
{"type":"SEQUENCE","label":"code = 201","exit-on":"FAILURE","nodes":[
601+
{"type":"MAP","mode":"STANDALONE","nodes":[
602+
{"type":"MAPCOPY","from":"/response;3;0","to":"/201;2;0"}
603+
]}
604+
]},
605+
{"type":"SEQUENCE","label":"code = 400","exit-on":"FAILURE","nodes":[
606+
{"type":"MAP","mode":"STANDALONE","nodes":[
607+
{"type":"MAPCOPY","from":"/response;3;0","to":"/400;2;0"}
608+
]}
609+
]},
610+
{"type":"SEQUENCE","label":"$default","exit-on":"FAILURE","nodes":[
611+
{"type":"MAP","mode":"STANDALONE","nodes":[
612+
{"type":"MAPCOPY","from":"/response;3;0","to":"/error;2;0"}
613+
]}
614+
]}
615+
]}
616+
]}
617+
```
618+
**Key patterns from real projects (demoOrderManagement, obsCustomerManagement):**
619+
- JDBC results: `/selectOutput;2;0/results;2;0/column;1;0` -> nested typed doc
620+
- JMS body: `/JMSMessage;4;0;pub.jms:JMSMessage/body;2;0/data;2;0`
621+
- HTTP response: `/httpResponse;2;0/responseCode;1;0` etc via MAPSET
622+
- REST connector: `wm.server.openapi:invoke` with path/method/radNamespace + BRANCH on status code
623+
- RecordRef copy: `/source;4;0;pkg:DocType` TO `/target;4;0;pkg:DocType` preserves type
497624
"#;
498625

499626
const ADAPTER_SERVICE_REF: &str = r#"# Adapter Service Configuration Reference

mcp-server-rs/src/server.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3966,9 +3966,7 @@ impl ServerHandler for WmServer {
39663966
request: CallToolRequestParams,
39673967
context: RequestContext<RoleServer>,
39683968
) -> Result<CallToolResult, ErrorData> {
3969-
if !self.scopes.is_empty()
3970-
&& !crate::scopes::is_tool_allowed(&request.name, &self.scopes)
3971-
{
3969+
if !self.scopes.is_empty() && !crate::scopes::is_tool_allowed(&request.name, &self.scopes) {
39723970
return Err(ErrorData {
39733971
code: ErrorCode::INVALID_PARAMS,
39743972
message: Cow::Owned(format!(

0 commit comments

Comments
 (0)