Skip to content

Commit a2cf499

Browse files
cpoderclaude
andcommitted
Add 71 new tools covering Tier 1 & 2 gaps (v2.5.0)
New tool categories: namespace dependencies (6), flat file schemas (4), package management gaps (8), messaging publish (3), cache manager (6), SAML (3), LDAP (4), logger config (5), outbound passwords (3), port access control (6), enterprise gateway CRUD (3), ACL extended (4), account locking extended (4), server admin ops (5), WS endpoint CRUD (5), WebSocket extended (2), URL alias update, DTD doctype gen. Total: 336 tools, 9 prompts, 5 RAG resources. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 4c0eb13 commit a2cf499

40 files changed

Lines changed: 2251 additions & 22 deletions

GAP_ANALYSIS.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
# MCP Server Gap Analysis: v1.0.1 (167 tools) vs Full Designer + IS Admin
1+
# MCP Server Gap Analysis: v2.5.0 (336 tools) vs Full Designer + IS Admin
22

33
## Current Coverage Summary
44

5-
167 tools + 9 prompts covering: flow services, adapters (JDBC/SAP/OPC), adapter metadata browsing, streaming/Kafka, JMS, MQTT, JNDI, scheduler, users/groups/ACLs, JDBC pools, global variables, server monitoring, remote servers, auditing, OAuth, web services/OpenAPI, security/keystores, ports.
5+
336 tools + 9 prompts + 5 RAG resources covering: flow services, adapters (JDBC/SAP/OPC), adapter metadata browsing, streaming/Kafka, JMS, MQTT, JNDI, scheduler, users/groups/ACLs, JDBC pools, global variables, server monitoring, remote servers, auditing, OAuth, web services/OpenAPI, security/keystores, ports, SFTP, proxy, JWT, quiesce, health indicators, alerts, enterprise gateway, IP access, password policy, WebSocket, marketplace, JAR installation, flow debugging, unit testing/mocking, namespace dependencies, flat file schemas, cache manager, SAML, LDAP, logger configuration, outbound passwords, port access control, messaging publish.
66

77
---
88

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.4.0"
3+
version = "2.5.0"
44
edition = "2024"
55
description = "MCP server for managing webMethods Integration Server via pure HTTP API"
66
license = "MIT"

mcp-server-rs/README.md

Lines changed: 69 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,13 @@ Set `WM_CONFIG=/path/to/config.json`:
3232
}
3333
```
3434

35-
## Tools Reference (222 tools)
35+
## Tools Reference (336 tools)
3636

3737
### Server & Instances (3)
3838
`list_instances`, `is_status`, `is_shutdown`
3939

40-
### Packages & Namespace (13)
41-
`package_list`, `package_create`, `package_reload`, `package_enable`, `package_disable`, `package_delete`, `package_info`, `package_dependencies`, `package_jar_list`, `node_list`, `node_get`, `node_delete`, `folder_create`
40+
### Packages & Namespace (21)
41+
`package_list`, `package_create`, `package_reload`, `package_enable`, `package_disable`, `package_delete`, `package_info`, `package_dependencies`, `package_jar_list`, `package_settings`, `package_compile`, `package_add_depend`, `package_del_depend`, `package_add_startup_service`, `package_remove_startup_service`, `package_jar_delete`, `node_list`, `node_get`, `node_delete`, `folder_create`, `install_jars`
4242

4343
### Flow Services (5)
4444
`flow_service_create`, `put_node`, `service_invoke`, `document_type_create`, `mapset_value`
@@ -49,17 +49,23 @@ Set `WM_CONFIG=/path/to/config.json`:
4949
### Unit Testing & Mocking (10)
5050
`test_run`, `test_check_status`, `test_text_report`, `test_junit_report`, `mock_load`, `mock_clear`, `mock_clear_all`, `mock_list`, `mock_suspend`, `mock_resume`
5151

52-
### Document Type Generation (4 + 2 SAP)
53-
`doctype_gen_from_json`, `doctype_gen_from_json_schema`, `doctype_gen_from_xsd`, `doctype_gen_from_xml`, `sap_idoc_doctype_create`, `sap_rfc_doctype_create`
52+
### Document Type Generation (5 + 2 SAP)
53+
`doctype_gen_from_json`, `doctype_gen_from_json_schema`, `doctype_gen_from_xsd`, `doctype_gen_from_xml`, `doctype_gen_from_dtd`, `sap_idoc_doctype_create`, `sap_rfc_doctype_create`
54+
55+
### Namespace Dependencies (6)
56+
`ns_dep_get_dependents`, `ns_dep_get_references`, `ns_dep_get_unresolved`, `ns_dep_search`, `ns_dep_refactor_preview`, `ns_dep_refactor`
57+
58+
### Flat File Schemas (4)
59+
`flatfile_schema_save`, `flatfile_dictionary_create`, `flatfile_schema_get`, `flatfile_schema_delete`
5460

5561
### Package Marketplace (7)
5662
`marketplace_search`, `marketplace_package_info`, `marketplace_package_tags`, `marketplace_package_git`, `marketplace_categories`, `marketplace_registries`, `marketplace_install`
5763

5864
### Ports / Listeners (8)
5965
`port_list`, `port_factory_list`, `port_get`, `port_add`, `port_update`, `port_enable`, `port_disable`, `port_delete`
6066

61-
### URL Aliases (4)
62-
`url_alias_list`, `url_alias_add`, `url_alias_get`, `url_alias_delete`
67+
### URL Aliases (5)
68+
`url_alias_list`, `url_alias_add`, `url_alias_get`, `url_alias_delete`, `url_alias_update`
6369

6470
### Adapter Connections (7)
6571
`adapter_type_list`, `adapter_connection_list`, `adapter_connection_create`, `adapter_connection_enable`, `adapter_connection_disable`, `adapter_connection_metadata`, `adapter_connection_state`
@@ -85,23 +91,23 @@ Set `WM_CONFIG=/path/to/config.json`:
8591
### Pub/Sub Triggers (9)
8692
`trigger_report`, `trigger_create`, `trigger_delete`, `trigger_get_properties`, `trigger_set_properties`, `trigger_suspend`, `trigger_processing_status`, `trigger_retrieval_status`, `trigger_stats`
8793

88-
### Messaging Connections (8)
89-
`messaging_connection_list`, `messaging_connection_create`, `messaging_connection_delete`, `messaging_connection_enable`, `messaging_connection_disable`, `messaging_publishable_doctypes`, `messaging_csq_count`, `messaging_csq_clear`
94+
### Messaging Connections & Publish (11)
95+
`messaging_connection_list`, `messaging_connection_create`, `messaging_connection_delete`, `messaging_connection_enable`, `messaging_connection_disable`, `messaging_publishable_doctypes`, `messaging_csq_count`, `messaging_csq_clear`, `messaging_publish`, `messaging_publish_and_wait`, `messaging_deliver`
9096

9197
### Scheduler (10)
9298
`scheduler_state`, `scheduler_task_list`, `scheduler_task_get`, `scheduler_task_add`, `scheduler_task_update`, `scheduler_task_cancel`, `scheduler_task_suspend`, `scheduler_task_resume`, `scheduler_pause`, `scheduler_resume`
9399

94-
### Users & Access (13)
95-
`user_list`, `user_add`, `user_delete`, `user_set_disabled`, `user_disabled_list`, `group_list`, `group_add`, `group_delete`, `group_change`, `acl_list`, `acl_add`, `acl_delete`, `account_locking_get`
100+
### Users & Access (21)
101+
`user_list`, `user_add`, `user_delete`, `user_set_disabled`, `user_disabled_list`, `group_list`, `group_add`, `group_delete`, `group_change`, `acl_list`, `acl_add`, `acl_delete`, `acl_assign`, `acl_get_nodes`, `acl_get_default_access`, `acl_set_default_access`, `account_locking_get`, `account_locking_update`, `account_locking_reset`, `account_locked_list`, `account_unlock`
96102

97103
### JDBC Connection Pools (8)
98104
`jdbc_pool_list`, `jdbc_pool_add`, `jdbc_pool_update`, `jdbc_pool_delete`, `jdbc_pool_test`, `jdbc_pool_restart`, `jdbc_driver_list`, `jdbc_function_list`
99105

100106
### Global Variables (5)
101107
`global_var_list`, `global_var_get`, `global_var_add`, `global_var_edit`, `global_var_remove`
102108

103-
### Server Monitoring (10)
104-
`server_health`, `server_stats`, `server_settings`, `server_extended_settings`, `server_service_stats`, `server_thread_dump`, `server_session_list`, `server_license_info`, `server_log`, `server_circuit_breaker_stats`
109+
### Server Monitoring & Admin (15)
110+
`server_health`, `server_stats`, `server_settings`, `server_extended_settings`, `server_service_stats`, `server_thread_dump`, `server_session_list`, `server_license_info`, `server_log`, `server_circuit_breaker_stats`, `server_thread_interrupt`, `server_thread_kill`, `server_session_kill`, `server_ssl_cache_clear`, `ip_access_change_type`
105111

106112
### Remote Servers (4)
107113
`remote_server_list`, `remote_server_add`, `remote_server_delete`, `remote_server_test`
@@ -112,12 +118,60 @@ Set `WM_CONFIG=/path/to/config.json`:
112118
### OAuth (9)
113119
`oauth_settings_get`, `oauth_settings_update`, `oauth_client_list`, `oauth_client_register`, `oauth_client_delete`, `oauth_scope_list`, `oauth_scope_add`, `oauth_scope_remove`, `oauth_token_list`
114120

115-
### Web Services / REST / OpenAPI (8)
116-
`ws_provider_endpoint_list`, `ws_consumer_endpoint_list`, `ws_wsdl_get`, `rest_resource_list`, `openapi_doc_get`, `openapi_generate_provider`, `openapi_generate_consumer`, `openapi_refresh_provider`
121+
### Web Services / REST / OpenAPI (13)
122+
`ws_provider_endpoint_list`, `ws_consumer_endpoint_list`, `ws_wsdl_get`, `ws_consumer_endpoint_add`, `ws_provider_endpoint_add`, `ws_consumer_endpoint_delete`, `ws_provider_endpoint_delete`, `ws_connector_refresh`, `rest_resource_list`, `openapi_doc_get`, `openapi_generate_provider`, `openapi_generate_consumer`, `openapi_refresh_provider`
123+
124+
### SFTP (9)
125+
`sftp_server_list`, `sftp_server_get`, `sftp_server_create`, `sftp_server_delete`, `sftp_test_connection`, `sftp_user_list`, `sftp_user_get`, `sftp_user_create`, `sftp_user_delete`
126+
127+
### HTTP Proxy (6)
128+
`proxy_list`, `proxy_get`, `proxy_create`, `proxy_delete`, `proxy_enable`, `proxy_disable`
129+
130+
### JWT (6)
131+
`jwt_issuer_list`, `jwt_issuer_get`, `jwt_issuer_add`, `jwt_issuer_delete`, `jwt_settings_get`, `jwt_settings_update`
132+
133+
### Quiesce Mode (3)
134+
`quiesce_status`, `quiesce_enable`, `quiesce_disable`
135+
136+
### Health Indicators (3)
137+
`health_indicators_list`, `health_indicator_get`, `health_indicator_change`
138+
139+
### Alerts (3)
140+
`alert_status`, `alert_enable`, `alert_disable`
141+
142+
### IP Access Control (4)
143+
`ip_access_list`, `ip_access_add`, `ip_access_delete`, `ip_access_change_type`
144+
145+
### Password Policy (2)
146+
`password_policy_get`, `password_policy_update`
117147

118148
### Security & Keystore (4)
119149
`keystore_list`, `truststore_list`, `security_settings_get`, `security_settings_update`
120150

151+
### Cache Manager (6)
152+
`cache_manager_list`, `cache_manager_get`, `cache_manager_create`, `cache_manager_update`, `cache_manager_delete`, `cache_reset`
153+
154+
### SAML (3)
155+
`saml_issuer_list`, `saml_issuer_add`, `saml_issuer_delete`
156+
157+
### LDAP (4)
158+
`ldap_settings_get`, `ldap_server_add`, `ldap_server_edit`, `ldap_server_delete`
159+
160+
### Logger Configuration (5)
161+
`logger_list`, `logger_get`, `logger_update`, `logger_server_config_get`, `logger_server_config_update`
162+
163+
### Outbound Passwords (3)
164+
`outbound_password_store`, `outbound_password_retrieve`, `outbound_password_remove`
165+
166+
### Port Access Control (6)
167+
`port_access_list`, `port_access_get`, `port_access_add_nodes`, `port_access_delete_node`, `port_access_set_type`, `port_access_reset`
168+
169+
### Enterprise Gateway (7)
170+
`egw_rules_list`, `egw_dos_get`, `egw_dos_update`, `egw_denied_ip_list`, `egw_rule_add`, `egw_rule_delete`, `egw_rule_update`
171+
172+
### WebSocket (4)
173+
`websocket_sessions_by_port`, `websocket_close_session`, `websocket_endpoint_create`, `websocket_broadcast`
174+
121175
## Prompts Reference (9 interactive wizards)
122176

123177
| Prompt | What it guides you through |

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

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
use serde_json::{Value, json};
2+
3+
impl super::ISClient {
4+
pub async fn cache_manager_list(&self) -> Result<Value, String> {
5+
self.admin_get("/admin/cachemanager").await
6+
}
7+
8+
pub async fn cache_manager_get(&self, name: &str) -> Result<Value, String> {
9+
self.admin_get(&format!("/admin/cachemanager/{name}")).await
10+
}
11+
12+
pub async fn cache_manager_create(&self, settings: &Value) -> Result<Value, String> {
13+
self.admin_post("/admin/cachemanager", settings).await
14+
}
15+
16+
pub async fn cache_manager_update(
17+
&self,
18+
name: &str,
19+
settings: &Value,
20+
) -> Result<Value, String> {
21+
self.admin_patch(&format!("/admin/cachemanager/{name}"), settings)
22+
.await
23+
}
24+
25+
pub async fn cache_manager_delete(&self, name: &str) -> Result<Value, String> {
26+
self.admin_delete(&format!("/admin/cachemanager/{name}"))
27+
.await
28+
}
29+
30+
pub async fn cache_reset(&self, cache_name: &str) -> Result<Value, String> {
31+
self.invoke_post(
32+
"wm.server.cache:resetCache",
33+
&json!({"cacheName": cache_name}),
34+
)
35+
.await
36+
}
37+
38+
// ── REST Admin helpers ────────────────────────────────────────────
39+
40+
pub(crate) async fn admin_get(&self, path: &str) -> Result<Value, String> {
41+
let r = self
42+
.client
43+
.get(self.url(path))
44+
.send()
45+
.await
46+
.map_err(|e| e.to_string())?;
47+
r.error_for_status_ref().map_err(|e| e.to_string())?;
48+
let text = r.text().await.map_err(|e| e.to_string())?;
49+
if text.trim().is_empty() {
50+
Ok(json!({"status": "ok"}))
51+
} else {
52+
serde_json::from_str(&text).map_err(|e| e.to_string())
53+
}
54+
}
55+
56+
pub(crate) async fn admin_post(&self, path: &str, payload: &Value) -> Result<Value, String> {
57+
let r = self
58+
.client
59+
.post(self.url(path))
60+
.json(payload)
61+
.send()
62+
.await
63+
.map_err(|e| e.to_string())?;
64+
r.error_for_status_ref().map_err(|e| e.to_string())?;
65+
let text = r.text().await.map_err(|e| e.to_string())?;
66+
if text.trim().is_empty() {
67+
Ok(json!({"status": "ok"}))
68+
} else {
69+
serde_json::from_str(&text).map_err(|e| e.to_string())
70+
}
71+
}
72+
73+
pub(crate) async fn admin_patch(&self, path: &str, payload: &Value) -> Result<Value, String> {
74+
let r = self
75+
.client
76+
.patch(self.url(path))
77+
.json(payload)
78+
.send()
79+
.await
80+
.map_err(|e| e.to_string())?;
81+
r.error_for_status_ref().map_err(|e| e.to_string())?;
82+
let text = r.text().await.map_err(|e| e.to_string())?;
83+
if text.trim().is_empty() {
84+
Ok(json!({"status": "ok"}))
85+
} else {
86+
serde_json::from_str(&text).map_err(|e| e.to_string())
87+
}
88+
}
89+
90+
pub(crate) async fn admin_delete(&self, path: &str) -> Result<Value, String> {
91+
let r = self
92+
.client
93+
.delete(self.url(path))
94+
.send()
95+
.await
96+
.map_err(|e| e.to_string())?;
97+
r.error_for_status_ref().map_err(|e| e.to_string())?;
98+
let text = r.text().await.map_err(|e| e.to_string())?;
99+
if text.trim().is_empty() {
100+
Ok(json!({"status": "ok"}))
101+
} else {
102+
serde_json::from_str(&text).map_err(|e| e.to_string())
103+
}
104+
}
105+
106+
#[allow(dead_code)]
107+
pub(crate) async fn admin_put(&self, path: &str, payload: &Value) -> Result<Value, String> {
108+
let r = self
109+
.client
110+
.put(self.url(path))
111+
.json(payload)
112+
.send()
113+
.await
114+
.map_err(|e| e.to_string())?;
115+
r.error_for_status_ref().map_err(|e| e.to_string())?;
116+
let text = r.text().await.map_err(|e| e.to_string())?;
117+
if text.trim().is_empty() {
118+
Ok(json!({"status": "ok"}))
119+
} else {
120+
serde_json::from_str(&text).map_err(|e| e.to_string())
121+
}
122+
}
123+
}

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

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use serde_json::Value;
1+
use serde_json::{Value, json};
22

33
impl super::ISClient {
44
pub async fn egw_rules_list(&self) -> Result<Value, String> {
@@ -19,4 +19,22 @@ impl super::ISClient {
1919
self.invoke_get("wm.server.enterprisegateway:getDeniedIPList")
2020
.await
2121
}
22+
23+
pub async fn egw_rule_add(&self, settings: &Value) -> Result<Value, String> {
24+
self.invoke_post("wm.server.enterprisegateway:addRule", settings)
25+
.await
26+
}
27+
28+
pub async fn egw_rule_delete(&self, rule_name: &str) -> Result<Value, String> {
29+
self.invoke_post(
30+
"wm.server.enterprisegateway:deleteRule",
31+
&json!({"ruleName": rule_name}),
32+
)
33+
.await
34+
}
35+
36+
pub async fn egw_rule_update(&self, settings: &Value) -> Result<Value, String> {
37+
self.invoke_post("wm.server.enterprisegateway:updateRule", settings)
38+
.await
39+
}
2240
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
use serde_json::{Value, json};
2+
3+
impl super::ISClient {
4+
pub async fn flatfile_schema_save(
5+
&self,
6+
xml_content: &str,
7+
package_name: &str,
8+
schema_name: &str,
9+
) -> Result<Value, String> {
10+
self.invoke_post(
11+
"pub.flatFile.generate:saveXMLAsFFSchema",
12+
&json!({
13+
"xmlData": xml_content,
14+
"packageName": package_name,
15+
"schemaName": schema_name,
16+
}),
17+
)
18+
.await
19+
}
20+
21+
pub async fn flatfile_dictionary_create(
22+
&self,
23+
package_name: &str,
24+
dictionary_name: &str,
25+
) -> Result<Value, String> {
26+
self.invoke_post(
27+
"pub.flatFile.generate:createFFDictionary",
28+
&json!({
29+
"packageName": package_name,
30+
"dictionaryName": dictionary_name,
31+
}),
32+
)
33+
.await
34+
}
35+
36+
pub async fn flatfile_schema_get(
37+
&self,
38+
package_name: &str,
39+
schema_name: &str,
40+
) -> Result<Value, String> {
41+
self.invoke_post(
42+
"pub.flatFile.generate:getFFSchemaAsXML",
43+
&json!({
44+
"packageName": package_name,
45+
"schemaName": schema_name,
46+
}),
47+
)
48+
.await
49+
}
50+
51+
pub async fn flatfile_schema_delete(
52+
&self,
53+
package_name: &str,
54+
schema_name: &str,
55+
) -> Result<Value, String> {
56+
self.invoke_post(
57+
"pub.flatFile.generate:deleteFFSchema",
58+
&json!({
59+
"packageName": package_name,
60+
"schemaName": schema_name,
61+
}),
62+
)
63+
.await
64+
}
65+
}

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,12 @@ impl super::ISClient {
1313
self.invoke_post("wm.server.net:ipRuleDelete", &json!({"ip": ip}))
1414
.await
1515
}
16+
17+
pub async fn ip_access_change_type(&self, access_type: &str) -> Result<Value, String> {
18+
self.invoke_post(
19+
"wm.server.net:changeIPAccessType",
20+
&json!({"type": access_type}),
21+
)
22+
.await
23+
}
1624
}

0 commit comments

Comments
 (0)