Skip to content

Commit bc5a68e

Browse files
cpoderclaude
andcommitted
Add remaining Tier 2 tools, reaching v2.0.0 milestone (v2.0.0)
New tools (16): - Enterprise Gateway: rules list, DoS get/update, denied IP list (4) - IP Access Control: list, add, delete (3) - Password Policy: get, update (2) - Alerts: status, enable, disable (3) - WebSocket: sessions by port, close session (2) - SAML module registered (ready for tools) v2.0.0 milestone: comprehensive IS admin and development coverage. 269 tools + 9 prompts + 5 resources. 165/165 E2E tests passing. Coverage: flow services + debugging, unit testing + mocking, adapters (JDBC/SAP/OPC) + Designer-like browsing, Kafka streaming, JMS, MQTT, pub/sub triggers, messaging, scheduler, users/groups/ACLs, OAuth, JWT, JDBC pools, global variables, server monitoring, remote servers, auditing, web services/OpenAPI, security/keystores, SFTP, HTTP proxy, quiesce, health indicators, enterprise gateway, IP access, password policy, alerts, WebSocket, package marketplace + install, JAR installer, URL aliases, document type generation (JSON/XSD/XML/SAP), 5 reference documentation resources for RAG. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 5bfc0f4 commit bc5a68e

16 files changed

Lines changed: 379 additions & 2 deletions

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.9.0"
3+
version = "2.0.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/alerts.rs

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 alert_status(&self) -> Result<Value, String> {
5+
self.invoke_get("wm.server.alert:alertingStatus").await
6+
}
7+
8+
pub async fn alert_enable(&self) -> Result<Value, String> {
9+
self.invoke_post("wm.server.alert:enableNotifiers", &json!({}))
10+
.await
11+
}
12+
13+
pub async fn alert_disable(&self) -> Result<Value, String> {
14+
self.invoke_post("wm.server.alert:disableAllNotifiers", &json!({}))
15+
.await
16+
}
17+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
use serde_json::Value;
2+
3+
impl super::ISClient {
4+
pub async fn egw_rules_list(&self) -> Result<Value, String> {
5+
self.invoke_get("wm.server.enterprisegateway:getRulesList")
6+
.await
7+
}
8+
9+
pub async fn egw_dos_get(&self) -> Result<Value, String> {
10+
self.invoke_get("wm.server.enterprisegateway:getDOS").await
11+
}
12+
13+
pub async fn egw_dos_update(&self, settings: &Value) -> Result<Value, String> {
14+
self.invoke_post("wm.server.enterprisegateway:saveDOS", settings)
15+
.await
16+
}
17+
18+
pub async fn egw_denied_ip_list(&self) -> Result<Value, String> {
19+
self.invoke_get("wm.server.enterprisegateway:getDeniedIPList")
20+
.await
21+
}
22+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
use serde_json::{Value, json};
2+
3+
impl super::ISClient {
4+
pub async fn ip_access_list(&self) -> Result<Value, String> {
5+
self.invoke_get("wm.server.net:ipRuleList").await
6+
}
7+
8+
pub async fn ip_access_add(&self, settings: &Value) -> Result<Value, String> {
9+
self.invoke_post("wm.server.net:ipRuleAdd", settings).await
10+
}
11+
12+
pub async fn ip_access_delete(&self, ip: &str) -> Result<Value, String> {
13+
self.invoke_post("wm.server.net:ipRuleDelete", &json!({"ip": ip}))
14+
.await
15+
}
16+
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,13 @@
44
//! All operations use the IS HTTP API - no disk access required.
55
66
mod adapters;
7+
mod alerts;
78
mod auditing;
9+
mod enterprise_gw;
810
mod flow_debug;
911
mod global_vars;
1012
mod health;
13+
mod ip_access;
1114
mod jar_installer;
1215
mod jdbc_pools;
1316
mod jms;
@@ -20,6 +23,7 @@ mod namespace;
2023
mod oauth;
2124
mod packages;
2225
mod packages_ext;
26+
mod password_policy;
2327
mod ports;
2428
mod proxy;
2529
mod quiesce;
@@ -33,6 +37,7 @@ mod testing;
3337
mod triggers;
3438
mod users;
3539
mod webservices;
40+
mod websocket;
3641

3742
use reqwest::Client;
3843
use reqwest::header::{ACCEPT, AUTHORIZATION, HeaderMap, HeaderValue};
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
use serde_json::Value;
2+
3+
impl super::ISClient {
4+
pub async fn password_policy_get(&self) -> Result<Value, String> {
5+
self.invoke_get("wm.server.access:getPasswordExpirySettings")
6+
.await
7+
}
8+
9+
pub async fn password_policy_update(&self, settings: &Value) -> Result<Value, String> {
10+
self.invoke_post("wm.server.access:updateExpirySettings", settings)
11+
.await
12+
}
13+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
use serde_json::{Value, json};
2+
3+
impl super::ISClient {
4+
pub async fn websocket_sessions_by_port(&self, port: &str) -> Result<Value, String> {
5+
self.invoke_post(
6+
"wm.server.net.websocket:listSessionsByPort",
7+
&json!({"port": port}),
8+
)
9+
.await
10+
}
11+
12+
pub async fn websocket_close_session(&self, session_id: &str) -> Result<Value, String> {
13+
self.invoke_post(
14+
"wm.server.net.websocket:closeSession",
15+
&json!({"sessionId": session_id}),
16+
)
17+
.await
18+
}
19+
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
use rmcp::schemars;
2+
use serde::Deserialize;
3+
4+
#[derive(Debug, Deserialize, schemars::JsonSchema)]
5+
pub struct EgwDosUpdateParam {
6+
#[schemars(description = "JSON string with DoS protection settings")]
7+
pub settings: String,
8+
#[schemars(description = "Target IS instance name (omit for default)")]
9+
pub instance: Option<String>,
10+
}

0 commit comments

Comments
 (0)