Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 7 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ Compatible with any MCP client: [IBM Bob](https://www.ibm.com/products/bob), [Cl
| Area | What the AI can do | Tools |
|---|---|---|
| **Flow services** | Create services with full logic (INVOKE, MAP, BRANCH, LOOP, TRY/CATCH), signatures, test them | 5 |
| **FSL generation** | Validate, compile/deploy, and decompile flow services from Flow Service Language (FSL) source text | 3 |
| **Flow debugging** | Step-by-step execution, inspect pipeline at each step, set breakpoints, modify variables | 7 |
| **Unit testing** | Run test suites, get JUnit/text reports, mock services for isolated testing | 10 |
| **Namespace dependencies** | Find dependents, references, unresolved refs, search nodes, refactor/rename | 6 |
Expand Down Expand Up @@ -56,7 +57,7 @@ Compatible with any MCP client: [IBM Bob](https://www.ibm.com/products/bob), [Cl
| **IP access** | Global IP allow/deny rules | 4 |
| **WebSocket** | Session management, endpoint creation, broadcast | 4 |

**336 tools + 9 interactive prompts + 5 RAG resources** in total. **184 end-to-end tests** validated against a live IS with real infrastructure (Mosquitto MQTT broker, ActiveMQ JMS, MySQL).
**339 tools + 9 interactive prompts + 7 RAG resources** in total. **184 end-to-end tests** validated against a live IS with real infrastructure (Mosquitto MQTT broker, ActiveMQ JMS, MySQL).

### Interactive setup wizards (prompts)

Expand Down Expand Up @@ -196,7 +197,7 @@ AI Assistant ──MCP (stdio/HTTP)──> wm-mcp-server (Rust) ──HTTP/JSON

All operations use IS built-in HTTP services. No filesystem access needed for most operations (marketplace install requires local access to the IS packages directory).

Flow services are created via `wm.server.ns/putNode` which accepts the full flow tree as JSON -- the same `FlowElement` / `Values` serialization used internally by the IS runtime. The server includes 5 embedded RAG resources with comprehensive flow language documentation, 15 working putNode examples (including TRY/CATCH, LOOP, BRANCH, MAPINVOKE, transactions), and adapter service configuration guides.
Flow services are created via `wm.server.ns/putNode` which accepts the full flow tree as JSON -- the same `FlowElement` / `Values` serialization used internally by the IS runtime. The server includes 7 embedded RAG resources: comprehensive flow language documentation, 15 working putNode examples (including TRY/CATCH, LOOP, BRANCH, MAPINVOKE, transactions), adapter service configuration guides, an FSL language reference, and on-prem provisioning / database setup notes.

### Transport modes

Expand Down Expand Up @@ -224,9 +225,12 @@ Set `WM_SCOPES` to restrict which tools are exposed (useful for MCP gateways):
```bash
WM_SCOPES=develop,monitor # Only development and monitoring tools
WM_SCOPES=readonly # Only read-only tools (list, get, status)
WM_SCOPES=fsl-develop # Only the FSL generate/validate/deploy/test cycle
```

Available scopes: `admin`, `develop`, `deploy`, `adapters`, `messaging`, `monitor`, `network`, `readonly`.
Available scopes: `admin`, `develop`, `fsl-develop`, `deploy`, `adapters`, `messaging`, `monitor`, `network`, `readonly`.

`fsl-develop` is a narrow subset of `develop` scoped to the FSL workflow (`dsl_validate`, `fsl_deploy`, `fsl_extract`, `service_invoke`, `node_list`, `node_get`, `node_delete`, `folder_create`, `package_create`, `package_list`, `package_reload`, `package_info`) — use it to expose FSL generation without pulling in SAP, flat-file, doc-type generation, debugging, or unit-testing tools that `develop` also covers.

## Requirements

Expand Down
2 changes: 1 addition & 1 deletion mcp-server-rs/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
name = "wm-mcp-server"
version = "2.9.1"
edition = "2024"
description = "MCP server for webMethods Integration Server — 336 tools replacing Designer for development and administration"
description = "MCP server for webMethods Integration Server — 339 tools replacing Designer for development and administration"
license = "MIT"
repository = "https://github.com/cpoder/wm-mcp-server"
keywords = ["mcp", "webmethods", "integration-server"]
Expand Down
5 changes: 4 additions & 1 deletion mcp-server-rs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ Set `WM_CONFIG=/path/to/config.json`:
}
```

## Tools Reference (336 tools)
## Tools Reference (339 tools)

### Server & Instances (3)
`list_instances`, `is_status`, `is_shutdown`
Expand All @@ -45,6 +45,9 @@ Set `WM_CONFIG=/path/to/config.json`:
### Flow Services (5)
`flow_service_create`, `put_node`, `service_invoke`, `document_type_create`, `mapset_value`

### FSL Generation (3)
`dsl_validate`, `fsl_deploy`, `fsl_extract`

### Flow Debugging (7)
`flow_debug_start`, `flow_debug_execute` (stepOver/stepIn/stepOut/resume/stop), `flow_debug_close`, `flow_debug_insert_breakpoints`, `flow_debug_remove_all_breakpoints`, `flow_debug_set_pipeline`, `flow_debug_stop_service`

Expand Down
62 changes: 62 additions & 0 deletions mcp-server-rs/src/client/flow_gen.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
use serde_json::json;

impl super::ISClient {
// ── DSL Validation ──────────────────────────────────────────────────
// wm.dsl:validate checks DSL source text against its grammar without
// deploying anything. FSL is currently the only DSL implementation on
// IS, but the service is DSL-agnostic — more DSLs may be added later.

pub async fn dsl_validate(&self, dsl_text: &str) -> Result<serde_json::Value, String> {
self.invoke_post("wm.dsl:validate", &json!({"dslText": dsl_text}))
.await
}

// ── FSL Deployment ───────────────────────────────────────────────────
// wm.server.flowGen:generateFromFSLString compiles FSL source and
// deploys the resulting flow service on IS in a single atomic call.
// The returned `node` field is IS's internal Values/FlowElement tree —
// it is informational only. NEVER repost it via put_node: round-tripping
// it through IS's generic JSON REST serialization flattens the nested
// `flow.nodes` array into a string (e.g. "[INVOKE]"), silently producing
// a service with no logic. generateFromFSLString already deploys the
// service; no follow-up put_node call is needed or safe.
//
// packageName must already exist on IS (use package_create first) —
// this call does not create packages implicitly.

pub async fn fsl_deploy(
&self,
fsl_string: &str,
package_name: &str,
ifc_name: &str,
flow_name: &str,
) -> Result<serde_json::Value, String> {
self.invoke_post(
"wm.server.flowGen:generateFromFSLString",
&json!({
"fslString": fsl_string,
"packageName": package_name,
"ifcName": ifc_name,
"flowName": flow_name,
}),
)
.await
}

// ── FSL Extraction ───────────────────────────────────────────────────
// wm.server.flowGen:generateFSLFromFlow decompiles an existing flow
// service back into FSL source. The regenerated FSL is semantically
// equivalent but not always textually identical to any FSL originally
// used to create the service (e.g. it may add an explicit `properties`
// block or reformat mappings). On failure for a nonexistent service,
// the IS-side `message` may be a raw internal exception string rather
// than a clean validation message — surface it as-is.

pub async fn fsl_extract(&self, service_name: &str) -> Result<serde_json::Value, String> {
self.invoke_post(
"wm.server.flowGen:generateFSLFromFlow",
&json!({"serviceName": service_name}),
)
.await
}
}
1 change: 1 addition & 0 deletions mcp-server-rs/src/client/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ mod alerts;
mod auditing;
mod enterprise_gw;
mod flow_debug;
mod flow_gen;
mod global_vars;
mod health;
mod ip_access;
Expand Down
2 changes: 1 addition & 1 deletion mcp-server-rs/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ pub struct AppConfig {
pub instances: HashMap<String, InstanceConfig>,
pub default_instance: String,
/// Tool scopes to expose. Empty = all tools. Set via WM_SCOPES env var (comma-separated).
/// Valid scopes: admin, develop, adapters, messaging, monitor, deploy, network, readonly
/// Valid scopes: admin, develop, fsl-develop, adapters, messaging, monitor, deploy, network, readonly
pub scopes: Vec<String>,
/// Extra `Host` authorities accepted in HTTP mode, on top of the loopback
/// defaults. Set via WM_ALLOWED_HOSTS (comma-separated), e.g.
Expand Down
38 changes: 38 additions & 0 deletions mcp-server-rs/src/params/flow_gen.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
use rmcp::schemars;
use serde::Deserialize;

#[derive(Debug, Deserialize, schemars::JsonSchema)]
pub struct DslValidateParam {
#[schemars(
description = "DSL source text to validate (FSL is the only DSL currently supported)"
)]
pub dsl_text: String,
#[schemars(description = "Target IS instance name (omit for default)")]
pub instance: Option<String>,
}

#[derive(Debug, Deserialize, schemars::JsonSchema)]
pub struct FslDeployParam {
#[schemars(description = "FSL source text to compile and deploy")]
pub fsl_string: String,
#[schemars(
description = "Target package name. Must already exist on IS (use package_create first)."
)]
pub package_name: String,
#[schemars(description = "Folder path within the package (e.g. \"services.utils\")")]
pub ifc_name: String,
#[schemars(description = "Unqualified service name to create/update")]
pub flow_name: String,
#[schemars(description = "Target IS instance name (omit for default)")]
pub instance: Option<String>,
}

#[derive(Debug, Deserialize, schemars::JsonSchema)]
pub struct FslExtractParam {
#[schemars(
description = "Full namespace path of an existing flow service (e.g. \"folder:serviceName\")"
)]
pub service_name: String,
#[schemars(description = "Target IS instance name (omit for default)")]
pub instance: Option<String>,
}
2 changes: 2 additions & 0 deletions mcp-server-rs/src/params/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ pub mod adapters;
pub mod auditing;
pub mod common;
pub mod flow_debug;
pub mod flow_gen;
pub mod global_vars;
pub mod jar_installer;
pub mod jdbc_pools;
Expand All @@ -28,6 +29,7 @@ pub use adapters::*;
pub use auditing::*;
pub use common::*;
pub use flow_debug::*;
pub use flow_gen::*;
pub use global_vars::*;
pub use jar_installer::*;
pub use jdbc_pools::*;
Expand Down
Loading