Skip to content

Commit 5bfc0f4

Browse files
cpoderclaude
andcommitted
Add Tier 2 tools: SFTP, proxy, JWT, quiesce, health indicators (v1.9.0)
New tools (30): - SFTP client (9): server list/create/get/delete, user list/create/get/delete, test connection - HTTP proxy (6): list, create, get, delete, enable, disable - JWT management (6): issuer list/add/get/delete, settings get/update - Quiesce mode (3): status, enable (graceful drain), disable (return to active) - Health indicators (3): list, get, change (for K8s health checks) Plus SFTP user aliases for key-based and password authentication. 253 tools + 9 prompts + 5 resources. 160/160 E2E tests passing. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent aa3d2d8 commit 5bfc0f4

16 files changed

Lines changed: 731 additions & 2 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 = "1.8.0"
3+
version = "1.9.0"
44
edition = "2024"
55
description = "MCP server for managing webMethods Integration Server via pure HTTP API"
66
license = "MIT"

mcp-server-rs/src/client/health.rs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
use serde_json::{Value, json};
2+
3+
impl super::ISClient {
4+
pub async fn health_indicators_list(&self) -> Result<Value, String> {
5+
self.invoke_get("wm.server.healthindicators:getAllHealthIndicators")
6+
.await
7+
}
8+
9+
pub async fn health_indicator_get(&self, name: &str) -> Result<Value, String> {
10+
self.invoke_post(
11+
"wm.server.healthindicators:getHealthIndicator",
12+
&json!({"name": name}),
13+
)
14+
.await
15+
}
16+
17+
pub async fn health_indicator_change(
18+
&self,
19+
name: &str,
20+
settings: &Value,
21+
) -> Result<Value, String> {
22+
let mut payload = json!({"name": name});
23+
if let Some(obj) = settings.as_object() {
24+
for (k, v) in obj {
25+
payload
26+
.as_object_mut()
27+
.unwrap()
28+
.insert(k.clone(), v.clone());
29+
}
30+
}
31+
self.invoke_post("wm.server.healthindicators:changeHealthIndicator", &payload)
32+
.await
33+
}
34+
}

mcp-server-rs/src/client/jwt.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
use serde_json::{Value, json};
2+
3+
impl super::ISClient {
4+
pub async fn jwt_issuer_list(&self) -> Result<Value, String> {
5+
self.invoke_get("wm.server.jwt:listIssuers").await
6+
}
7+
8+
pub async fn jwt_issuer_add(&self, settings: &Value) -> Result<Value, String> {
9+
self.invoke_post("wm.server.jwt:addIssuer", settings).await
10+
}
11+
12+
pub async fn jwt_issuer_get(&self, name: &str) -> Result<Value, String> {
13+
self.invoke_post("wm.server.jwt:getIssuer", &json!({"issuerName": name}))
14+
.await
15+
}
16+
17+
pub async fn jwt_issuer_delete(&self, name: &str) -> Result<Value, String> {
18+
self.invoke_post("wm.server.jwt:removeIssuer", &json!({"issuerName": name}))
19+
.await
20+
}
21+
22+
pub async fn jwt_settings_get(&self) -> Result<Value, String> {
23+
self.invoke_get("wm.server.jwt:getGlobalSettings").await
24+
}
25+
26+
pub async fn jwt_settings_update(&self, settings: &Value) -> Result<Value, String> {
27+
self.invoke_post("wm.server.jwt:updateGlobalSettings", settings)
28+
.await
29+
}
30+
}

mcp-server-rs/src/client/mod.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@ mod adapters;
77
mod auditing;
88
mod flow_debug;
99
mod global_vars;
10+
mod health;
1011
mod jar_installer;
1112
mod jdbc_pools;
1213
mod jms;
1314
mod jndi;
15+
mod jwt;
1416
mod marketplace;
1517
mod monitoring;
1618
mod mqtt;
@@ -19,10 +21,13 @@ mod oauth;
1921
mod packages;
2022
mod packages_ext;
2123
mod ports;
24+
mod proxy;
25+
mod quiesce;
2226
mod remote_servers;
2327
mod scheduler;
2428
mod security;
2529
mod services;
30+
mod sftp;
2631
mod streaming;
2732
mod testing;
2833
mod triggers;

mcp-server-rs/src/client/proxy.rs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
use serde_json::{Value, json};
2+
3+
impl super::ISClient {
4+
pub async fn proxy_list(&self) -> Result<Value, String> {
5+
self.invoke_get("wm.server.proxy:getProxyServerAliases")
6+
.await
7+
}
8+
9+
pub async fn proxy_create(&self, settings: &Value) -> Result<Value, String> {
10+
self.invoke_post("wm.server.proxy:createProxyServerAlias", settings)
11+
.await
12+
}
13+
14+
pub async fn proxy_get(&self, alias: &str) -> Result<Value, String> {
15+
self.invoke_post(
16+
"wm.server.proxy:getProxyServerDetails",
17+
&json!({"alias": alias}),
18+
)
19+
.await
20+
}
21+
22+
pub async fn proxy_delete(&self, alias: &str) -> Result<Value, String> {
23+
self.invoke_post(
24+
"wm.server.proxy:deleteProxyServerAlias",
25+
&json!({"alias": alias}),
26+
)
27+
.await
28+
}
29+
30+
pub async fn proxy_enable(&self, alias: &str) -> Result<Value, String> {
31+
self.invoke_post(
32+
"wm.server.proxy:enableProxyServerAlias",
33+
&json!({"alias": alias}),
34+
)
35+
.await
36+
}
37+
38+
pub async fn proxy_disable(&self, alias: &str) -> Result<Value, String> {
39+
self.invoke_post(
40+
"wm.server.proxy:disableProxyServerAlias",
41+
&json!({"alias": alias}),
42+
)
43+
.await
44+
}
45+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
use serde_json::{Value, json};
2+
3+
impl super::ISClient {
4+
pub async fn quiesce_status(&self) -> Result<Value, String> {
5+
self.invoke_get("wm.server.quiesce:getCurrentMode").await
6+
}
7+
8+
pub async fn quiesce_enable(&self, settings: &Value) -> Result<Value, String> {
9+
self.invoke_post("wm.server.quiesce:setQuiesceMode", settings)
10+
.await
11+
}
12+
13+
pub async fn quiesce_disable(&self) -> Result<Value, String> {
14+
self.invoke_post("wm.server.quiesce:setActiveMode", &json!({}))
15+
.await
16+
}
17+
}

mcp-server-rs/src/client/sftp.rs

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
use serde_json::{Value, json};
2+
3+
impl super::ISClient {
4+
pub async fn sftp_server_list(&self) -> Result<Value, String> {
5+
self.invoke_get("wm.server.sftpclient:listServerAliases")
6+
.await
7+
}
8+
9+
pub async fn sftp_server_create(&self, settings: &Value) -> Result<Value, String> {
10+
self.invoke_post("wm.server.sftpclient:createServerAlias", settings)
11+
.await
12+
}
13+
14+
pub async fn sftp_server_get(&self, alias: &str) -> Result<Value, String> {
15+
self.invoke_post(
16+
"wm.server.sftpclient:getServerAliasInfo",
17+
&json!({"alias": alias}),
18+
)
19+
.await
20+
}
21+
22+
pub async fn sftp_server_delete(&self, alias: &str) -> Result<Value, String> {
23+
self.invoke_post(
24+
"wm.server.sftpclient:deleteServerAlias",
25+
&json!({"alias": alias}),
26+
)
27+
.await
28+
}
29+
30+
pub async fn sftp_user_list(&self) -> Result<Value, String> {
31+
self.invoke_get("wm.server.sftpclient:listUserAliases")
32+
.await
33+
}
34+
35+
pub async fn sftp_user_create(&self, settings: &Value) -> Result<Value, String> {
36+
self.invoke_post("wm.server.sftpclient:createUserAlias", settings)
37+
.await
38+
}
39+
40+
pub async fn sftp_user_get(&self, alias: &str) -> Result<Value, String> {
41+
self.invoke_post(
42+
"wm.server.sftpclient:getUserAlias",
43+
&json!({"alias": alias}),
44+
)
45+
.await
46+
}
47+
48+
pub async fn sftp_user_delete(&self, alias: &str) -> Result<Value, String> {
49+
self.invoke_post(
50+
"wm.server.sftpclient:removeUserAlias",
51+
&json!({"alias": alias}),
52+
)
53+
.await
54+
}
55+
56+
pub async fn sftp_test_connection(&self, alias: &str) -> Result<Value, String> {
57+
self.invoke_post(
58+
"wm.server.sftpclient:testConnection",
59+
&json!({"alias": alias}),
60+
)
61+
.await
62+
}
63+
}

mcp-server-rs/src/params/health.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
use rmcp::schemars;
2+
use serde::Deserialize;
3+
4+
#[derive(Debug, Deserialize, schemars::JsonSchema)]
5+
pub struct HealthIndicatorNameParam {
6+
#[schemars(description = "Health indicator name")]
7+
pub name: String,
8+
#[schemars(description = "Target IS instance name (omit for default)")]
9+
pub instance: Option<String>,
10+
}
11+
12+
#[derive(Debug, Deserialize, schemars::JsonSchema)]
13+
pub struct HealthIndicatorUpdateParam {
14+
#[schemars(description = "Health indicator name")]
15+
pub name: String,
16+
#[schemars(
17+
description = "JSON string with health indicator settings to update: enabled, threshold, etc."
18+
)]
19+
pub settings: String,
20+
#[schemars(description = "Target IS instance name (omit for default)")]
21+
pub instance: Option<String>,
22+
}

mcp-server-rs/src/params/jwt.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
use rmcp::schemars;
2+
use serde::Deserialize;
3+
4+
#[derive(Debug, Deserialize, schemars::JsonSchema)]
5+
pub struct JwtIssuerCreateParam {
6+
#[schemars(
7+
description = "JSON string with JWT issuer settings: issuerName, jwksUri, audience, claims, etc."
8+
)]
9+
pub settings: String,
10+
#[schemars(description = "Target IS instance name (omit for default)")]
11+
pub instance: Option<String>,
12+
}
13+
14+
#[derive(Debug, Deserialize, schemars::JsonSchema)]
15+
pub struct JwtIssuerNameParam {
16+
#[schemars(description = "JWT issuer name")]
17+
pub issuer_name: String,
18+
#[schemars(description = "Target IS instance name (omit for default)")]
19+
pub instance: Option<String>,
20+
}
21+
22+
#[derive(Debug, Deserialize, schemars::JsonSchema)]
23+
pub struct JwtSettingsUpdateParam {
24+
#[schemars(
25+
description = "JSON string with JWT global settings: enableJwtAuth, tokenLifetime, etc."
26+
)]
27+
pub settings: String,
28+
#[schemars(description = "Target IS instance name (omit for default)")]
29+
pub instance: Option<String>,
30+
}

0 commit comments

Comments
 (0)