Skip to main content

raps_cli/mcp/
tools.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright 2024-2025 Dmytro Yemelianov
3
4//! MCP Tool definitions and utilities
5//!
6//! This module contains additional tool implementations and helper utilities
7//! for the RAPS MCP Server.
8
9// Tool definitions are in server.rs.
10// This module is reserved for additional utilities and extended tool implementations.
11
12/// Available MCP tools in the RAPS server — must stay in sync with `get_tools()` in server.rs
13pub const TOOLS: &[&str] = &[
14    // Authentication
15    "auth_test",
16    "auth_status",
17    "auth_login",
18    "auth_logout",
19    // OSS Buckets
20    "bucket_list",
21    "bucket_create",
22    "bucket_get",
23    "bucket_delete",
24    // OSS Objects (basic)
25    "object_list",
26    "object_delete",
27    "object_signed_url",
28    "object_urn",
29    // OSS Objects (upload/download/copy)
30    "object_upload",
31    "object_upload_batch",
32    "object_download",
33    "object_info",
34    "object_copy",
35    "object_delete_batch",
36    // Model Derivative
37    "translate_start",
38    "translate_status",
39    // Data Management
40    "hub_list",
41    "hub_info",
42    "project_list",
43    // Project Management
44    "project_info",
45    "project_users_list",
46    "folder_contents",
47    // Admin Bulk Operations
48    "admin_project_list",
49    "admin_user_add",
50    "admin_user_remove",
51    "admin_user_update_role",
52    "admin_folder_rights",
53    "admin_operation_list",
54    "admin_operation_status",
55    "admin_operation_resume",
56    "admin_operation_cancel",
57    // ACC Project Admin
58    "project_create",
59    "project_update",
60    "project_archive",
61    "project_user_add",
62    "project_user_remove",
63    "project_user_update",
64    "project_users_import",
65    // Template Management
66    "template_list",
67    "template_info",
68    "template_create",
69    "template_update",
70    "template_archive",
71    "template_convert",
72    // Folder/Item Management
73    "folder_list",
74    "folder_create",
75    "item_info",
76    "item_versions",
77    "item_create",
78    "item_delete",
79    "item_rename",
80    // Issues
81    "issue_list",
82    "issue_get",
83    "issue_create",
84    "issue_update",
85    // Issue Comments
86    "issue_comments_list",
87    "issue_comment_add",
88    "issue_comment_delete",
89    // RFIs
90    "rfi_list",
91    "rfi_get",
92    "rfi_create",
93    "rfi_update",
94    // ACC Extended
95    "acc_assets_list",
96    "asset_create",
97    "asset_update",
98    "asset_delete",
99    "asset_get",
100    "acc_submittals_list",
101    "submittal_create",
102    "submittal_update",
103    "acc_checklists_list",
104    "checklist_create",
105    "checklist_update",
106    "checklist_templates_list",
107    // Custom API
108    "api_request",
109    // Admin User Listing
110    "admin_user_list",
111    // Portfolio Reports
112    "report_rfi_summary",
113    "report_issues_summary",
114    // Webhooks
115    "webhook_list",
116    "webhook_create",
117    "webhook_get",
118    "webhook_update",
119    "webhook_delete",
120    "webhook_events",
121    // Design Automation
122    "da_engines_list",
123    "da_appbundles_list",
124    "da_activities_list",
125    "da_workitem_create",
126    "da_workitem_status",
127    "da_workitems_list",
128    // Reality Capture
129    "reality_list",
130    "reality_create",
131    "reality_process",
132    "reality_status",
133    "reality_result",
134    "reality_delete",
135    "reality_formats",
136];
137
138#[cfg(test)]
139mod tests {
140    use super::*;
141
142    #[test]
143    fn test_tools_array_count() {
144        assert_eq!(
145            TOOLS.len(),
146            101,
147            "TOOLS array has {} entries, expected 101 — sync with get_tools() in server.rs",
148            TOOLS.len()
149        );
150    }
151
152    #[test]
153    fn test_tools_array_no_duplicates() {
154        let mut seen = std::collections::HashSet::new();
155        for tool in TOOLS {
156            assert!(seen.insert(tool), "Duplicate tool name: {}", tool);
157        }
158    }
159
160    #[test]
161    fn test_tools_array_naming_convention() {
162        for tool in TOOLS {
163            assert!(!tool.is_empty(), "Empty tool name found");
164            assert!(!tool.contains(' '), "Tool name contains space: {}", tool);
165            assert!(!tool.contains('-'), "Tool name contains dash: {}", tool);
166            assert!(
167                tool.chars()
168                    .all(|c| c.is_ascii_lowercase() || c == '_' || c.is_ascii_digit()),
169                "Tool name not snake_case: {}",
170                tool
171            );
172        }
173    }
174
175    #[test]
176    fn test_essential_tools_present() {
177        let tools: Vec<&&str> = TOOLS.iter().collect();
178        // Auth
179        assert!(tools.contains(&&"auth_test"));
180        assert!(tools.contains(&&"auth_login"));
181        assert!(tools.contains(&&"auth_logout"));
182        // Buckets
183        assert!(tools.contains(&&"bucket_list"));
184        // Webhooks
185        assert!(tools.contains(&&"webhook_list"));
186        // DA
187        assert!(tools.contains(&&"da_engines_list"));
188        // Reality
189        assert!(tools.contains(&&"reality_create"));
190        // Issues
191        assert!(tools.contains(&&"issue_list"));
192        // Hub
193        assert!(tools.contains(&&"hub_list"));
194        // Admin
195        assert!(tools.contains(&&"admin_user_list"));
196        // Project management
197        assert!(tools.contains(&&"project_update"));
198        assert!(tools.contains(&&"project_archive"));
199        assert!(tools.contains(&&"template_convert"));
200    }
201}