import os
import re
import glob
FIXES = [
(r'use prism_mcp_rs::\{[^}]+\};', 'use prism_mcp_rs::prelude::*;'),
(r'use prism_mcp_rs::transport::stdio::StdioTransport;', ''),
(r'transport::stdio::StdioTransport', ''),
(r'ServerBuilder::new\("([^"]+)"\)', r'ServerBuilder::new()\n .name("\1")'),
(r'CallToolResult \{\s*content: ([^,]+),\s*is_error: ([^}]+)\s*\}',
r'CallToolResult { content: \1, is_error: \2, meta: None, structured_content: None }'),
(r'ToolResult \{\s*content: ([^,]+),\s*is_error: ([^}]+)\s*\}',
r'ToolResult { content: \1, is_error: \2, meta: None, structured_content: None }'),
(r'CreateMessageResult \{\s*model:([^,]+),\s*role:([^,]+),\s*content:([^}]+)\s*\}',
r'CreateMessageResult { model:\1, role:\2, content:\3, meta: None }'),
(r'Resource \{\s*uri:([^,]+),\s*name:([^,]+),\s*description:([^,]+),\s*mime_type:([^}]+)\s*\}',
r'Resource { uri:\1, name:\2, description:\3, mime_type:\4, annotations: None, meta: None, size: None, title: None }'),
(r'Prompt \{\s*name:([^,]+),\s*description:([^,]+),\s*arguments:([^}]+)\s*\}',
r'Prompt { name:\1, description:\2, arguments:\3, meta: None, title: None }'),
(r'PromptArgument \{\s*name:([^,]+),\s*description:([^,]+),\s*required:([^}]+)\s*\}',
r'PromptArgument { name:\1, description:\2, required:\3, title: None }'),
(r'ResourceTemplate \{\s*uri_template:([^,]+),\s*name:([^,]+),\s*description:([^,]+),\s*mime_type:([^}]+)\s*\}',
r'ResourceTemplate { uri_template:\1, name:\2, description:\3, mime_type:\4, annotations: None, meta: None, title: None }'),
(r'ErrorCode', 'JsonRpcError'),
(r'ListResourcesRequest', 'ListResourcesParams'),
(r'ReadResourceRequest', 'ReadResourceParams'),
(r'ListPromptsRequest', 'ListPromptsParams'),
(r'GetPromptRequest', 'GetPromptParams'),
(r'CreateMessageRequest', 'CreateMessageParams'),
(r'\.description\(', '.with_description('),
(r'server\.run_with_stdio\(\)', '// server.run_with_stdio() - method not available'),
(r'capabilities\.tools = Some\(true\)', 'capabilities.tools = Some(ToolsCapability { list_changed: Some(true) })'),
(r'capabilities\.resources = Some\(true\)', 'capabilities.resources = Some(ResourcesCapability { subscribe: Some(true), list_changed: Some(true) })'),
(r'capabilities\.prompts = Some\(true\)', 'capabilities.prompts = Some(PromptsCapability { list_changed: Some(true) })'),
(r'capabilities\.sampling = Some\(true\)', 'capabilities.sampling = Some(SamplingCapability {})'),
]
def fix_file(filepath):
print(f"Fixing {filepath}...")
with open(filepath, 'r') as f:
content = f.read()
original = content
for pattern, replacement in FIXES:
content = re.sub(pattern, replacement, content, flags=re.MULTILINE | re.DOTALL)
if content != original:
with open(filepath, 'w') as f:
f.write(content)
print(f" ✓ Fixed {filepath}")
return True
else:
print(f" - No changes needed for {filepath}")
return False
def main():
examples_dir = "examples"
rust_files = glob.glob(f"{examples_dir}/**/*.rs", recursive=True)
fixed_count = 0
for filepath in rust_files:
if fix_file(filepath):
fixed_count += 1
print(f"\nFixed {fixed_count}/{len(rust_files)} files")
if __name__ == "__main__":
main()