This is page 12 of 20. Use http://codebase.md/fujitsu-ai/mcp-server-for-mas-developments?lines=true&page={x} to view the full context.
# Directory Structure
```
├── .gitattributes
├── .gitignore
├── agents
│ ├── __init__.py
│ ├── AgentInterface
│ │ ├── __init__.py
│ │ ├── Python
│ │ │ ├── __init__.py
│ │ │ ├── agent.py
│ │ │ ├── color.py
│ │ │ ├── config.py
│ │ │ ├── language.py
│ │ │ ├── local_file_handler.py
│ │ │ └── network.py
│ │ └── requirements.txt
│ ├── AgentMonitoring
│ │ ├── ChatBot-Agent Dashboard Example - Grafana.json
│ │ ├── images
│ │ │ ├── Grafana.png
│ │ │ └── Prometheus.png
│ │ ├── IoT-Agent Dashboard Example - Grafana.json
│ │ ├── OpenAI compatible API - Agent Dashboard Example - Grafana.json
│ │ ├── prometheus Example.yml
│ │ └── README.md
│ ├── ChatBotAgent
│ │ ├── __init__.py
│ │ ├── config.json.example
│ │ ├── html
│ │ │ ├── favicon.ico
│ │ │ ├── index_de.html
│ │ │ ├── index.html
│ │ │ ├── Logo_light.svg
│ │ │ ├── start_http_server.ps1
│ │ │ └── start_http_server.sh
│ │ ├── Python
│ │ │ ├── __init__.py
│ │ │ └── chatbot_agent.py
│ │ ├── README.md
│ │ └── requirements.txt
│ ├── IoTAgent
│ │ ├── config_example.json
│ │ ├── Python
│ │ │ ├── iot_mqtt_agent.py
│ │ │ └── language.py
│ │ ├── README.md
│ │ └── requirements.txt
│ ├── ISMAgent
│ │ ├── config_example.json
│ │ ├── PGPT Scenario Prompts
│ │ │ ├── ISM System Prompt - Detecting Error State.txt
│ │ │ ├── ISM User Post-Prompt - Detecting Error State.txt
│ │ │ ├── ISM User Pre-Prompt - Detecting Error State.txt
│ │ │ └── README.md
│ │ ├── Python
│ │ │ ├── ism_agent.py
│ │ │ └── language.py
│ │ ├── README.md
│ │ ├── requirements.txt
│ │ └── start_ism_agent.ps1
│ ├── MCP-Client
│ │ ├── __init__.py
│ │ ├── .env.example
│ │ ├── Python
│ │ │ ├── __init__.py
│ │ │ ├── chat_handler.py
│ │ │ ├── config.py
│ │ │ ├── environment.py
│ │ │ ├── llm_client.py
│ │ │ ├── mcp_client_sse.py
│ │ │ ├── mcp_client.py
│ │ │ ├── messages
│ │ │ │ ├── __init__.py
│ │ │ │ ├── message_types
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── incrementing_id_message.py
│ │ │ │ │ ├── initialize_message.py
│ │ │ │ │ ├── json_rpc_message.py
│ │ │ │ │ ├── ping_message.py
│ │ │ │ │ ├── prompts_messages.py
│ │ │ │ │ ├── prompts_models.py
│ │ │ │ │ ├── resources_messages.py
│ │ │ │ │ └── tools_messages.py
│ │ │ │ ├── send_call_tool.py
│ │ │ │ ├── send_initialize_message.py
│ │ │ │ ├── send_message.py
│ │ │ │ ├── send_ping.py
│ │ │ │ ├── send_prompts.py
│ │ │ │ ├── send_resources.py
│ │ │ │ └── send_tools_list.py
│ │ │ ├── system_prompt_generator.py
│ │ │ ├── tools_handler.py
│ │ │ └── transport
│ │ │ ├── __init__.py
│ │ │ └── stdio
│ │ │ ├── __init__.py
│ │ │ ├── stdio_client.py
│ │ │ ├── stdio_server_parameters.py
│ │ │ └── stdio_server_shutdown.py
│ │ ├── README.md
│ │ ├── requirements.txt
│ │ └── server_config.json
│ ├── OpenAI_Compatible_API_Agent
│ │ ├── __init__.py
│ │ ├── docker-compose.yml
│ │ ├── Dockerfile
│ │ ├── pgpt_openai_api_mcp.json.example
│ │ ├── pgpt_openai_api_proxy.json.example
│ │ ├── Python
│ │ │ ├── __init__.py
│ │ │ ├── client_tests
│ │ │ │ ├── __init__.py
│ │ │ │ ├── openai_test_client_structured.py
│ │ │ │ ├── openai_test_client_tools.py
│ │ │ │ ├── openai_test_client.py
│ │ │ │ ├── vllm_client_multimodal.py
│ │ │ │ ├── vllm_client.py
│ │ │ │ ├── vllm_structured.py
│ │ │ │ └── vllm_structured2.py
│ │ │ ├── generate_api_key.py
│ │ │ ├── open_ai_helper.py
│ │ │ ├── openai_compatible_api.py
│ │ │ ├── openai_mcp_api.py
│ │ │ ├── pgpt_api.py
│ │ │ ├── privategpt_api.py
│ │ │ └── vllmproxy.py
│ │ ├── README.md
│ │ └── requirements.txt
│ └── SourceManagerAgent
│ ├── __init__.py
│ ├── config.json.example
│ └── Python
│ ├── __init__.py
│ ├── file_tools
│ │ └── loader_factory.py
│ ├── file_upload_agent.py
│ └── local_db.py
├── clients
│ ├── __init__.py
│ ├── C# .Net
│ │ ├── 1.0 mcp_login
│ │ │ ├── bin
│ │ │ │ └── Debug
│ │ │ │ └── net9.0
│ │ │ │ ├── mcp_login.deps.json
│ │ │ │ ├── mcp_login.dll
│ │ │ │ ├── mcp_login.exe
│ │ │ │ ├── mcp_login.pdb
│ │ │ │ ├── mcp_login.runtimeconfig.json
│ │ │ │ └── Newtonsoft.Json.dll
│ │ │ ├── mcp_login.csproj
│ │ │ ├── obj
│ │ │ │ ├── Debug
│ │ │ │ │ └── net9.0
│ │ │ │ │ ├── .NETCoreApp,Version=v9.0.AssemblyAttributes.cs
│ │ │ │ │ ├── apphost.exe
│ │ │ │ │ ├── mcp_login.AssemblyInfo.cs
│ │ │ │ │ ├── mcp_login.AssemblyInfoInputs.cache
│ │ │ │ │ ├── mcp_login.assets.cache
│ │ │ │ │ ├── mcp_login.csproj.AssemblyReference.cache
│ │ │ │ │ ├── mcp_login.csproj.CoreCompileInputs.cache
│ │ │ │ │ ├── mcp_login.csproj.FileListAbsolute.txt
│ │ │ │ │ ├── mcp_login.csproj.Up2Date
│ │ │ │ │ ├── mcp_login.dll
│ │ │ │ │ ├── mcp_login.GeneratedMSBuildEditorConfig.editorconfig
│ │ │ │ │ ├── mcp_login.genruntimeconfig.cache
│ │ │ │ │ ├── mcp_login.GlobalUsings.g.cs
│ │ │ │ │ ├── mcp_login.pdb
│ │ │ │ │ ├── ref
│ │ │ │ │ │ └── mcp_login.dll
│ │ │ │ │ └── refint
│ │ │ │ │ └── mcp_login.dll
│ │ │ │ ├── mcp_login.csproj.nuget.dgspec.json
│ │ │ │ ├── mcp_login.csproj.nuget.g.props
│ │ │ │ ├── mcp_login.csproj.nuget.g.targets
│ │ │ │ ├── project.assets.json
│ │ │ │ └── project.nuget.cache
│ │ │ └── Program.cs
│ │ ├── 1.1 mcp_logout
│ │ │ ├── bin
│ │ │ │ └── Debug
│ │ │ │ └── net9.0
│ │ │ │ ├── mcp_logout.deps.json
│ │ │ │ ├── mcp_logout.dll
│ │ │ │ ├── mcp_logout.exe
│ │ │ │ ├── mcp_logout.pdb
│ │ │ │ ├── mcp_logout.runtimeconfig.json
│ │ │ │ └── Newtonsoft.Json.dll
│ │ │ ├── mcp_logout.csproj
│ │ │ ├── obj
│ │ │ │ ├── Debug
│ │ │ │ │ └── net9.0
│ │ │ │ │ ├── .NETCoreApp,Version=v9.0.AssemblyAttributes.cs
│ │ │ │ │ ├── apphost.exe
│ │ │ │ │ ├── mcp_logout.AssemblyInfo.cs
│ │ │ │ │ ├── mcp_logout.AssemblyInfoInputs.cache
│ │ │ │ │ ├── mcp_logout.assets.cache
│ │ │ │ │ ├── mcp_logout.csproj.AssemblyReference.cache
│ │ │ │ │ ├── mcp_logout.csproj.CoreCompileInputs.cache
│ │ │ │ │ ├── mcp_logout.csproj.FileListAbsolute.txt
│ │ │ │ │ ├── mcp_logout.csproj.Up2Date
│ │ │ │ │ ├── mcp_logout.dll
│ │ │ │ │ ├── mcp_logout.GeneratedMSBuildEditorConfig.editorconfig
│ │ │ │ │ ├── mcp_logout.genruntimeconfig.cache
│ │ │ │ │ ├── mcp_logout.GlobalUsings.g.cs
│ │ │ │ │ ├── mcp_logout.pdb
│ │ │ │ │ ├── ref
│ │ │ │ │ │ └── mcp_logout.dll
│ │ │ │ │ └── refint
│ │ │ │ │ └── mcp_logout.dll
│ │ │ │ ├── mcp_logout.csproj.nuget.dgspec.json
│ │ │ │ ├── mcp_logout.csproj.nuget.g.props
│ │ │ │ ├── mcp_logout.csproj.nuget.g.targets
│ │ │ │ ├── project.assets.json
│ │ │ │ └── project.nuget.cache
│ │ │ └── Program.cs
│ │ ├── 2.0 mcp_chat
│ │ │ ├── bin
│ │ │ │ └── Debug
│ │ │ │ └── net9.0
│ │ │ │ ├── mcp_chat.deps.json
│ │ │ │ ├── mcp_chat.dll
│ │ │ │ ├── mcp_chat.exe
│ │ │ │ ├── mcp_chat.pdb
│ │ │ │ ├── mcp_chat.runtimeconfig.json
│ │ │ │ └── Newtonsoft.Json.dll
│ │ │ ├── mcp_chat.csproj
│ │ │ ├── obj
│ │ │ │ ├── Debug
│ │ │ │ │ └── net9.0
│ │ │ │ │ ├── .NETCoreApp,Version=v9.0.AssemblyAttributes.cs
│ │ │ │ │ ├── apphost.exe
│ │ │ │ │ ├── mcp_chat.AssemblyInfo.cs
│ │ │ │ │ ├── mcp_chat.AssemblyInfoInputs.cache
│ │ │ │ │ ├── mcp_chat.assets.cache
│ │ │ │ │ ├── mcp_chat.csproj.AssemblyReference.cache
│ │ │ │ │ ├── mcp_chat.csproj.CoreCompileInputs.cache
│ │ │ │ │ ├── mcp_chat.csproj.FileListAbsolute.txt
│ │ │ │ │ ├── mcp_chat.csproj.Up2Date
│ │ │ │ │ ├── mcp_chat.dll
│ │ │ │ │ ├── mcp_chat.GeneratedMSBuildEditorConfig.editorconfig
│ │ │ │ │ ├── mcp_chat.genruntimeconfig.cache
│ │ │ │ │ ├── mcp_chat.GlobalUsings.g.cs
│ │ │ │ │ ├── mcp_chat.pdb
│ │ │ │ │ ├── ref
│ │ │ │ │ │ └── mcp_chat.dll
│ │ │ │ │ └── refint
│ │ │ │ │ └── mcp_chat.dll
│ │ │ │ ├── mcp_chat.csproj.nuget.dgspec.json
│ │ │ │ ├── mcp_chat.csproj.nuget.g.props
│ │ │ │ ├── mcp_chat.csproj.nuget.g.targets
│ │ │ │ ├── project.assets.json
│ │ │ │ └── project.nuget.cache
│ │ │ └── Program.cs
│ │ ├── 2.1 mcp_continue_chat
│ │ │ ├── bin
│ │ │ │ └── Debug
│ │ │ │ └── net9.0
│ │ │ │ ├── mcp_continue_chat.deps.json
│ │ │ │ ├── mcp_continue_chat.dll
│ │ │ │ ├── mcp_continue_chat.exe
│ │ │ │ ├── mcp_continue_chat.pdb
│ │ │ │ ├── mcp_continue_chat.runtimeconfig.json
│ │ │ │ └── Newtonsoft.Json.dll
│ │ │ ├── mcp_continue_chat.csproj
│ │ │ ├── obj
│ │ │ │ ├── Debug
│ │ │ │ │ └── net9.0
│ │ │ │ │ ├── .NETCoreApp,Version=v9.0.AssemblyAttributes.cs
│ │ │ │ │ ├── apphost.exe
│ │ │ │ │ ├── mcp_cont.EF178231.Up2Date
│ │ │ │ │ ├── mcp_continue_chat.AssemblyInfo.cs
│ │ │ │ │ ├── mcp_continue_chat.AssemblyInfoInputs.cache
│ │ │ │ │ ├── mcp_continue_chat.assets.cache
│ │ │ │ │ ├── mcp_continue_chat.csproj.AssemblyReference.cache
│ │ │ │ │ ├── mcp_continue_chat.csproj.CoreCompileInputs.cache
│ │ │ │ │ ├── mcp_continue_chat.csproj.FileListAbsolute.txt
│ │ │ │ │ ├── mcp_continue_chat.dll
│ │ │ │ │ ├── mcp_continue_chat.GeneratedMSBuildEditorConfig.editorconfig
│ │ │ │ │ ├── mcp_continue_chat.genruntimeconfig.cache
│ │ │ │ │ ├── mcp_continue_chat.GlobalUsings.g.cs
│ │ │ │ │ ├── mcp_continue_chat.pdb
│ │ │ │ │ ├── ref
│ │ │ │ │ │ └── mcp_continue_chat.dll
│ │ │ │ │ └── refint
│ │ │ │ │ └── mcp_continue_chat.dll
│ │ │ │ ├── mcp_continue_chat.csproj.nuget.dgspec.json
│ │ │ │ ├── mcp_continue_chat.csproj.nuget.g.props
│ │ │ │ ├── mcp_continue_chat.csproj.nuget.g.targets
│ │ │ │ ├── project.assets.json
│ │ │ │ └── project.nuget.cache
│ │ │ └── Program.cs
│ │ ├── 2.2 mcp_get_chat_info
│ │ │ ├── bin
│ │ │ │ └── Debug
│ │ │ │ └── net9.0
│ │ │ │ ├── mcp_get_chat_info.deps.json
│ │ │ │ ├── mcp_get_chat_info.dll
│ │ │ │ ├── mcp_get_chat_info.exe
│ │ │ │ ├── mcp_get_chat_info.pdb
│ │ │ │ ├── mcp_get_chat_info.runtimeconfig.json
│ │ │ │ └── Newtonsoft.Json.dll
│ │ │ ├── Dokumente - Verknüpfung.lnk
│ │ │ ├── mcp_get_chat_info.csproj
│ │ │ ├── obj
│ │ │ │ ├── Debug
│ │ │ │ │ └── net9.0
│ │ │ │ │ ├── .NETCoreApp,Version=v9.0.AssemblyAttributes.cs
│ │ │ │ │ ├── apphost.exe
│ │ │ │ │ ├── mcp_get_.DFF47B4E.Up2Date
│ │ │ │ │ ├── mcp_get_chat_info.AssemblyInfo.cs
│ │ │ │ │ ├── mcp_get_chat_info.AssemblyInfoInputs.cache
│ │ │ │ │ ├── mcp_get_chat_info.assets.cache
│ │ │ │ │ ├── mcp_get_chat_info.csproj.AssemblyReference.cache
│ │ │ │ │ ├── mcp_get_chat_info.csproj.CoreCompileInputs.cache
│ │ │ │ │ ├── mcp_get_chat_info.csproj.FileListAbsolute.txt
│ │ │ │ │ ├── mcp_get_chat_info.dll
│ │ │ │ │ ├── mcp_get_chat_info.GeneratedMSBuildEditorConfig.editorconfig
│ │ │ │ │ ├── mcp_get_chat_info.genruntimeconfig.cache
│ │ │ │ │ ├── mcp_get_chat_info.GlobalUsings.g.cs
│ │ │ │ │ ├── mcp_get_chat_info.pdb
│ │ │ │ │ ├── ref
│ │ │ │ │ │ └── mcp_get_chat_info.dll
│ │ │ │ │ └── refint
│ │ │ │ │ └── mcp_get_chat_info.dll
│ │ │ │ ├── mcp_get_chat_info.csproj.nuget.dgspec.json
│ │ │ │ ├── mcp_get_chat_info.csproj.nuget.g.props
│ │ │ │ ├── mcp_get_chat_info.csproj.nuget.g.targets
│ │ │ │ ├── project.assets.json
│ │ │ │ └── project.nuget.cache
│ │ │ └── Program.cs
│ │ ├── 3.0 mcp_create_source
│ │ │ ├── bin
│ │ │ │ └── Debug
│ │ │ │ └── net9.0
│ │ │ │ ├── mcp_create_source.deps.json
│ │ │ │ ├── mcp_create_source.dll
│ │ │ │ ├── mcp_create_source.exe
│ │ │ │ ├── mcp_create_source.pdb
│ │ │ │ ├── mcp_create_source.runtimeconfig.json
│ │ │ │ └── Newtonsoft.Json.dll
│ │ │ ├── mcp_create_source.csproj
│ │ │ ├── obj
│ │ │ │ ├── Debug
│ │ │ │ │ └── net9.0
│ │ │ │ │ ├── .NETCoreApp,Version=v9.0.AssemblyAttributes.cs
│ │ │ │ │ ├── apphost.exe
│ │ │ │ │ ├── mcp_crea.CB4ED912.Up2Date
│ │ │ │ │ ├── mcp_create_source.AssemblyInfo.cs
│ │ │ │ │ ├── mcp_create_source.AssemblyInfoInputs.cache
│ │ │ │ │ ├── mcp_create_source.assets.cache
│ │ │ │ │ ├── mcp_create_source.csproj.AssemblyReference.cache
│ │ │ │ │ ├── mcp_create_source.csproj.CoreCompileInputs.cache
│ │ │ │ │ ├── mcp_create_source.csproj.FileListAbsolute.txt
│ │ │ │ │ ├── mcp_create_source.dll
│ │ │ │ │ ├── mcp_create_source.GeneratedMSBuildEditorConfig.editorconfig
│ │ │ │ │ ├── mcp_create_source.genruntimeconfig.cache
│ │ │ │ │ ├── mcp_create_source.GlobalUsings.g.cs
│ │ │ │ │ ├── mcp_create_source.pdb
│ │ │ │ │ ├── ref
│ │ │ │ │ │ └── mcp_create_source.dll
│ │ │ │ │ └── refint
│ │ │ │ │ └── mcp_create_source.dll
│ │ │ │ ├── mcp_create_source.csproj.nuget.dgspec.json
│ │ │ │ ├── mcp_create_source.csproj.nuget.g.props
│ │ │ │ ├── mcp_create_source.csproj.nuget.g.targets
│ │ │ │ ├── project.assets.json
│ │ │ │ └── project.nuget.cache
│ │ │ └── Program.cs
│ │ ├── 3.1 mcp_get_source
│ │ │ ├── bin
│ │ │ │ └── Debug
│ │ │ │ └── net9.0
│ │ │ │ ├── mcp_get_source.deps.json
│ │ │ │ ├── mcp_get_source.dll
│ │ │ │ ├── mcp_get_source.exe
│ │ │ │ ├── mcp_get_source.pdb
│ │ │ │ ├── mcp_get_source.runtimeconfig.json
│ │ │ │ └── Newtonsoft.Json.dll
│ │ │ ├── mcp_get_source.csproj
│ │ │ ├── obj
│ │ │ │ ├── Debug
│ │ │ │ │ └── net9.0
│ │ │ │ │ ├── .NETCoreApp,Version=v9.0.AssemblyAttributes.cs
│ │ │ │ │ ├── apphost.exe
│ │ │ │ │ ├── mcp_get_.4E61956F.Up2Date
│ │ │ │ │ ├── mcp_get_source.AssemblyInfo.cs
│ │ │ │ │ ├── mcp_get_source.AssemblyInfoInputs.cache
│ │ │ │ │ ├── mcp_get_source.assets.cache
│ │ │ │ │ ├── mcp_get_source.csproj.AssemblyReference.cache
│ │ │ │ │ ├── mcp_get_source.csproj.CoreCompileInputs.cache
│ │ │ │ │ ├── mcp_get_source.csproj.FileListAbsolute.txt
│ │ │ │ │ ├── mcp_get_source.dll
│ │ │ │ │ ├── mcp_get_source.GeneratedMSBuildEditorConfig.editorconfig
│ │ │ │ │ ├── mcp_get_source.genruntimeconfig.cache
│ │ │ │ │ ├── mcp_get_source.GlobalUsings.g.cs
│ │ │ │ │ ├── mcp_get_source.pdb
│ │ │ │ │ ├── ref
│ │ │ │ │ │ └── mcp_get_source.dll
│ │ │ │ │ └── refint
│ │ │ │ │ └── mcp_get_source.dll
│ │ │ │ ├── mcp_get_source.csproj.nuget.dgspec.json
│ │ │ │ ├── mcp_get_source.csproj.nuget.g.props
│ │ │ │ ├── mcp_get_source.csproj.nuget.g.targets
│ │ │ │ ├── project.assets.json
│ │ │ │ └── project.nuget.cache
│ │ │ └── Program.cs
│ │ ├── 3.2 mcp_list_sources
│ │ │ ├── bin
│ │ │ │ └── Debug
│ │ │ │ └── net9.0
│ │ │ │ ├── mcp_list_sources.deps.json
│ │ │ │ ├── mcp_list_sources.dll
│ │ │ │ ├── mcp_list_sources.exe
│ │ │ │ ├── mcp_list_sources.pdb
│ │ │ │ ├── mcp_list_sources.runtimeconfig.json
│ │ │ │ └── Newtonsoft.Json.dll
│ │ │ ├── mcp_list_sources.csproj
│ │ │ ├── obj
│ │ │ │ ├── Debug
│ │ │ │ │ └── net9.0
│ │ │ │ │ ├── .NETCoreApp,Version=v9.0.AssemblyAttributes.cs
│ │ │ │ │ ├── apphost.exe
│ │ │ │ │ ├── mcp_list_sources.AssemblyInfo.cs
│ │ │ │ │ ├── mcp_list_sources.AssemblyInfoInputs.cache
│ │ │ │ │ ├── mcp_list_sources.assets.cache
│ │ │ │ │ ├── mcp_list_sources.csproj.AssemblyReference.cache
│ │ │ │ │ ├── mcp_list_sources.csproj.CoreCompileInputs.cache
│ │ │ │ │ ├── mcp_list_sources.csproj.FileListAbsolute.txt
│ │ │ │ │ ├── mcp_list_sources.dll
│ │ │ │ │ ├── mcp_list_sources.GeneratedMSBuildEditorConfig.editorconfig
│ │ │ │ │ ├── mcp_list_sources.genruntimeconfig.cache
│ │ │ │ │ ├── mcp_list_sources.GlobalUsings.g.cs
│ │ │ │ │ ├── mcp_list_sources.pdb
│ │ │ │ │ ├── mcp_list.A720E197.Up2Date
│ │ │ │ │ ├── ref
│ │ │ │ │ │ └── mcp_list_sources.dll
│ │ │ │ │ └── refint
│ │ │ │ │ └── mcp_list_sources.dll
│ │ │ │ ├── mcp_list_sources.csproj.nuget.dgspec.json
│ │ │ │ ├── mcp_list_sources.csproj.nuget.g.props
│ │ │ │ ├── mcp_list_sources.csproj.nuget.g.targets
│ │ │ │ ├── project.assets.json
│ │ │ │ └── project.nuget.cache
│ │ │ └── Program.cs
│ │ ├── 3.3 mcp_edit_source
│ │ │ ├── bin
│ │ │ │ └── Debug
│ │ │ │ └── net9.0
│ │ │ │ ├── mcp_edit_source.deps.json
│ │ │ │ ├── mcp_edit_source.dll
│ │ │ │ ├── mcp_edit_source.exe
│ │ │ │ ├── mcp_edit_source.pdb
│ │ │ │ ├── mcp_edit_source.runtimeconfig.json
│ │ │ │ └── Newtonsoft.Json.dll
│ │ │ ├── mcp_edit_source.csproj
│ │ │ ├── obj
│ │ │ │ ├── Debug
│ │ │ │ │ └── net9.0
│ │ │ │ │ ├── .NETCoreApp,Version=v9.0.AssemblyAttributes.cs
│ │ │ │ │ ├── apphost.exe
│ │ │ │ │ ├── mcp_edit_source.AssemblyInfo.cs
│ │ │ │ │ ├── mcp_edit_source.AssemblyInfoInputs.cache
│ │ │ │ │ ├── mcp_edit_source.assets.cache
│ │ │ │ │ ├── mcp_edit_source.csproj.AssemblyReference.cache
│ │ │ │ │ ├── mcp_edit_source.csproj.CoreCompileInputs.cache
│ │ │ │ │ ├── mcp_edit_source.csproj.FileListAbsolute.txt
│ │ │ │ │ ├── mcp_edit_source.dll
│ │ │ │ │ ├── mcp_edit_source.GeneratedMSBuildEditorConfig.editorconfig
│ │ │ │ │ ├── mcp_edit_source.genruntimeconfig.cache
│ │ │ │ │ ├── mcp_edit_source.GlobalUsings.g.cs
│ │ │ │ │ ├── mcp_edit_source.pdb
│ │ │ │ │ ├── mcp_edit.7303BE3B.Up2Date
│ │ │ │ │ ├── ref
│ │ │ │ │ │ └── mcp_edit_source.dll
│ │ │ │ │ └── refint
│ │ │ │ │ └── mcp_edit_source.dll
│ │ │ │ ├── mcp_edit_source.csproj.nuget.dgspec.json
│ │ │ │ ├── mcp_edit_source.csproj.nuget.g.props
│ │ │ │ ├── mcp_edit_source.csproj.nuget.g.targets
│ │ │ │ ├── project.assets.json
│ │ │ │ └── project.nuget.cache
│ │ │ └── Program.cs
│ │ ├── 3.4 mcp_delete_source
│ │ │ ├── bin
│ │ │ │ └── Debug
│ │ │ │ └── net9.0
│ │ │ │ ├── mcp_delete_source.deps.json
│ │ │ │ ├── mcp_delete_source.dll
│ │ │ │ ├── mcp_delete_source.exe
│ │ │ │ ├── mcp_delete_source.pdb
│ │ │ │ ├── mcp_delete_source.runtimeconfig.json
│ │ │ │ └── Newtonsoft.Json.dll
│ │ │ ├── mcp_delete_source.csproj
│ │ │ ├── obj
│ │ │ │ ├── Debug
│ │ │ │ │ └── net9.0
│ │ │ │ │ ├── .NETCoreApp,Version=v9.0.AssemblyAttributes.cs
│ │ │ │ │ ├── apphost.exe
│ │ │ │ │ ├── mcp_dele.67DD13F9.Up2Date
│ │ │ │ │ ├── mcp_delete_source.AssemblyInfo.cs
│ │ │ │ │ ├── mcp_delete_source.AssemblyInfoInputs.cache
│ │ │ │ │ ├── mcp_delete_source.assets.cache
│ │ │ │ │ ├── mcp_delete_source.csproj.AssemblyReference.cache
│ │ │ │ │ ├── mcp_delete_source.csproj.CoreCompileInputs.cache
│ │ │ │ │ ├── mcp_delete_source.csproj.FileListAbsolute.txt
│ │ │ │ │ ├── mcp_delete_source.dll
│ │ │ │ │ ├── mcp_delete_source.GeneratedMSBuildEditorConfig.editorconfig
│ │ │ │ │ ├── mcp_delete_source.genruntimeconfig.cache
│ │ │ │ │ ├── mcp_delete_source.GlobalUsings.g.cs
│ │ │ │ │ ├── mcp_delete_source.pdb
│ │ │ │ │ ├── ref
│ │ │ │ │ │ └── mcp_delete_source.dll
│ │ │ │ │ └── refint
│ │ │ │ │ └── mcp_delete_source.dll
│ │ │ │ ├── mcp_delete_source.csproj.nuget.dgspec.json
│ │ │ │ ├── mcp_delete_source.csproj.nuget.g.props
│ │ │ │ ├── mcp_delete_source.csproj.nuget.g.targets
│ │ │ │ ├── project.assets.json
│ │ │ │ └── project.nuget.cache
│ │ │ └── Program.cs
│ │ ├── 4.0 mcp_list_groups
│ │ │ ├── bin
│ │ │ │ └── Debug
│ │ │ │ └── net9.0
│ │ │ │ ├── mcp_list_groups.deps.json
│ │ │ │ ├── mcp_list_groups.dll
│ │ │ │ ├── mcp_list_groups.exe
│ │ │ │ ├── mcp_list_groups.pdb
│ │ │ │ ├── mcp_list_groups.runtimeconfig.json
│ │ │ │ └── Newtonsoft.Json.dll
│ │ │ ├── mcp_list_groups.csproj
│ │ │ ├── obj
│ │ │ │ ├── Debug
│ │ │ │ │ └── net9.0
│ │ │ │ │ ├── .NETCoreApp,Version=v9.0.AssemblyAttributes.cs
│ │ │ │ │ ├── apphost.exe
│ │ │ │ │ ├── mcp_list_groups.AssemblyInfo.cs
│ │ │ │ │ ├── mcp_list_groups.AssemblyInfoInputs.cache
│ │ │ │ │ ├── mcp_list_groups.assets.cache
│ │ │ │ │ ├── mcp_list_groups.csproj.AssemblyReference.cache
│ │ │ │ │ ├── mcp_list_groups.csproj.CoreCompileInputs.cache
│ │ │ │ │ ├── mcp_list_groups.csproj.FileListAbsolute.txt
│ │ │ │ │ ├── mcp_list_groups.dll
│ │ │ │ │ ├── mcp_list_groups.GeneratedMSBuildEditorConfig.editorconfig
│ │ │ │ │ ├── mcp_list_groups.genruntimeconfig.cache
│ │ │ │ │ ├── mcp_list_groups.GlobalUsings.g.cs
│ │ │ │ │ ├── mcp_list_groups.pdb
│ │ │ │ │ ├── mcp_list.EBD5E0D2.Up2Date
│ │ │ │ │ ├── ref
│ │ │ │ │ │ └── mcp_list_groups.dll
│ │ │ │ │ └── refint
│ │ │ │ │ └── mcp_list_groups.dll
│ │ │ │ ├── mcp_list_groups.csproj.nuget.dgspec.json
│ │ │ │ ├── mcp_list_groups.csproj.nuget.g.props
│ │ │ │ ├── mcp_list_groups.csproj.nuget.g.targets
│ │ │ │ ├── project.assets.json
│ │ │ │ └── project.nuget.cache
│ │ │ └── Program.cs
│ │ ├── 4.1 mcp_store_group
│ │ │ ├── bin
│ │ │ │ └── Debug
│ │ │ │ └── net9.0
│ │ │ │ ├── mcp_store_group.deps.json
│ │ │ │ ├── mcp_store_group.dll
│ │ │ │ ├── mcp_store_group.exe
│ │ │ │ ├── mcp_store_group.pdb
│ │ │ │ ├── mcp_store_group.runtimeconfig.json
│ │ │ │ └── Newtonsoft.Json.dll
│ │ │ ├── mcp_store_group.csproj
│ │ │ ├── obj
│ │ │ │ ├── Debug
│ │ │ │ │ └── net9.0
│ │ │ │ │ ├── .NETCoreApp,Version=v9.0.AssemblyAttributes.cs
│ │ │ │ │ ├── apphost.exe
│ │ │ │ │ ├── mcp_stor.AFB4AA35.Up2Date
│ │ │ │ │ ├── mcp_store_group.AssemblyInfo.cs
│ │ │ │ │ ├── mcp_store_group.AssemblyInfoInputs.cache
│ │ │ │ │ ├── mcp_store_group.assets.cache
│ │ │ │ │ ├── mcp_store_group.csproj.AssemblyReference.cache
│ │ │ │ │ ├── mcp_store_group.csproj.CoreCompileInputs.cache
│ │ │ │ │ ├── mcp_store_group.csproj.FileListAbsolute.txt
│ │ │ │ │ ├── mcp_store_group.dll
│ │ │ │ │ ├── mcp_store_group.GeneratedMSBuildEditorConfig.editorconfig
│ │ │ │ │ ├── mcp_store_group.genruntimeconfig.cache
│ │ │ │ │ ├── mcp_store_group.GlobalUsings.g.cs
│ │ │ │ │ ├── mcp_store_group.pdb
│ │ │ │ │ ├── ref
│ │ │ │ │ │ └── mcp_store_group.dll
│ │ │ │ │ └── refint
│ │ │ │ │ └── mcp_store_group.dll
│ │ │ │ ├── mcp_store_group.csproj.nuget.dgspec.json
│ │ │ │ ├── mcp_store_group.csproj.nuget.g.props
│ │ │ │ ├── mcp_store_group.csproj.nuget.g.targets
│ │ │ │ ├── project.assets.json
│ │ │ │ └── project.nuget.cache
│ │ │ └── Program.cs
│ │ ├── 4.2 mcp_delete_group
│ │ │ ├── bin
│ │ │ │ └── Debug
│ │ │ │ └── net9.0
│ │ │ │ ├── mcp_delete_group.deps.json
│ │ │ │ ├── mcp_delete_group.dll
│ │ │ │ ├── mcp_delete_group.exe
│ │ │ │ ├── mcp_delete_group.pdb
│ │ │ │ ├── mcp_delete_group.runtimeconfig.json
│ │ │ │ └── Newtonsoft.Json.dll
│ │ │ ├── mcp_delete_group.csproj
│ │ │ ├── obj
│ │ │ │ ├── Debug
│ │ │ │ │ └── net9.0
│ │ │ │ │ ├── .NETCoreApp,Version=v9.0.AssemblyAttributes.cs
│ │ │ │ │ ├── apphost.exe
│ │ │ │ │ ├── mcp_dele.FE1C6298.Up2Date
│ │ │ │ │ ├── mcp_delete_group.AssemblyInfo.cs
│ │ │ │ │ ├── mcp_delete_group.AssemblyInfoInputs.cache
│ │ │ │ │ ├── mcp_delete_group.assets.cache
│ │ │ │ │ ├── mcp_delete_group.csproj.AssemblyReference.cache
│ │ │ │ │ ├── mcp_delete_group.csproj.CoreCompileInputs.cache
│ │ │ │ │ ├── mcp_delete_group.csproj.FileListAbsolute.txt
│ │ │ │ │ ├── mcp_delete_group.dll
│ │ │ │ │ ├── mcp_delete_group.GeneratedMSBuildEditorConfig.editorconfig
│ │ │ │ │ ├── mcp_delete_group.genruntimeconfig.cache
│ │ │ │ │ ├── mcp_delete_group.GlobalUsings.g.cs
│ │ │ │ │ ├── mcp_delete_group.pdb
│ │ │ │ │ ├── ref
│ │ │ │ │ │ └── mcp_delete_group.dll
│ │ │ │ │ └── refint
│ │ │ │ │ └── mcp_delete_group.dll
│ │ │ │ ├── mcp_delete_group.csproj.nuget.dgspec.json
│ │ │ │ ├── mcp_delete_group.csproj.nuget.g.props
│ │ │ │ ├── mcp_delete_group.csproj.nuget.g.targets
│ │ │ │ ├── project.assets.json
│ │ │ │ └── project.nuget.cache
│ │ │ └── Program.cs
│ │ ├── 5.0 mcp_store_user
│ │ │ ├── bin
│ │ │ │ └── Debug
│ │ │ │ └── net9.0
│ │ │ │ ├── mcp_store_user.deps.json
│ │ │ │ ├── mcp_store_user.dll
│ │ │ │ ├── mcp_store_user.exe
│ │ │ │ ├── mcp_store_user.pdb
│ │ │ │ ├── mcp_store_user.runtimeconfig.json
│ │ │ │ └── Newtonsoft.Json.dll
│ │ │ ├── mcp_store_user.csproj
│ │ │ ├── obj
│ │ │ │ ├── Debug
│ │ │ │ │ └── net9.0
│ │ │ │ │ ├── .NETCoreApp,Version=v9.0.AssemblyAttributes.cs
│ │ │ │ │ ├── apphost.exe
│ │ │ │ │ ├── mcp_stor.6C0F0C8A.Up2Date
│ │ │ │ │ ├── mcp_store_user.AssemblyInfo.cs
│ │ │ │ │ ├── mcp_store_user.AssemblyInfoInputs.cache
│ │ │ │ │ ├── mcp_store_user.assets.cache
│ │ │ │ │ ├── mcp_store_user.csproj.AssemblyReference.cache
│ │ │ │ │ ├── mcp_store_user.csproj.CoreCompileInputs.cache
│ │ │ │ │ ├── mcp_store_user.csproj.FileListAbsolute.txt
│ │ │ │ │ ├── mcp_store_user.dll
│ │ │ │ │ ├── mcp_store_user.GeneratedMSBuildEditorConfig.editorconfig
│ │ │ │ │ ├── mcp_store_user.genruntimeconfig.cache
│ │ │ │ │ ├── mcp_store_user.GlobalUsings.g.cs
│ │ │ │ │ ├── mcp_store_user.pdb
│ │ │ │ │ ├── ref
│ │ │ │ │ │ └── mcp_store_user.dll
│ │ │ │ │ └── refint
│ │ │ │ │ └── mcp_store_user.dll
│ │ │ │ ├── mcp_store_user.csproj.nuget.dgspec.json
│ │ │ │ ├── mcp_store_user.csproj.nuget.g.props
│ │ │ │ ├── mcp_store_user.csproj.nuget.g.targets
│ │ │ │ ├── project.assets.json
│ │ │ │ └── project.nuget.cache
│ │ │ └── Program.cs
│ │ ├── 5.1 mcp_edit_user
│ │ │ ├── bin
│ │ │ │ └── Debug
│ │ │ │ └── net9.0
│ │ │ │ ├── mcp_edit_user.deps.json
│ │ │ │ ├── mcp_edit_user.dll
│ │ │ │ ├── mcp_edit_user.exe
│ │ │ │ ├── mcp_edit_user.pdb
│ │ │ │ ├── mcp_edit_user.runtimeconfig.json
│ │ │ │ └── Newtonsoft.Json.dll
│ │ │ ├── mcp_edit_user.csproj
│ │ │ ├── obj
│ │ │ │ ├── Debug
│ │ │ │ │ └── net9.0
│ │ │ │ │ ├── .NETCoreApp,Version=v9.0.AssemblyAttributes.cs
│ │ │ │ │ ├── apphost.exe
│ │ │ │ │ ├── mcp_edit_user.AssemblyInfo.cs
│ │ │ │ │ ├── mcp_edit_user.AssemblyInfoInputs.cache
│ │ │ │ │ ├── mcp_edit_user.assets.cache
│ │ │ │ │ ├── mcp_edit_user.csproj.AssemblyReference.cache
│ │ │ │ │ ├── mcp_edit_user.csproj.CoreCompileInputs.cache
│ │ │ │ │ ├── mcp_edit_user.csproj.FileListAbsolute.txt
│ │ │ │ │ ├── mcp_edit_user.dll
│ │ │ │ │ ├── mcp_edit_user.GeneratedMSBuildEditorConfig.editorconfig
│ │ │ │ │ ├── mcp_edit_user.genruntimeconfig.cache
│ │ │ │ │ ├── mcp_edit_user.GlobalUsings.g.cs
│ │ │ │ │ ├── mcp_edit_user.pdb
│ │ │ │ │ ├── mcp_edit.94A30270.Up2Date
│ │ │ │ │ ├── ref
│ │ │ │ │ │ └── mcp_edit_user.dll
│ │ │ │ │ └── refint
│ │ │ │ │ └── mcp_edit_user.dll
│ │ │ │ ├── mcp_edit_user.csproj.nuget.dgspec.json
│ │ │ │ ├── mcp_edit_user.csproj.nuget.g.props
│ │ │ │ ├── mcp_edit_user.csproj.nuget.g.targets
│ │ │ │ ├── project.assets.json
│ │ │ │ └── project.nuget.cache
│ │ │ └── Program.cs
│ │ ├── 5.2 mcp_delete_user
│ │ │ ├── bin
│ │ │ │ └── Debug
│ │ │ │ └── net9.0
│ │ │ │ ├── mcp_delete_user.deps.json
│ │ │ │ ├── mcp_delete_user.dll
│ │ │ │ ├── mcp_delete_user.exe
│ │ │ │ ├── mcp_delete_user.pdb
│ │ │ │ ├── mcp_delete_user.runtimeconfig.json
│ │ │ │ └── Newtonsoft.Json.dll
│ │ │ ├── mcp_delete_user.csproj
│ │ │ ├── obj
│ │ │ │ ├── Debug
│ │ │ │ │ └── net9.0
│ │ │ │ │ ├── .NETCoreApp,Version=v9.0.AssemblyAttributes.cs
│ │ │ │ │ ├── apphost.exe
│ │ │ │ │ ├── mcp_dele.CEB7E33D.Up2Date
│ │ │ │ │ ├── mcp_delete_user.AssemblyInfo.cs
│ │ │ │ │ ├── mcp_delete_user.AssemblyInfoInputs.cache
│ │ │ │ │ ├── mcp_delete_user.assets.cache
│ │ │ │ │ ├── mcp_delete_user.csproj.AssemblyReference.cache
│ │ │ │ │ ├── mcp_delete_user.csproj.CoreCompileInputs.cache
│ │ │ │ │ ├── mcp_delete_user.csproj.FileListAbsolute.txt
│ │ │ │ │ ├── mcp_delete_user.dll
│ │ │ │ │ ├── mcp_delete_user.GeneratedMSBuildEditorConfig.editorconfig
│ │ │ │ │ ├── mcp_delete_user.genruntimeconfig.cache
│ │ │ │ │ ├── mcp_delete_user.GlobalUsings.g.cs
│ │ │ │ │ ├── mcp_delete_user.pdb
│ │ │ │ │ ├── ref
│ │ │ │ │ │ └── mcp_delete_user.dll
│ │ │ │ │ └── refint
│ │ │ │ │ └── mcp_delete_user.dll
│ │ │ │ ├── mcp_delete_user.csproj.nuget.dgspec.json
│ │ │ │ ├── mcp_delete_user.csproj.nuget.g.props
│ │ │ │ ├── mcp_delete_user.csproj.nuget.g.targets
│ │ │ │ ├── project.assets.json
│ │ │ │ └── project.nuget.cache
│ │ │ └── Program.cs
│ │ ├── Code Archiv
│ │ │ ├── mcp_chat.cs
│ │ │ ├── mcp_continue_chat.cs
│ │ │ ├── mcp_create_source.cs
│ │ │ ├── mcp_delete_group.cs
│ │ │ ├── mcp_delete_source.cs
│ │ │ ├── mcp_delete_user.cs
│ │ │ ├── mcp_edit_source.cs
│ │ │ ├── mcp_edit_user.cs
│ │ │ ├── mcp_get_chat_info.cs
│ │ │ ├── mcp_get_source.cs
│ │ │ ├── mcp_list_groups.cs
│ │ │ ├── mcp_list_sources.cs
│ │ │ ├── mcp_login.cs
│ │ │ ├── mcp_logout.cs
│ │ │ ├── mcp_store_group.cs
│ │ │ └── mcp_store_user.cs
│ │ └── README.md
│ ├── C++
│ │ ├── .vscode
│ │ │ └── launch.json
│ │ ├── 1.0 mcp_login
│ │ │ ├── MCPLoginClient.cpp
│ │ │ └── Non-TLS version
│ │ │ ├── MCPLoginClient.cpp
│ │ │ └── MCPLoginClient.exe
│ │ ├── 1.1 mcp_logout
│ │ │ ├── MCPLogoutClient.cpp
│ │ │ └── MCPLogoutClient.exe
│ │ ├── 2.0 mcp_chat
│ │ │ ├── MCPChatClient.cpp
│ │ │ └── MCPChatClient.exe
│ │ ├── 2.1 mcp_continue_chat
│ │ │ ├── MCPChatContinuationClient.cpp
│ │ │ └── MCPChatContinuationClient.exe
│ │ ├── 2.2 mcp_get_chat_info
│ │ │ ├── MCPGetChatInfoClient.cpp
│ │ │ └── MCPGetChatInfoClient.exe
│ │ ├── 3.0 mcp_create_source
│ │ │ ├── MCPCreateSourceClient.cpp
│ │ │ └── MCPCreateSourceClient.exe
│ │ ├── 3.1 mcp_get_source
│ │ │ ├── MCPGetSourceClient.cpp
│ │ │ └── MCPGetSourceClient.exe
│ │ ├── 3.2 mcp_list_sources
│ │ │ ├── MCPListSourcesClient.cpp
│ │ │ └── MCPListSourcesClient.exe
│ │ ├── 3.3 mcp_edit_source
│ │ │ ├── MCPEditSourceClient.cpp
│ │ │ └── MCPEditSourceClient.exe
│ │ ├── 3.4 mcp_delete_source
│ │ │ ├── MCPDeleteSourceClient.cpp
│ │ │ └── MCPDeleteSourceClient.exe
│ │ ├── 4.0 mcp_list_groups
│ │ │ ├── MCPListGroupsClient.cpp
│ │ │ └── MCPListGroupsClient.exe
│ │ ├── 4.1 mcp_store_group
│ │ │ ├── MCPStoreGroupClient.cpp
│ │ │ └── MCPStoreGroupClient.exe
│ │ ├── 4.2 mcp_delete_group
│ │ │ ├── MPCDeleteGroupClient.cpp
│ │ │ └── MPCDeleteGroupClient.exe
│ │ ├── 5.0 mcp_store_user
│ │ │ ├── MCPStoreUserClient.cpp
│ │ │ └── MCPStoreUserClient.exe
│ │ ├── 5.1 mcp_edit_user
│ │ │ ├── MCPEditUserClient.cpp
│ │ │ └── MCPEditUserClient.exe
│ │ ├── 5.2 mcp_delete_user
│ │ │ ├── MCPDeleteUserClient.cpp
│ │ │ └── MCPDeleteUserClient.exe
│ │ ├── 9.0 mcp_keygen
│ │ │ ├── MCPKeygenClient.cpp
│ │ │ └── MCPKeygenClient.exe
│ │ └── README.md
│ ├── Go
│ │ ├── 1.0 mcp_login
│ │ │ ├── go.mod
│ │ │ ├── MCPLoginClient.exe
│ │ │ └── MCPLoginClient.go
│ │ ├── 1.1 mcp_logout
│ │ │ ├── MCPLogoutClient.exe
│ │ │ └── MCPLogoutClient.go
│ │ ├── 2.0 mcp_chat
│ │ │ ├── MCPChatClient.exe
│ │ │ └── MCPChatClient.go
│ │ ├── 2.1 mcp_continue_chat
│ │ │ ├── MCPChatContinuationClient.exe
│ │ │ └── MCPChatContinuationClient.go
│ │ ├── 2.2 mcp_get_chat_info
│ │ │ ├── MCPGetChatInfoClient.exe
│ │ │ └── MCPGetChatInfoClient.go
│ │ ├── 3.0 mcp_create_source
│ │ │ ├── MCPCreateSourceClient.exe
│ │ │ └── MCPCreateSourceClient.go
│ │ ├── 3.1 mcp_get_source
│ │ │ ├── MCPGetSourceClient.exe
│ │ │ └── MCPGetSourceClient.go
│ │ ├── 3.2 mcp_list_sources
│ │ │ ├── MCPListSourcesClient.exe
│ │ │ └── MCPListSourcesClient.go
│ │ ├── 3.3 mcp_edit_source
│ │ │ ├── MCPEditSourceClient.exe
│ │ │ └── MCPEditSourceClient.go
│ │ ├── 3.4 mcp_delete_source
│ │ │ ├── MCPDeleteSourceClient.exe
│ │ │ └── MCPDeleteSourceClient.go
│ │ ├── 4.0 mcp_list_groups
│ │ │ ├── MCPListGroupsClient.exe
│ │ │ └── MCPListGroupsClient.go
│ │ ├── 4.1 mcp_store_group
│ │ │ ├── MCPStoreGroupClient.exe
│ │ │ └── MCPStoreGroupClient.go
│ │ ├── 4.2 mcp_delete_group
│ │ │ ├── MCPDeleteGroupClient.exe
│ │ │ └── MCPDeleteGroupClient.go
│ │ ├── 5.0 mcp_store_user
│ │ │ ├── MCPStoreUserClient.exe
│ │ │ └── MCPStoreUserClient.go
│ │ ├── 5.1 mcp_edit_user
│ │ │ ├── MCPEditUserClient.exe
│ │ │ └── MCPEditUserClient.go
│ │ ├── 5.2 mcp_delete_user
│ │ │ ├── MCPDeleteUserClient.exe
│ │ │ └── MCPDeleteUserClient.go
│ │ ├── 9.0 mcp_keygen
│ │ │ ├── MCPKeygenClient.exe
│ │ │ └── MCPKeygenClient.go
│ │ └── README.md
│ ├── Gradio
│ │ ├── Api.py
│ │ ├── config.json.example
│ │ ├── config.py
│ │ ├── favicon.ico
│ │ ├── file_tools
│ │ │ └── loader_factory.py
│ │ ├── language.py
│ │ ├── logos
│ │ │ ├── fsas.png
│ │ │ └── Logo_dark.svg
│ │ ├── main.py
│ │ ├── mcp_client.py
│ │ ├── mcp_servers
│ │ │ ├── arxiv
│ │ │ │ ├── arxiv-stdio.js
│ │ │ │ ├── package.json
│ │ │ │ ├── README.md
│ │ │ │ ├── requirements.txt
│ │ │ │ └── server_config.example.json
│ │ │ ├── demo-mcp-server
│ │ │ │ ├── demo-tools-sse.js
│ │ │ │ ├── demo-tools-stdio.js
│ │ │ │ └── tools
│ │ │ │ ├── assets.js
│ │ │ │ ├── calculator.js
│ │ │ │ └── weather.js
│ │ │ ├── filesystem
│ │ │ │ ├── Dockerfile
│ │ │ │ ├── index.ts
│ │ │ │ ├── package.json
│ │ │ │ ├── README.md
│ │ │ │ ├── test
│ │ │ │ │ └── new.txt
│ │ │ │ └── tsconfig.json
│ │ │ ├── moondream
│ │ │ │ └── server.py
│ │ │ ├── pgpt
│ │ │ │ ├── __init__.py
│ │ │ │ ├── Api.py
│ │ │ │ ├── config.json.example
│ │ │ │ ├── config.py
│ │ │ │ ├── language.py
│ │ │ │ ├── pyproject.toml
│ │ │ │ ├── README.md
│ │ │ │ └── server.py
│ │ │ ├── replicate_flux
│ │ │ │ └── server.py
│ │ │ └── sqlite
│ │ │ ├── .python-version
│ │ │ ├── Dockerfile
│ │ │ ├── pyproject.toml
│ │ │ ├── README.md
│ │ │ └── src
│ │ │ └── mcp_server_sqlite
│ │ │ ├── __init__.py
│ │ │ └── server.py
│ │ ├── messages
│ │ │ ├── __init__.py
│ │ │ ├── message_types
│ │ │ │ ├── __init__.py
│ │ │ │ ├── incrementing_id_message.py
│ │ │ │ ├── initialize_message.py
│ │ │ │ ├── json_rpc_message.py
│ │ │ │ ├── ping_message.py
│ │ │ │ ├── prompts_messages.py
│ │ │ │ ├── prompts_models.py
│ │ │ │ ├── resources_messages.py
│ │ │ │ └── tools_messages.py
│ │ │ ├── send_call_tool.py
│ │ │ ├── send_initialize_message.py
│ │ │ ├── send_message.py
│ │ │ ├── send_ping.py
│ │ │ ├── send_prompts.py
│ │ │ ├── send_resources.py
│ │ │ └── send_tools_list.py
│ │ ├── README.md
│ │ ├── requirements.txt
│ │ ├── server_config.json
│ │ ├── SourceManagement.py
│ │ ├── transport
│ │ │ ├── __init__.py
│ │ │ └── stdio
│ │ │ ├── __init__.py
│ │ │ ├── stdio_client.py
│ │ │ ├── stdio_server_parameters.py
│ │ │ └── stdio_server_shutdown.py
│ │ ├── tsconfig.json
│ │ └── UserManagement.py
│ ├── Java
│ │ ├── 1.0 mcp_login
│ │ │ ├── json-20241224.jar
│ │ │ ├── MCPLoginClient.class
│ │ │ └── MCPLoginClient.java
│ │ ├── 1.1 mcp_logout
│ │ │ ├── json-20241224.jar
│ │ │ ├── MCPLogoutClient.class
│ │ │ └── MCPLogoutClient.java
│ │ ├── 2.0 mcp_chat
│ │ │ ├── json-20241224.jar
│ │ │ ├── MCPChatClient.class
│ │ │ └── MCPChatClient.java
│ │ ├── 2.1 mcp_continue_chat
│ │ │ ├── json-20241224.jar
│ │ │ ├── MCPContinueChatClient.class
│ │ │ └── MCPContinueChatClient.java
│ │ ├── 2.2 mcp_get_chat_info
│ │ │ ├── json-20241224.jar
│ │ │ ├── MCPGetChatInfoClient.class
│ │ │ └── MCPGetChatInfoClient.java
│ │ ├── 3.0 mcp_create_source
│ │ │ ├── json-20241224.jar
│ │ │ ├── MCPCreateSourceClient.class
│ │ │ └── MCPCreateSourceClient.java
│ │ ├── 3.1 mcp_get_source
│ │ │ ├── json-20241224.jar
│ │ │ ├── MCPGetSourceClient.class
│ │ │ └── MCPGetSourceClient.java
│ │ ├── 3.2 mcp_list_sources
│ │ │ ├── json-20241224.jar
│ │ │ ├── MCPListSourcesClient.class
│ │ │ └── MCPListSourcesClient.java
│ │ ├── 3.3 mcp_edit_source
│ │ │ ├── json-20241224.jar
│ │ │ ├── MCPEditSourceClient.class
│ │ │ └── MCPEditSourceClient.java
│ │ ├── 3.4 mcp_delete_source
│ │ │ ├── json-20241224.jar
│ │ │ ├── MCPDeleteSourceClient.class
│ │ │ └── MCPDeleteSourceClient.java
│ │ ├── 4.0 mcp_list_groups
│ │ │ ├── json-20241224.jar
│ │ │ ├── MCPListGroupsClient.class
│ │ │ └── MCPListGroupsClient.java
│ │ ├── 4.1 mcp_store_group
│ │ │ ├── json-20241224.jar
│ │ │ ├── MCPStoreGroupClient.class
│ │ │ └── MCPStoreGroupClient.java
│ │ ├── 4.2 mcp_delete_group
│ │ │ ├── json-20241224.jar
│ │ │ ├── MCPDeleteGroupClient.class
│ │ │ └── MCPDeleteGroupClient.java
│ │ ├── 5.0 mcp_store_user
│ │ │ ├── json-20241224.jar
│ │ │ ├── MCPStoreUserClient.class
│ │ │ └── MCPStoreUserClient.java
│ │ ├── 5.1 mcp_edit_user
│ │ │ ├── json-20241224.jar
│ │ │ ├── MCPEditUserClient.class
│ │ │ └── MCPEditUserClient.java
│ │ ├── 5.2 mcp_delete_user
│ │ │ ├── json-20241224.jar
│ │ │ ├── MCPDeleteUserClient.class
│ │ │ └── MCPDeleteUserClient.java
│ │ └── README.md
│ ├── JavaScript
│ │ ├── 1.0 mcp_login
│ │ │ └── MCPLoginClient.js
│ │ ├── 1.1 mcp_logout
│ │ │ └── MCPLogoutClient.js
│ │ ├── 2.0 mcp_chat
│ │ │ └── MCPChatClient.js
│ │ ├── 2.1 mcp_continue_chat
│ │ │ └── MCPContinueChatClient.js
│ │ ├── 2.2 mcp_get_chat_info
│ │ │ └── MCPGetChatInfoClient.js
│ │ ├── 3.0 mcp_create_source
│ │ │ └── MCPCreateSourceClient.js
│ │ ├── 3.1 mcp_get_source
│ │ │ └── MCPGetSourceClient.js
│ │ ├── 3.2 mcp_list_sources
│ │ │ └── MCPListSourcesClient.js
│ │ ├── 3.3 mcp_edit_source
│ │ │ └── MCPEditSourceClient.js
│ │ ├── 3.4 mcp_delete_source
│ │ │ └── MCPDeleteSourceClient.js
│ │ ├── 4.0 mcp_list_groups
│ │ │ └── MCPListGroupsClient.js
│ │ ├── 4.1 mcp_store_group
│ │ │ └── MCPStoreGroupClient.js
│ │ ├── 4.2 mcp_delete_group
│ │ │ └── MCPDeleteGroupClient.js
│ │ ├── 5.0 mcp_store_user
│ │ │ └── MCPStoreUserClient.js
│ │ ├── 5.1 mcp_edit_user
│ │ │ └── MCPEditUserClient.js
│ │ ├── 5.2 mcp_delete_user
│ │ │ └── MCPDeleteUserClient.js
│ │ ├── 9.0 mcp_keygen
│ │ │ └── MCPKeygenClient.js
│ │ └── README.md
│ ├── PHP
│ │ ├── 1.0 mcp_login
│ │ │ └── MCPLoginClient.php
│ │ ├── 1.1 mcp_logout
│ │ │ └── MCPLogoutClient.php
│ │ ├── 2.0 mcp_chat
│ │ │ └── MCPChatClient.php
│ │ ├── 2.1 mcp_continue_chat
│ │ │ └── MCPContinueChatClient.php
│ │ ├── 2.2 mcp_get_chat_info
│ │ │ └── MCPGetChatInfoClient.php
│ │ ├── 3.0 mcp_create_source
│ │ │ └── MCPCreateSourceClient.php
│ │ ├── 3.1 mcp_get_source
│ │ │ └── MCPGetSourceClient.php
│ │ ├── 3.2 mcp_list_sources
│ │ │ └── MCPListSourcesClient.php
│ │ ├── 3.3 mcp_edit_source
│ │ │ └── MCPEditSourceClient.php
│ │ ├── 3.4 mcp_delete_source
│ │ │ └── MCPDeleteSourceClient.php
│ │ ├── 4.0 mcp_list_groups
│ │ │ └── MCPListGroupsClient.php
│ │ ├── 4.1 mcp_store_group
│ │ │ └── MCPStoreGroupClient.php
│ │ ├── 4.2 mcp_delete_group
│ │ │ └── MCPDeleteGroupClient.php
│ │ ├── 5.0 mcp_store_user
│ │ │ └── MCPStoreUserClient.php
│ │ ├── 5.1 mcp_edit_user
│ │ │ └── MCPEditUserClient.php
│ │ ├── 5.2 mcp_delete_user
│ │ │ └── MCPDeleteUserClient.php
│ │ ├── 9.0 mcp_keygen
│ │ │ └── MCPKeygenClient.php
│ │ └── README.md
│ └── Python
│ ├── __init__.py
│ ├── 1.0 mcp_login
│ │ └── MCPLoginClient.py
│ ├── 1.1 mcp_logout
│ │ └── MCPLogoutClient.py
│ ├── 2.0 mcp_chat
│ │ └── MCPChatClient.py
│ ├── 2.1 mcp_continue_chat
│ │ └── MCPContinueChatClient.py
│ ├── 2.2 mcp_get_chat_info
│ │ └── MCPGetChatInfoClient.py
│ ├── 2.3 mcp_delete_all_chats
│ │ └── MCPDeleteAllChatsClient.py
│ ├── 2.4 mcp_delete_chat
│ │ └── MCPDeleteChatClient.py
│ ├── 3.0 mcp_create_source
│ │ └── MCPCreateSourceClient.py
│ ├── 3.1 mcp_get_source
│ │ └── MCPGetSourceClient.py
│ ├── 3.2 mcp_list_sources
│ │ └── MCPListSourcesClient.py
│ ├── 3.3 mcp_edit_source
│ │ └── MCPEditSourceClient.py
│ ├── 3.4 mcp_delete_source
│ │ └── MCPDeleteSourceClient.py
│ ├── 4.0 mcp_list_groups
│ │ └── MCPListGroupsClient.py
│ ├── 4.1 mcp_store_group
│ │ └── MCPStoreGroupClient.py
│ ├── 4.2 mcp_delete_group
│ │ └── MCPDeleteGroupClient.py
│ ├── 5.0 mcp_store_user
│ │ └── MCPStoreUserClient.py
│ ├── 5.1 mcp_edit_user
│ │ └── MCPEditUserClient.py
│ ├── 5.2 mcp_delete_user
│ │ └── MCPDeleteUserClient.py
│ ├── 9.0 mcp_keygen
│ │ └── MCPKeygenClient.py
│ ├── Gradio
│ │ ├── __init__.py
│ │ └── server_config.json
│ └── README.md
├── examples
│ ├── create_users_from_csv
│ │ ├── config.json.example
│ │ ├── config.py
│ │ ├── create_users_from_csv.py
│ │ └── language.py
│ ├── dynamic_sources
│ │ └── rss_reader
│ │ ├── Api.py
│ │ ├── config.json.example
│ │ ├── config.py
│ │ ├── demo_dynamic_sources.py
│ │ └── rss_parser.py
│ ├── example_users_to_add_no_tz.csv
│ └── sftp_upload_with_id
│ ├── Api.py
│ ├── config_ftp.json.example
│ ├── config.py
│ ├── demo_upload.py
│ ├── language.py
│ └── requirements.txt
├── images
│ ├── alternative mcp client.png
│ ├── favicon
│ │ ├── android-chrome-192x192.png
│ │ ├── android-chrome-512x512.png
│ │ ├── apple-touch-icon.png
│ │ ├── favicon-16x16.png
│ │ ├── favicon-32x32.png
│ │ ├── favicon.ico
│ │ └── site.webmanifest
│ ├── mcp-general-architecture.png
│ ├── privateGPT-MCP.png
│ └── privateGPT.png
├── InstallMPCServer.sh
├── jest.config.js
├── LICENSE
├── package.json
├── pgpt.env.json.example
├── README.md
├── security
│ ├── generate_decrypted_password.js
│ └── generate_encrypted_password.js
├── src
│ ├── helper.js
│ ├── index.js
│ ├── logger.js
│ ├── pgpt-messages.js
│ ├── public
│ │ ├── index.html
│ │ └── pgpt-mcp-logo.png
│ ├── services
│ │ └── pgpt-service.ts
│ └── types
│ └── api.ts
├── start_chatbot_agent.ps1
├── start_chatbot_agent.sh
├── start_iot_agent.ps1
├── start_iot_agent.sh
├── start_openai_compatible_api_agent.ps1
├── start_openai_compatible_api_agent.sh
├── tsconfig.json
├── ver
│ ├── index_np.js
│ └── index_proxy_np.js
└── WORKLOG.md
```
# Files
--------------------------------------------------------------------------------
/agents/AgentInterface/Python/network.py:
--------------------------------------------------------------------------------
```python
1 | import socket
2 | import ssl
3 | import json
4 | import logging
5 | import time
6 | from .language import languages
7 |
8 | class NetworkError(Exception):
9 | pass
10 |
11 | class NetworkClient:
12 | def __init__(
13 | self, server_ip, server_port, language="en",
14 | retries=3, delay=5, use_ssl=True, accept_self_signed=True
15 | ):
16 | self.server_ip = server_ip
17 | self.server_port = server_port
18 | self.retries = retries
19 | self.delay = delay
20 | self.use_ssl = use_ssl
21 | self.accept_self_signed = accept_self_signed
22 | self.language = language if language in languages else "en"
23 | self.lang = languages[self.language]
24 |
25 | def get_lang_message(self, key, **kwargs):
26 | """
27 | Secure method to retrieve messages from the language dictionary.
28 | Returns a default message if the key does not exist.
29 | """
30 | message = self.lang.get(key, "Message not defined.")
31 | utf8_encoded_string = bytes(message, 'utf-8')
32 | message = str(utf8_encoded_string, 'utf-8')
33 | try:
34 | return message.format(**kwargs)
35 | except KeyError as e:
36 | logging.error(f"Missing placeholder in language file for key '{key}': {e}")
37 | return message
38 |
39 | def send_request(self, payload):
40 | payload_json = json.dumps(payload)
41 | #logging.info(f"Prepared payload: {payload_json}")
42 |
43 | for attempt in range(1, self.retries + 1):
44 | client_socket = None
45 | try:
46 | raw_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
47 | raw_socket.settimeout(30)
48 |
49 | logging.info(
50 | self.get_lang_message(
51 | "connecting_to_server",
52 | ip=self.server_ip,
53 | port=self.server_port,
54 | attempt=attempt,
55 | retries=self.retries
56 | )
57 | )
58 |
59 | # SSL/TLS initialisieren (falls gewünscht)
60 | if self.use_ssl:
61 | context = ssl.create_default_context()
62 | if self.accept_self_signed:
63 | context.check_hostname = False
64 | context.verify_mode = ssl.CERT_NONE
65 | client_socket = context.wrap_socket(raw_socket, server_hostname=self.server_ip)
66 | else:
67 | client_socket = raw_socket
68 |
69 | # Verbinden
70 | client_socket.connect((self.server_ip, self.server_port))
71 | logging.info(self.get_lang_message("connection_established"))
72 |
73 | # Anfrage senden
74 | #logging.info(
75 | # self.get_lang_message(
76 | # "sending_payload",
77 | # payload=payload_json
78 | # )
79 | #)
80 | client_socket.sendall((payload_json + '\n').encode("utf-8"))
81 |
82 | # Alle Daten empfangen, bis Server von sich aus schließt oder Timeout
83 | response = b""
84 | while True:
85 | try:
86 | part = client_socket.recv(4096)
87 | if not part:
88 | # Keine Daten mehr -> Server hat Verbindung geschlossen
89 | break
90 | response += part
91 | except socket.timeout:
92 | # Wenn wir hier sicher sind, dass keine weiteren Daten mehr kommen,
93 | # kann man das Lesen beenden. Oder retry. Je nach Protokoll.
94 | logging.warning(self.get_lang_message("connection_timed_out"))
95 | break
96 |
97 | decoded = response.decode("utf-8").strip()
98 | #logging.info(f"Received response: {decoded}")
99 |
100 | if not decoded:
101 | raise ValueError("Empty response received")
102 |
103 | # JSON parsen
104 | try:
105 | parsed_response = json.loads(decoded)
106 | logging.info(
107 | self.get_lang_message("formatted_response"),
108 | extra={"data": parsed_response}
109 | )
110 |
111 | if "data" in parsed_response and "personalGroups" in parsed_response["data"]:
112 | personal_groups = parsed_response["data"]["personalGroups"]
113 | logging.info(
114 | self.get_lang_message("personal_groups_received", groups=personal_groups)
115 | )
116 |
117 | # Erfolgreich -> Socket normal schließen und Ergebnis zurückgeben
118 | client_socket.close()
119 | return parsed_response
120 |
121 | except json.JSONDecodeError:
122 | logging.error(self.get_lang_message("invalid_json_response"))
123 | raise NetworkError(self.get_lang_message("invalid_json_response"))
124 |
125 | except socket.timeout:
126 | logging.warning(self.get_lang_message("connection_timed_out"))
127 | except Exception as e:
128 | logging.error(
129 | self.get_lang_message(
130 | "connection_error",
131 | error=str(e)
132 | )
133 | )
134 |
135 | # Bei Misserfolg (und wenn noch Versuche übrig): warten, neu versuchen
136 | if attempt < self.retries:
137 | logging.info(
138 | self.get_lang_message(
139 | "retrying_in_seconds",
140 | delay=self.delay
141 | )
142 | )
143 | time.sleep(self.delay)
144 |
145 | # Socket schließen (wenn noch offen), kein shutdown(SHUT_RDWR) verwenden
146 | if client_socket is not None:
147 | try:
148 | client_socket.close()
149 | except:
150 | pass
151 |
152 | # Nach allen Versuchen fehlgeschlagen
153 | logging.error(self.get_lang_message("all_retries_failed"))
154 | raise NetworkError(self.get_lang_message("all_retries_failed"))
155 |
```
--------------------------------------------------------------------------------
/clients/PHP/4.0 mcp_list_groups/MCPListGroupsClient.php:
--------------------------------------------------------------------------------
```php
1 | <?php
2 | /**
3 | * MCPListGroupsClient.php
4 | *
5 | * A PHP script acting as a List Groups Client. It connects to a server via TCP,
6 | * sends a request to list groups, and receives the server's response.
7 | *
8 | * Usage:
9 | * php MCPListGroupsClient.php --server-ip <IP> --server-port <Port> --token <Token>
10 | */
11 |
12 | /**
13 | * Function to parse command line arguments
14 | *
15 | * @param array $args Command line arguments
16 | * @return array Associative array of parsed arguments
17 | */
18 | function parseArguments($args) {
19 | $parsedArgs = [];
20 | $argc = count($args);
21 | for ($i = 1; $i < $argc; $i++) {
22 | switch ($args[$i]) {
23 | case '--server-ip':
24 | if (isset($args[$i + 1]) && !startsWith($args[$i + 1], '--')) {
25 | $parsedArgs['serverIp'] = $args[++$i];
26 | } else {
27 | fwrite(STDERR, "Error: --server-ip expects a value.\n");
28 | exit(1);
29 | }
30 | break;
31 | case '--server-port':
32 | if (isset($args[$i + 1]) && !startsWith($args[$i + 1], '--')) {
33 | $parsedArgs['serverPort'] = intval($args[++$i]);
34 | } else {
35 | fwrite(STDERR, "Error: --server-port expects a value.\n");
36 | exit(1);
37 | }
38 | break;
39 | case '--token':
40 | if (isset($args[$i + 1]) && !startsWith($args[$i + 1], '--')) {
41 | $parsedArgs['token'] = $args[++$i];
42 | } else {
43 | fwrite(STDERR, "Error: --token expects a value.\n");
44 | exit(1);
45 | }
46 | break;
47 | default:
48 | fwrite(STDERR, "⚠️ Warning: Unknown argument: {$args[$i]}\n");
49 | }
50 | }
51 | return $parsedArgs;
52 | }
53 |
54 | /**
55 | * Helper function to check if a string starts with a specific prefix
56 | *
57 | * @param string $string The string to check
58 | * @param string $prefix The prefix
59 | * @return bool True if the string starts with the prefix, otherwise False
60 | */
61 | function startsWith($string, $prefix) {
62 | return substr($string, 0, strlen($prefix)) === $prefix;
63 | }
64 |
65 | /**
66 | * Function for interactively prompting a parameter (optional)
67 | *
68 | * @param string $prompt The prompt message
69 | * @return string User input
70 | */
71 | function askQuestionPrompt($prompt) {
72 | if (preg_match('/^win/i', PHP_OS)) {
73 | $vbscript = sys_get_temp_dir() . 'prompt_input.vbs';
74 | file_put_contents($vbscript, 'wscript.echo(InputBox("' . addslashes($prompt) . '", "", ""))');
75 | $response = shell_exec("cscript //nologo " . escapeshellarg($vbscript));
76 | unlink($vbscript);
77 | return trim($response);
78 | } else {
79 | echo $prompt;
80 | $handle = fopen("php://stdin", "r");
81 | $response = trim(fgets($handle));
82 | fclose($handle);
83 | return $response;
84 | }
85 | }
86 |
87 | /**
88 | * Function to send a generic request over a TCP connection
89 | *
90 | * @param string $serverIp The server's IP address
91 | * @param int $serverPort The server's port
92 | * @param array $payload The payload to send as an associative array
93 | * @return array The response received from the server as an associative array
94 | * @throws Exception On connection errors or JSON parsing errors
95 | */
96 | function sendRequest($serverIp, $serverPort, $payload) {
97 | $jsonPayload = json_encode($payload);
98 | if ($jsonPayload === false) {
99 | throw new Exception("Error while coding the JSON payload: " . json_last_error_msg());
100 | }
101 |
102 | $errno = 0;
103 | $errstr = '';
104 | $timeoutDuration = 10; // Seconds
105 | $client = @fsockopen($serverIp, $serverPort, $errno, $errstr, $timeoutDuration);
106 |
107 | if (!$client) {
108 | throw new Exception("Connection error: $errstr ($errno)");
109 | }
110 |
111 | echo "🔗 Connected to the server ({$serverIp}:{$serverPort}).\n";
112 | echo "📤 Sending payload: $jsonPayload\n";
113 |
114 | fwrite($client, $jsonPayload);
115 |
116 | $responseData = '';
117 | stream_set_timeout($client, $timeoutDuration);
118 |
119 | while (!feof($client)) {
120 | $data = fread($client, 1024);
121 | if ($data === false) {
122 | throw new Exception("Error reading data from the server.");
123 | }
124 | if ($data === '') {
125 | break; // No more data
126 | }
127 | echo "📥 Received data: $data\n";
128 | $responseData .= $data;
129 |
130 | $parsedData = json_decode($responseData, true);
131 | if ($parsedData !== null) {
132 | echo "✅ JSON response successfully parsed.\n";
133 | fclose($client);
134 | return $parsedData;
135 | }
136 |
137 | $info = stream_get_meta_data($client);
138 | if ($info['timed_out']) {
139 | throw new Exception("Timeout waiting for data from the server.");
140 | }
141 | }
142 |
143 | fclose($client);
144 | throw new Exception("Connection to the server was closed before a complete response was received.");
145 | }
146 |
147 | /**
148 | * Main function of the script
149 | */
150 | function main($argv) {
151 | $parsedArgs = parseArguments($argv);
152 | $serverIp = $parsedArgs['serverIp'] ?? null;
153 | $serverPort = $parsedArgs['serverPort'] ?? null;
154 | $token = $parsedArgs['token'] ?? null;
155 |
156 | if (!$serverIp) {
157 | $serverIp = askQuestionPrompt('🔗 Please enter the server IP: ');
158 | }
159 | if (!$serverPort) {
160 | $portInput = askQuestionPrompt('🔗 Please enter the server port: ');
161 | $serverPort = intval($portInput);
162 | if ($serverPort <= 0) {
163 | fwrite(STDERR, "❌ ERROR: Invalid server port.\n");
164 | exit(1);
165 | }
166 | }
167 | if (!$token) {
168 | $token = askQuestionPrompt('🔒 Please enter your authentication token: ');
169 | }
170 |
171 | if (!$serverIp || !$serverPort || !$token) {
172 | fwrite(STDERR, "❌ ERROR: Missing required parameters.\n");
173 | fwrite(STDOUT, "Usage: php MCPListGroupsClient.php --server-ip <IP> --server-port <Port> --token <Token>\n");
174 | exit(1);
175 | }
176 |
177 | $payload = [
178 | "command" => "list_groups",
179 | "token" => $token
180 | ];
181 |
182 | try {
183 | echo "📄 Retrieving groups...\n";
184 | $response = sendRequest($serverIp, $serverPort, $payload);
185 | echo "✔️ Response:\n";
186 | echo json_encode($response, JSON_PRETTY_PRINT) . "\n";
187 | } catch (Exception $e) {
188 | fwrite(STDERR, "❌ ERROR: " . $e->getMessage() . "\n");
189 | }
190 | }
191 |
192 | if (version_compare(PHP_VERSION, '7.1.0') < 0) {
193 | fwrite(STDERR, "❌ ERROR: This script requires PHP version 7.1 or higher.\n");
194 | exit(1);
195 | }
196 |
197 | main($argv);
198 | ?>
199 |
```
--------------------------------------------------------------------------------
/clients/C# .Net/3.3 mcp_edit_source/Program.cs:
--------------------------------------------------------------------------------
```csharp
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Net.Sockets;
5 | using System.Text;
6 | using Newtonsoft.Json;
7 |
8 | namespace MCPEditSourceClient
9 | {
10 | class Program
11 | {
12 | static void Main(string[] args)
13 | {
14 | // Parameterprüfung (mind. 8 Elemente, weil 4 Pflichtargumente:
15 | // --server-ip, --server-port, --token, --source-id)
16 | // plus optionale Argumente (--title, --content, --groups).
17 | if (args.Length < 8)
18 | {
19 | Console.WriteLine("Usage:");
20 | Console.WriteLine(" --server-ip <IP> --server-port <PORT> --token <TOKEN> --source-id <SOURCE_ID>");
21 | Console.WriteLine(" [--title <TITLE>] [--content <CONTENT>] [--groups <LIST_OF_GROUPS>]");
22 | return;
23 | }
24 |
25 | // Argumente auslesen
26 | string serverIp = GetArgument(args, "--server-ip");
27 | string portStr = GetArgument(args, "--server-port");
28 | string token = GetArgument(args, "--token");
29 | string sourceId = GetArgument(args, "--source-id");
30 | string title = GetArgument(args, "--title");
31 | string content = GetArgument(args, "--content");
32 | List<string> groups = GetListArgument(args, "--groups");
33 |
34 | if (serverIp == null || portStr == null || token == null || sourceId == null)
35 | {
36 | Console.WriteLine("Fehler: Mindestens eines der Pflichtargumente wurde nicht angegeben.");
37 | return;
38 | }
39 |
40 | if (!int.TryParse(portStr, out int serverPort))
41 | {
42 | Console.WriteLine("Fehler: --server-port muss eine ganzzahlige Portangabe sein.");
43 | return;
44 | }
45 |
46 | // Anfrage an den Server senden
47 | string response = SendEditSourceRequest(
48 | serverIp,
49 | serverPort,
50 | token,
51 | sourceId,
52 | title,
53 | content,
54 | groups
55 | );
56 |
57 | Console.WriteLine("Response from server:");
58 | Console.WriteLine(response);
59 | }
60 |
61 | /// <summary>
62 | /// Sendet die Edit-Source-Anfrage an den MCP-Server.
63 | /// </summary>
64 | /// <param name="serverIp">IP-Adresse des MCP-Servers</param>
65 | /// <param name="serverPort">Port des MCP-Servers</param>
66 | /// <param name="token">Authentifizierungstoken</param>
67 | /// <param name="sourceId">ID der zu bearbeitenden Quelle</param>
68 | /// <param name="title">Neuer Titel der Quelle (optional)</param>
69 | /// <param name="content">Neuer Inhalt (Markdown) (optional)</param>
70 | /// <param name="groups">Liste der neuen Gruppen (optional)</param>
71 | /// <returns>String-Antwort des Servers oder Fehlermeldung</returns>
72 | static string SendEditSourceRequest(
73 | string serverIp,
74 | int serverPort,
75 | string token,
76 | string sourceId,
77 | string title = null,
78 | string content = null,
79 | List<string> groups = null)
80 | {
81 | // Payload zusammenbauen
82 | var arguments = new Dictionary<string, object>
83 | {
84 | { "sourceId", sourceId }
85 | };
86 |
87 | // Nur hinzufügen, wenn nicht null
88 | if (!string.IsNullOrWhiteSpace(title))
89 | arguments["title"] = title;
90 |
91 | if (!string.IsNullOrWhiteSpace(content))
92 | arguments["content"] = content;
93 |
94 | // Falls keine Gruppen übergeben wurden, leere Liste setzen
95 | arguments["groups"] = groups ?? new List<string>();
96 |
97 | // Payload-Objekt erstellen
98 | var payload = new
99 | {
100 | command = "edit_source",
101 | token = token,
102 | arguments
103 | };
104 |
105 | // JSON serialisieren
106 | string payloadJson = JsonConvert.SerializeObject(payload);
107 |
108 | // Per TCP an den Server senden
109 | try
110 | {
111 | using (var client = new TcpClient(serverIp, serverPort))
112 | using (NetworkStream stream = client.GetStream())
113 | {
114 | // Senden
115 | byte[] data = Encoding.UTF8.GetBytes(payloadJson);
116 | stream.Write(data, 0, data.Length);
117 |
118 | // Antwort empfangen
119 | byte[] buffer = new byte[4096];
120 | int bytesRead;
121 | StringBuilder responseBuilder = new StringBuilder();
122 |
123 | do
124 | {
125 | bytesRead = stream.Read(buffer, 0, buffer.Length);
126 | responseBuilder.Append(Encoding.UTF8.GetString(buffer, 0, bytesRead));
127 | } while (bytesRead == buffer.Length);
128 |
129 | return responseBuilder.ToString();
130 | }
131 | }
132 | catch (Exception e)
133 | {
134 | return $"Error: {e.Message}";
135 | }
136 | }
137 |
138 | /// <summary>
139 | /// Liest den Wert eines bestimmten Keys aus args aus (z.B. --server-ip 127.0.0.1).
140 | /// </summary>
141 | /// <param name="args">Alle Argumente</param>
142 | /// <param name="key">Gesuchter Key (z.B. "--server-ip")</param>
143 | /// <returns>Wert des Keys oder null</returns>
144 | static string GetArgument(string[] args, string key)
145 | {
146 | int index = Array.IndexOf(args, key);
147 | return index >= 0 && index < args.Length - 1 ? args[index + 1] : null;
148 | }
149 |
150 | /// <summary>
151 | /// Liest eine Liste an Werten aus, die auf den key folgen (z.B. --groups G1 G2 --irgendeinAndererKey ...).
152 | /// </summary>
153 | /// <param name="args">Alle Argumente</param>
154 | /// <param name="key">Gesuchter Key (z.B. "--groups")</param>
155 | /// <returns>Liste gefundener Werte oder eine leere Liste</returns>
156 | static List<string> GetListArgument(string[] args, string key)
157 | {
158 | var result = new List<string>();
159 | int index = Array.IndexOf(args, key);
160 | if (index >= 0)
161 | {
162 | for (int i = index + 1; i < args.Length && !args[i].StartsWith("--"); i++)
163 | {
164 | result.Add(args[i]);
165 | }
166 | }
167 | return result;
168 | }
169 | }
170 | }
171 |
```
--------------------------------------------------------------------------------
/clients/C# .Net/Code Archiv/mcp_edit_source.cs:
--------------------------------------------------------------------------------
```csharp
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Net.Sockets;
5 | using System.Text;
6 | using Newtonsoft.Json;
7 |
8 | namespace MCPEditSourceClient
9 | {
10 | class Program
11 | {
12 | static void Main(string[] args)
13 | {
14 | // Parameterprüfung (mind. 8 Elemente, weil 4 Pflichtargumente:
15 | // --server-ip, --server-port, --token, --source-id)
16 | // plus optionale Argumente (--title, --content, --groups).
17 | if (args.Length < 8)
18 | {
19 | Console.WriteLine("Usage:");
20 | Console.WriteLine(" --server-ip <IP> --server-port <PORT> --token <TOKEN> --source-id <SOURCE_ID>");
21 | Console.WriteLine(" [--title <TITLE>] [--content <CONTENT>] [--groups <LIST_OF_GROUPS>]");
22 | return;
23 | }
24 |
25 | // Argumente auslesen
26 | string serverIp = GetArgument(args, "--server-ip");
27 | string portStr = GetArgument(args, "--server-port");
28 | string token = GetArgument(args, "--token");
29 | string sourceId = GetArgument(args, "--source-id");
30 | string title = GetArgument(args, "--title");
31 | string content = GetArgument(args, "--content");
32 | List<string> groups = GetListArgument(args, "--groups");
33 |
34 | if (serverIp == null || portStr == null || token == null || sourceId == null)
35 | {
36 | Console.WriteLine("Fehler: Mindestens eines der Pflichtargumente wurde nicht angegeben.");
37 | return;
38 | }
39 |
40 | if (!int.TryParse(portStr, out int serverPort))
41 | {
42 | Console.WriteLine("Fehler: --server-port muss eine ganzzahlige Portangabe sein.");
43 | return;
44 | }
45 |
46 | // Anfrage an den Server senden
47 | string response = SendEditSourceRequest(
48 | serverIp,
49 | serverPort,
50 | token,
51 | sourceId,
52 | title,
53 | content,
54 | groups
55 | );
56 |
57 | Console.WriteLine("Response from server:");
58 | Console.WriteLine(response);
59 | }
60 |
61 | /// <summary>
62 | /// Sendet die Edit-Source-Anfrage an den MCP-Server.
63 | /// </summary>
64 | /// <param name="serverIp">IP-Adresse des MCP-Servers</param>
65 | /// <param name="serverPort">Port des MCP-Servers</param>
66 | /// <param name="token">Authentifizierungstoken</param>
67 | /// <param name="sourceId">ID der zu bearbeitenden Quelle</param>
68 | /// <param name="title">Neuer Titel der Quelle (optional)</param>
69 | /// <param name="content">Neuer Inhalt (Markdown) (optional)</param>
70 | /// <param name="groups">Liste der neuen Gruppen (optional)</param>
71 | /// <returns>String-Antwort des Servers oder Fehlermeldung</returns>
72 | static string SendEditSourceRequest(
73 | string serverIp,
74 | int serverPort,
75 | string token,
76 | string sourceId,
77 | string title = null,
78 | string content = null,
79 | List<string> groups = null)
80 | {
81 | // Payload zusammenbauen
82 | var arguments = new Dictionary<string, object>
83 | {
84 | { "sourceId", sourceId }
85 | };
86 |
87 | // Nur hinzufügen, wenn nicht null
88 | if (!string.IsNullOrWhiteSpace(title))
89 | arguments["title"] = title;
90 |
91 | if (!string.IsNullOrWhiteSpace(content))
92 | arguments["content"] = content;
93 |
94 | // Falls keine Gruppen übergeben wurden, leere Liste setzen
95 | arguments["groups"] = groups ?? new List<string>();
96 |
97 | // Payload-Objekt erstellen
98 | var payload = new
99 | {
100 | command = "edit_source",
101 | token = token,
102 | arguments
103 | };
104 |
105 | // JSON serialisieren
106 | string payloadJson = JsonConvert.SerializeObject(payload);
107 |
108 | // Per TCP an den Server senden
109 | try
110 | {
111 | using (var client = new TcpClient(serverIp, serverPort))
112 | using (NetworkStream stream = client.GetStream())
113 | {
114 | // Senden
115 | byte[] data = Encoding.UTF8.GetBytes(payloadJson);
116 | stream.Write(data, 0, data.Length);
117 |
118 | // Antwort empfangen
119 | byte[] buffer = new byte[4096];
120 | int bytesRead;
121 | StringBuilder responseBuilder = new StringBuilder();
122 |
123 | do
124 | {
125 | bytesRead = stream.Read(buffer, 0, buffer.Length);
126 | responseBuilder.Append(Encoding.UTF8.GetString(buffer, 0, bytesRead));
127 | } while (bytesRead == buffer.Length);
128 |
129 | return responseBuilder.ToString();
130 | }
131 | }
132 | catch (Exception e)
133 | {
134 | return $"Error: {e.Message}";
135 | }
136 | }
137 |
138 | /// <summary>
139 | /// Liest den Wert eines bestimmten Keys aus args aus (z.B. --server-ip 127.0.0.1).
140 | /// </summary>
141 | /// <param name="args">Alle Argumente</param>
142 | /// <param name="key">Gesuchter Key (z.B. "--server-ip")</param>
143 | /// <returns>Wert des Keys oder null</returns>
144 | static string GetArgument(string[] args, string key)
145 | {
146 | int index = Array.IndexOf(args, key);
147 | return index >= 0 && index < args.Length - 1 ? args[index + 1] : null;
148 | }
149 |
150 | /// <summary>
151 | /// Liest eine Liste an Werten aus, die auf den key folgen (z.B. --groups G1 G2 --irgendeinAndererKey ...).
152 | /// </summary>
153 | /// <param name="args">Alle Argumente</param>
154 | /// <param name="key">Gesuchter Key (z.B. "--groups")</param>
155 | /// <returns>Liste gefundener Werte oder eine leere Liste</returns>
156 | static List<string> GetListArgument(string[] args, string key)
157 | {
158 | var result = new List<string>();
159 | int index = Array.IndexOf(args, key);
160 | if (index >= 0)
161 | {
162 | for (int i = index + 1; i < args.Length && !args[i].StartsWith("--"); i++)
163 | {
164 | result.Add(args[i]);
165 | }
166 | }
167 | return result;
168 | }
169 | }
170 | }
171 |
```
--------------------------------------------------------------------------------
/clients/Gradio/SourceManagement.py:
--------------------------------------------------------------------------------
```python
1 | import json
2 | import socket
3 | import ssl
4 |
5 |
6 | def delete_source(self, source_id, use_ssl=False, accept_self_signed=False):
7 | """
8 | Sends a request to the MCP server to delete an existing source.
9 |
10 | :param server_ip: IP address of the MCP server
11 | :param server_port: Port number of the MCP server
12 | :param token: Authorization token
13 | :param source_id: ID of the source to delete
14 | :param use_ssl: Whether to use SSL/TLS for the connection
15 | :param accept_self_signed: Whether to accept self-signed certificates
16 | :return: Response from the server
17 | """
18 | payload = {
19 | "command": "delete_source",
20 | "token": self.token,
21 | "arguments": {
22 | "sourceId": source_id
23 | }
24 | }
25 |
26 | payload_json = json.dumps(payload)
27 |
28 | raw_socket = None
29 | client_socket = None
30 |
31 | try:
32 | raw_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
33 | raw_socket.settimeout(10)
34 |
35 | if use_ssl:
36 | context = ssl.create_default_context()
37 | if accept_self_signed:
38 | context.check_hostname = False
39 | context.verify_mode = ssl.CERT_NONE
40 | client_socket = context.wrap_socket(raw_socket, server_hostname=self.server_ip)
41 | else:
42 | client_socket = raw_socket
43 |
44 | client_socket.connect((self.server_ip, self.server_port))
45 | client_socket.sendall(payload_json.encode('utf-8'))
46 |
47 | response = b""
48 | while True:
49 | part = client_socket.recv(4096)
50 | if not part:
51 | break
52 | response += part
53 |
54 | return response.decode('utf-8')
55 | except ssl.SSLError:
56 | return "Error: Server and/or client may require TLS encryption. Please enable SSL/TLS."
57 | except Exception as e:
58 | return f"Error: {e}"
59 |
60 | finally:
61 | if client_socket is not None:
62 | try:
63 | client_socket.shutdown(socket.SHUT_RDWR)
64 | except:
65 | pass
66 | client_socket.close()
67 |
68 |
69 | def send_list_sources_request(self, group_name, use_ssl=False, accept_self_signed=False):
70 | """
71 | Sends a request to list sources in a specific group to the MCP server.
72 |
73 | :param server_ip: IP address of the MCP server
74 | :param server_port: Port number of the MCP server
75 | :param token: Authentication token
76 | :param group_name: Name of the group to list sources from
77 | :param use_ssl: Whether to use SSL/TLS for the connection
78 | :param accept_self_signed: Whether to accept self-signed certificates
79 | :return: Response from the server
80 | """
81 | payload = {
82 | "command": "list_sources",
83 | "token": self.token,
84 | "attributes": {
85 | "groupName": group_name
86 | }
87 | }
88 |
89 | payload_json = json.dumps(payload)
90 |
91 | raw_socket = None
92 | client_socket = None
93 |
94 | try:
95 | raw_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
96 | raw_socket.settimeout(10)
97 |
98 | if use_ssl:
99 | context = ssl.create_default_context()
100 | if accept_self_signed:
101 | context.check_hostname = False
102 | context.verify_mode = ssl.CERT_NONE
103 | client_socket = context.wrap_socket(raw_socket, server_hostname=self.server_ip)
104 | else:
105 | client_socket = raw_socket
106 |
107 | client_socket.connect((self.server_ip, self.server_port))
108 | client_socket.sendall(payload_json.encode('utf-8'))
109 |
110 | response = b""
111 | while True:
112 | part = client_socket.recv(4096)
113 | if not part:
114 | break
115 | response += part
116 |
117 | return response.decode('utf-8')
118 | except ssl.SSLError:
119 | return "Error: Server and/or client may require TLS encryption. Please enable SSL/TLS."
120 | except Exception as e:
121 | return f"Error: {e}"
122 |
123 | finally:
124 | if client_socket is not None:
125 | try:
126 | client_socket.shutdown(socket.SHUT_RDWR)
127 | except:
128 | pass
129 | client_socket.close()
130 |
131 |
132 | def send_create_source_request(self, name, content, groups, use_ssl=False,
133 | accept_self_signed=False):
134 | """
135 | Sends a request to create a new source to the MCP server.
136 |
137 | :param server_ip: IP address of the MCP server
138 | :param server_port: Port number of the MCP server
139 | :param token: Authentication token
140 | :param name: Name of the new source
141 | :param content: Content to be formatted as markdown
142 | :param groups: List of groups to assign the source to
143 | :param use_ssl: Whether to use SSL/TLS for the connection
144 | :param accept_self_signed: Whether to accept self-signed certificates
145 | :return: Response from the server
146 | """
147 | payload = {
148 | "command": "create_source",
149 | "token": self.token,
150 | "arguments": {
151 | "name": name,
152 | "content": content,
153 | "groups": groups or []
154 | }
155 | }
156 |
157 | # Convert the payload to a JSON string
158 | payload_json = json.dumps(payload)
159 |
160 | raw_socket = None
161 | client_socket = None
162 |
163 | try:
164 | # Create a socket object
165 | raw_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
166 | raw_socket.settimeout(10)
167 |
168 | # Establish SSL/TLS connection if required
169 | if use_ssl:
170 | context = ssl.create_default_context()
171 | if accept_self_signed:
172 | context.check_hostname = False
173 | context.verify_mode = ssl.CERT_NONE
174 | client_socket = context.wrap_socket(raw_socket, server_hostname=self.server_ip)
175 | else:
176 | client_socket = raw_socket
177 |
178 | # Connect to the server
179 | client_socket.connect((self.server_ip, self.server_port))
180 |
181 | # Send the request
182 | client_socket.sendall(payload_json.encode('utf-8'))
183 |
184 | # Receive the response
185 | response = b""
186 | while True:
187 | part = client_socket.recv(4096)
188 | if not part:
189 | break
190 | response += part
191 |
192 | # Decode the response
193 | return response.decode('utf-8')
194 |
195 | except ssl.SSLError:
196 | return "Error: Server and/or client may require TLS encryption. Please enable SSL/TLS."
197 | except Exception as e:
198 | return f"Error: {e}"
199 |
200 | finally:
201 | if client_socket is not None:
202 | try:
203 | client_socket.shutdown(socket.SHUT_RDWR)
204 | except:
205 | pass
206 | client_socket.close()
```
--------------------------------------------------------------------------------
/clients/Java/5.0 mcp_store_user/MCPStoreUserClient.java:
--------------------------------------------------------------------------------
```java
1 | import org.json.JSONArray;
2 | import org.json.JSONObject;
3 |
4 | import java.io.IOException;
5 | import java.io.InputStream;
6 | import java.io.OutputStream;
7 | import java.net.Socket;
8 | import java.nio.charset.StandardCharsets;
9 | import java.util.ArrayList;
10 | import java.util.Arrays;
11 | import java.util.List;
12 |
13 | public class MCPStoreUserClient {
14 |
15 | public static void main(String[] args) {
16 | // Laut Original soll es mindestens 14 Strings geben,
17 | // also 7 Schlüssel-Wert-Paare. (z.B. --server-ip <IP> etc.)
18 | if (args.length < 14) {
19 | printUsage();
20 | return;
21 | }
22 |
23 | // Argumente auslesen
24 | String serverIp = getArgument(args, "--server-ip");
25 | String portStr = getArgument(args, "--server-port");
26 | String token = getArgument(args, "--token");
27 | String name = getArgument(args, "--name");
28 | String email = getArgument(args, "--email");
29 | String password = getArgument(args, "--password");
30 | String language = getArgument(args, "--language");
31 | String timezone = getArgument(args, "--timezone");
32 |
33 | if (language == null) {
34 | language = "en"; // Standardwert laut Original
35 | }
36 | if (timezone == null) {
37 | timezone = "Europe/Berlin"; // Standardwert laut Original
38 | }
39 |
40 | List<String> roles = getListArgument(args, "--roles");
41 | List<String> groups = getListArgument(args, "--groups");
42 |
43 | // Flags
44 | boolean usePublic = Arrays.asList(args).contains("--usePublic");
45 | boolean activateFtp= Arrays.asList(args).contains("--activateFtp");
46 |
47 | // FTP-Passwort, falls angegeben
48 | String ftpPassword = getArgument(args, "--ftpPassword");
49 | if (ftpPassword == null) {
50 | ftpPassword = "";
51 | }
52 |
53 | // Falls kritische Argumente fehlen, Usage anzeigen
54 | if (serverIp == null || portStr == null || token == null
55 | || name == null || email == null || password == null) {
56 | printUsage();
57 | return;
58 | }
59 |
60 | int serverPort = Integer.parseInt(portStr);
61 |
62 | System.out.println("📤 Sending store user request...");
63 |
64 | // JSON-Payload erstellen
65 | JSONObject payload = new JSONObject();
66 | payload.put("command", "store_user");
67 | payload.put("token", token);
68 |
69 | JSONObject arguments = new JSONObject();
70 | arguments.put("name", name);
71 | arguments.put("email", email);
72 | arguments.put("password", password);
73 | arguments.put("language", language);
74 | arguments.put("timezone", timezone);
75 | arguments.put("usePublic", usePublic);
76 | arguments.put("activateFtp", activateFtp);
77 | arguments.put("ftpPassword", ftpPassword);
78 |
79 | // roles & groups als JSON-Arrays
80 | JSONArray rolesArray = new JSONArray(roles);
81 | arguments.put("roles", rolesArray);
82 |
83 | JSONArray groupsArray = new JSONArray(groups);
84 | arguments.put("groups", groupsArray);
85 |
86 | payload.put("arguments", arguments);
87 |
88 | // Request versenden
89 | String response = sendRequest(serverIp, serverPort, payload);
90 | System.out.println("✔️ Response from server:");
91 | System.out.println(response);
92 | }
93 |
94 | /**
95 | * Holt genau ein Argument (z.B. "--server-ip 127.0.0.1").
96 | * Gibt null zurück, falls nicht vorhanden oder kein Wert folgt.
97 | */
98 | private static String getArgument(String[] args, String key) {
99 | for (int i = 0; i < args.length - 1; i++) {
100 | if (args[i].equals(key)) {
101 | return args[i + 1];
102 | }
103 | }
104 | return null;
105 | }
106 |
107 | /**
108 | * Ähnlich wie getArgument(), aber liest alle Werte ein,
109 | * bis das nächste "--" beginnt oder das Array zu Ende ist.
110 | */
111 | private static List<String> getListArgument(String[] args, String key) {
112 | List<String> values = new ArrayList<>();
113 | for (int i = 0; i < args.length; i++) {
114 | if (args[i].equals(key)) {
115 | // ab hier sammeln
116 | for (int j = i + 1; j < args.length; j++) {
117 | if (args[j].startsWith("--")) {
118 | break;
119 | }
120 | values.add(args[j]);
121 | }
122 | break; // Nur einmal sammeln
123 | }
124 | }
125 | return values;
126 | }
127 |
128 | /**
129 | * Stellt eine TCP-Verbindung her, sendet das JSON-Payload und liest die Antwort.
130 | */
131 | private static String sendRequest(String serverIp, int serverPort, JSONObject payload) {
132 | String payloadJson = payload.toString();
133 |
134 | try (Socket client = new Socket(serverIp, serverPort)) {
135 | // Payload senden
136 | OutputStream out = client.getOutputStream();
137 | byte[] data = payloadJson.getBytes(StandardCharsets.UTF_8);
138 | out.write(data);
139 | out.flush();
140 |
141 | // Antwort empfangen
142 | InputStream in = client.getInputStream();
143 | byte[] buffer = new byte[4096];
144 | StringBuilder responseBuilder = new StringBuilder();
145 | int bytesRead;
146 | do {
147 | bytesRead = in.read(buffer);
148 | if (bytesRead > 0) {
149 | responseBuilder.append(new String(buffer, 0, bytesRead, StandardCharsets.UTF_8));
150 | }
151 | } while (bytesRead == buffer.length);
152 |
153 | return responseBuilder.toString();
154 |
155 | } catch (IOException e) {
156 | return "Error: " + e.getMessage();
157 | }
158 | }
159 |
160 | private static void printUsage() {
161 | System.out.println("Usage: --server-ip <IP> --server-port <PORT> --token <TOKEN> --name <NAME> --email <EMAIL> --password <PASSWORD>");
162 | System.out.println(" [--language <LANG>] [--timezone <TIMEZONE>] [--roles <ROLE1 ROLE2>] [--groups <GROUP1 GROUP2>]");
163 | System.out.println(" [--usePublic] [--activateFtp] [--ftpPassword <FTP_PASSWORD>]");
164 | System.out.println();
165 | System.out.println("Example:");
166 | System.out.println(" java -cp .;json-20241224.jar MCPStoreUserClient \\");
167 | System.out.println(" --server-ip 127.0.0.1 --server-port 1234 --token MyToken \\");
168 | System.out.println(" --name Max --email [email protected] --password 12345 \\");
169 | System.out.println(" --language de --timezone Europe/Berlin \\");
170 | System.out.println(" --roles admin manager --groups devops finance \\");
171 | System.out.println(" --usePublic --activateFtp --ftpPassword someFtpPass");
172 | }
173 | }
174 |
```
--------------------------------------------------------------------------------
/agents/MCP-Client/Python/tools_handler.py:
--------------------------------------------------------------------------------
```python
1 | import json
2 | import logging
3 | import re
4 | from typing import Any, Dict, Optional
5 | from .messages.send_call_tool import send_call_tool
6 | from .messages.send_tools_list import send_tools_list
7 |
8 |
9 | def parse_tool_response(response: str) -> Optional[Dict[str, Any]]:
10 | """Parse tool call from Llama's XML-style format."""
11 | function_regex = r"<function=(\w+)>(.*?)</function>"
12 | match = re.search(function_regex, response)
13 |
14 | if match:
15 | function_name, args_string = match.groups()
16 | try:
17 | args = json.loads(args_string)
18 | return {
19 | "id": f"call_{function_name}",
20 | "function": function_name,
21 | "arguments": args,
22 | }
23 | except json.JSONDecodeError as error:
24 | logging.debug(f"Error parsing function arguments: {error}")
25 | return None
26 |
27 |
28 | async def handle_tool_call(tool_call, conversation_history, server_streams):
29 | """
30 | Handle a single tool call for both OpenAI and Llama formats.
31 | This function no longer prints directly to stdout. It updates the conversation_history
32 | with the tool call and its response. The calling function can then display the results.
33 | """
34 | tool_call_id = None
35 | tool_name = "unknown_tool"
36 | raw_arguments = {}
37 |
38 |
39 | try:
40 | # Handle object-style tool calls from both OpenAI and Ollama
41 | if hasattr(tool_call, "function") or (
42 | isinstance(tool_call, dict) and "function" in tool_call
43 | ):
44 | # Get tool name and arguments based on format
45 | if hasattr(tool_call, "function"):
46 | tool_call_id = tool_call.id
47 | tool_name = tool_call.function.name
48 | raw_arguments = tool_call.function.arguments
49 | else:
50 | tool_call_id = tool_call["id"]
51 | tool_name = tool_call["function"]["name"]
52 | raw_arguments = tool_call["function"]["arguments"]
53 | else:
54 | # Parse Llama's XML format from the last message
55 | last_message = conversation_history[-1]["content"]
56 | parsed_tool = parse_tool_response(last_message)
57 | if not parsed_tool:
58 | logging.debug("Unable to parse tool call from message")
59 | return
60 |
61 | tool_call_id = parsed_tool["id"]
62 | tool_name = parsed_tool["function"]
63 | raw_arguments = parsed_tool["arguments"]
64 |
65 | # Parse the tool arguments
66 | tool_args = (
67 | json.loads(raw_arguments)
68 | if isinstance(raw_arguments, str)
69 | else raw_arguments
70 | )
71 |
72 | # Call the tool (no direct print here)
73 | tool_response = {}
74 | for read_stream, write_stream in server_streams:
75 |
76 | tools = await fetch_tools(read_stream, write_stream)
77 | server_has_tool = False
78 | for tool in tools:
79 | if tool["name"] == tool_name:
80 | server_has_tool = True
81 | if server_has_tool:
82 | tool_response = await send_call_tool(
83 | tool_name, tool_args, read_stream, write_stream
84 | )
85 |
86 | if not tool_response.get("isError"):
87 | break
88 | else:
89 | continue
90 |
91 | if tool_response.get("isError"):
92 | logging.debug(
93 | f"Error calling tool '{tool_name}': {tool_response.get('content')}"
94 | )
95 |
96 | # Format the tool response
97 | formatted_response = format_tool_response(tool_response.get("content", []))
98 | logging.debug(f"Tool '{tool_name}' Response: {formatted_response}")
99 | if formatted_response == "":
100 | print(f"Warning Tool '{tool_name}' Response: {formatted_response}")
101 | #print(f"Tool '{tool_name}' Response: {formatted_response}")
102 | # Update the conversation history with the tool call
103 | # Add the tool call itself (for OpenAI tracking)
104 |
105 |
106 | conversation_history.append(
107 | {
108 | "role": "assistant",
109 | "content": None,
110 | "tool_calls": [
111 | {
112 | "id": tool_call_id,
113 | "type": "function",
114 | "function": {
115 | "name": tool_name,
116 | "arguments": json.dumps(tool_args)
117 | if isinstance(tool_args, dict)
118 | else tool_args,
119 | },
120 | }
121 | ],
122 | }
123 | )
124 |
125 | # Add the tool response to conversation history
126 | conversation_history.append(
127 | {
128 | "role": "tool",
129 | "name": tool_name,
130 | "content": str(formatted_response),
131 | "tool_call_id": tool_call_id,
132 | }
133 | )
134 |
135 | except json.JSONDecodeError:
136 | logging.debug(
137 | f"Error decoding arguments for tool '{tool_name}': {raw_arguments}"
138 | )
139 | except Exception as e:
140 | logging.debug(f"Error handling tool call '{tool_name}': {str(e)}")
141 |
142 |
143 | def format_tool_response(response_content):
144 | """Format the response content from a tool."""
145 | if isinstance(response_content, list):
146 | return "\n".join(
147 | item.get("text", "No content")
148 | for item in response_content
149 | if item.get("type") == "text"
150 | )
151 | return str(response_content)
152 |
153 |
154 | async def fetch_tools(read_stream, write_stream):
155 | """Fetch tools from the server."""
156 | logging.debug("\nFetching tools for chat mode...")
157 |
158 | # get the tools list
159 | tools_response = await send_tools_list(read_stream, write_stream)
160 | tools = tools_response.get("tools", [])
161 |
162 | # check if tools are valid
163 | if not isinstance(tools, list) or not all(isinstance(tool, dict) for tool in tools):
164 | logging.debug("Invalid tools format received.")
165 | return None
166 |
167 | return tools
168 |
169 |
170 | def convert_to_openai_tools(tools):
171 | """Convert tools into OpenAI-compatible function definitions."""
172 | openai_tools = []
173 | for tool in tools:
174 | # TODO. This works around the mcp-remote library putting the input scheme into another objet
175 | if tool.get("inputSchema", {}).get("properties").get("type") == "object":
176 | inputScheme = tool.get("inputSchema", {}).get("properties")
177 | else:
178 | inputScheme = tool.get("inputSchema", {})
179 |
180 | entry = {
181 | "type": "function",
182 | "function": {
183 | "name": tool["name"],
184 | "description": tool.get("description", ""),
185 | "parameters": inputScheme
186 | },
187 | }
188 |
189 |
190 | openai_tools.append(entry)
191 |
192 | return openai_tools
193 |
```
--------------------------------------------------------------------------------
/clients/Java/5.1 mcp_edit_user/MCPEditUserClient.java:
--------------------------------------------------------------------------------
```java
1 | import org.json.JSONObject;
2 |
3 | import java.io.BufferedReader;
4 | import java.io.InputStreamReader;
5 | import java.io.OutputStream;
6 | import java.net.Socket;
7 | import java.nio.charset.StandardCharsets;
8 | import java.util.*;
9 |
10 | public class MCPEditUserClient {
11 | public static void main(String[] args) {
12 | // Kurze Validierung der Argumente
13 | if (args.length < 8) {
14 | System.out.println("Usage: " +
15 | "--server-ip <IP> " +
16 | "--server-port <PORT> " +
17 | "--token <TOKEN> " +
18 | "--user-id <USER_ID> [weitere optionale Parameter]");
19 | return;
20 | }
21 |
22 | // Argumente auslesen
23 | String serverIp = getArgument(args, "--server-ip");
24 | String portString = getArgument(args, "--server-port");
25 | if (serverIp == null || portString == null) {
26 | System.err.println("Server-IP oder Server-Port fehlt!");
27 | return;
28 | }
29 | int serverPort = Integer.parseInt(portString);
30 | String token = getArgument(args, "--token");
31 | String userId = getArgument(args, "--user-id");
32 |
33 | // Optional
34 | String name = getArgument(args, "--name");
35 | String email = getArgument(args, "--email");
36 | String password = getArgument(args, "--password");
37 | String language = getArgument(args, "--language");
38 | String timezone = getArgument(args, "--timezone");
39 |
40 | List<String> roles = getListArgument(args, "--roles");
41 | List<String> groups = getListArgument(args, "--groups");
42 |
43 | boolean usePublic = Arrays.asList(args).contains("--usePublic");
44 | boolean activateFtp = Arrays.asList(args).contains("--activateFtp");
45 | String ftpPassword = getArgument(args, "--ftpPassword");
46 |
47 | // Argumente in eine Map packen
48 | Map<String, Object> argumentsMap = new HashMap<>();
49 | argumentsMap.put("userId", userId);
50 | argumentsMap.put("name", name);
51 | argumentsMap.put("email", email);
52 | argumentsMap.put("password", password);
53 | argumentsMap.put("language", language);
54 | argumentsMap.put("timezone", timezone);
55 | argumentsMap.put("roles", roles);
56 | argumentsMap.put("groups", groups);
57 | argumentsMap.put("usePublic", usePublic);
58 | argumentsMap.put("activateFtp", activateFtp);
59 | argumentsMap.put("ftpPassword", ftpPassword);
60 |
61 | // Null oder leere Strings entfernen
62 | argumentsMap = removeNullOrEmpty(argumentsMap);
63 |
64 | // JSON-Payload zusammenstellen
65 | JSONObject payload = new JSONObject();
66 | payload.put("command", "edit_user");
67 | payload.put("token", token);
68 | payload.put("arguments", argumentsMap);
69 |
70 | System.out.println("📤 Sending edit user request...");
71 | String response = sendRequest(serverIp, serverPort, payload.toString());
72 | System.out.println("✔️ Response from server:");
73 | System.out.println(response);
74 | }
75 |
76 | /**
77 | * Liest den Wert eines bestimmten Parameters aus dem Argument-Array.
78 | * Bsp.: "--server-ip" -> "127.0.0.1"
79 | *
80 | * @param args Array mit allen Argumenten
81 | * @param key Name des Arguments, nach dem gesucht wird (z.B. "--server-ip")
82 | * @return Wert des Arguments oder null, falls nicht gefunden
83 | */
84 | private static String getArgument(String[] args, String key) {
85 | for (int i = 0; i < args.length; i++) {
86 | if (args[i].equals(key) && i < args.length - 1) {
87 | return args[i + 1];
88 | }
89 | }
90 | return null;
91 | }
92 |
93 | /**
94 | * Liest mehrere Werte für einen Argument-Schlüssel (z.B. "--roles") aus,
95 | * bis ein neues Argument mit "--" beginnt.
96 | *
97 | * @param args Array mit allen Argumenten
98 | * @param key Name des Arguments, nach dem gesucht wird (z.B. "--roles")
99 | * @return Liste der gefundenen Werte, sonst eine leere Liste
100 | */
101 | private static List<String> getListArgument(String[] args, String key) {
102 | List<String> values = new ArrayList<>();
103 | for (int i = 0; i < args.length; i++) {
104 | if (args[i].equals(key)) {
105 | // Sammle solange, bis ein neues "--" beginnt oder args zu Ende
106 | for (int j = i + 1; j < args.length && !args[j].startsWith("--"); j++) {
107 | values.add(args[j]);
108 | }
109 | break;
110 | }
111 | }
112 | return values;
113 | }
114 |
115 | /**
116 | * Entfernt alle Einträge, deren Wert null oder ein leerer String ist.
117 | */
118 | private static Map<String, Object> removeNullOrEmpty(Map<String, Object> original) {
119 | Map<String, Object> cleaned = new HashMap<>();
120 | for (Map.Entry<String, Object> entry : original.entrySet()) {
121 | Object value = entry.getValue();
122 | if (value != null) {
123 | // Wenn String, checke ob leer oder nur Whitespace
124 | if (value instanceof String) {
125 | String str = (String) value;
126 | if (!str.trim().isEmpty()) {
127 | cleaned.put(entry.getKey(), value);
128 | }
129 | } else {
130 | // Keine weitere Prüfung für Listen, Booleans, etc.
131 | cleaned.put(entry.getKey(), value);
132 | }
133 | }
134 | }
135 | return cleaned;
136 | }
137 |
138 | /**
139 | * Sendet den gegebenen JSON-String per TCP an den Server und empfängt die Antwort.
140 | *
141 | * @param serverIp IP des Servers
142 | * @param serverPort Port des Servers
143 | * @param payload JSON-String
144 | * @return Antwort als String oder Fehlermeldung
145 | */
146 | private static String sendRequest(String serverIp, int serverPort, String payload) {
147 | try (Socket socket = new Socket(serverIp, serverPort)) {
148 | // Daten zum Server senden
149 | OutputStream output = socket.getOutputStream();
150 | byte[] data = payload.getBytes(StandardCharsets.UTF_8);
151 | output.write(data);
152 | output.flush();
153 |
154 | // Antwort lesen
155 | BufferedReader reader = new BufferedReader(
156 | new InputStreamReader(socket.getInputStream(), StandardCharsets.UTF_8)
157 | );
158 | StringBuilder sb = new StringBuilder();
159 | char[] buffer = new char[4096];
160 | int charsRead;
161 | do {
162 | charsRead = reader.read(buffer, 0, buffer.length);
163 | if (charsRead > 0) {
164 | sb.append(buffer, 0, charsRead);
165 | }
166 | } while (charsRead == buffer.length);
167 |
168 | return sb.toString();
169 |
170 | } catch (Exception e) {
171 | return "Error: " + e.getMessage();
172 | }
173 | }
174 | }
175 |
```
--------------------------------------------------------------------------------
/clients/PHP/2.0 mcp_chat/MCPChatClient.php:
--------------------------------------------------------------------------------
```php
1 | <?php
2 | /**
3 | * MCPChatClient.php
4 | *
5 | * A PHP script that acts as a chat client. It connects to a server via TCP,
6 | * sends a chat request, and receives the server's response.
7 | *
8 | * Usage:
9 | * php MCPChatClient.php --server-ip <IP> --server-port <Port> --token <Token> --question <Question> [--use-public] [--groups <Group1> <Group2> ...] [--language <Language>]
10 | */
11 |
12 | // Functions for parsing command line arguments
13 | function parseArguments($args) {
14 | $parsedArgs = [];
15 | $argc = count($args);
16 | for ($i = 1; $i < $argc; $i++) {
17 | switch ($args[$i]) {
18 | case '--server-ip':
19 | if (isset($args[$i + 1]) && !startsWith($args[$i + 1], '--')) {
20 | $parsedArgs['serverIp'] = $args[++$i];
21 | } else {
22 | fwrite(STDERR, "Error: --server-ip expects a value.\n");
23 | exit(1);
24 | }
25 | break;
26 | case '--server-port':
27 | if (isset($args[$i + 1]) && !startsWith($args[$i + 1], '--')) {
28 | $parsedArgs['serverPort'] = intval($args[++$i]);
29 | } else {
30 | fwrite(STDERR, "Error: --server-port expects a value.\n");
31 | exit(1);
32 | }
33 | break;
34 | case '--token':
35 | if (isset($args[$i + 1]) && !startsWith($args[$i + 1], '--')) {
36 | $parsedArgs['token'] = $args[++$i];
37 | } else {
38 | fwrite(STDERR, "Error: --token expects a value.\n");
39 | exit(1);
40 | }
41 | break;
42 | case '--question':
43 | if (isset($args[$i + 1]) && !startsWith($args[$i + 1], '--')) {
44 | $parsedArgs['question'] = $args[++$i];
45 | } else {
46 | fwrite(STDERR, "Error: --question expects a value.\n");
47 | exit(1);
48 | }
49 | break;
50 | case '--use-public':
51 | $parsedArgs['usePublic'] = true;
52 | break;
53 | case '--groups':
54 | // Collect all group arguments until the next flag or end
55 | $parsedArgs['groups'] = [];
56 | while ($i + 1 < $argc && !startsWith($args[$i + 1], '--')) {
57 | $parsedArgs['groups'][] = $args[++$i];
58 | }
59 | break;
60 | case '--language':
61 | if (isset($args[$i + 1]) && !startsWith($args[$i + 1], '--')) {
62 | $parsedArgs['language'] = $args[++$i];
63 | } else {
64 | fwrite(STDERR, "Error: --language expects a value.\n");
65 | exit(1);
66 | }
67 | break;
68 | default:
69 | fwrite(STDERR, "Warning: Unknown argument: {$args[$i]}\n");
70 | }
71 | }
72 | return $parsedArgs;
73 | }
74 |
75 | // Helper function to check if a string starts with a specific prefix
76 | function startsWith($string, $prefix) {
77 | return substr($string, 0, strlen($prefix)) === $prefix;
78 | }
79 |
80 | // Function for interactively prompting a parameter (optional)
81 | function askQuestionPrompt($prompt) {
82 | if (preg_match('/^win/i', PHP_OS)) {
83 | // Windows-specific input prompt
84 | $vbscript = sys_get_temp_dir() . 'prompt_input.vbs';
85 | file_put_contents($vbscript, 'wscript.echo(InputBox("' . addslashes($prompt) . '", "", ""))');
86 | $response = shell_exec("cscript //nologo " . escapeshellarg($vbscript));
87 | unlink($vbscript);
88 | return trim($response);
89 | } else {
90 | // Unix/Linux input prompt
91 | echo $prompt;
92 | $handle = fopen("php://stdin", "r");
93 | $response = trim(fgets($handle));
94 | fclose($handle);
95 | return $response;
96 | }
97 | }
98 |
99 | // Function to send a chat request over a TCP connection
100 | function sendChatRequest($serverIp, $serverPort, $payload) {
101 | $jsonPayload = json_encode($payload);
102 | if ($jsonPayload === false) {
103 | throw new Exception("Error encoding JSON payload.");
104 | }
105 |
106 | $errno = 0;
107 | $errstr = '';
108 | $timeout = 30; // seconds
109 | $client = @fsockopen($serverIp, $serverPort, $errno, $errstr, $timeout);
110 |
111 | if (!$client) {
112 | throw new Exception("Connection error: $errstr ($errno)");
113 | }
114 |
115 | echo "🔗 Connection to server established.\n";
116 | echo "📤 Sending payload: $jsonPayload\n";
117 |
118 | fwrite($client, $jsonPayload);
119 |
120 | $responseData = '';
121 | stream_set_timeout($client, $timeout);
122 |
123 | while (!feof($client)) {
124 | $data = fread($client, 1024);
125 | if ($data === false) {
126 | throw new Exception("Error reading data from server.");
127 | }
128 | if ($data === '') {
129 | break; // No more data
130 | }
131 | echo "📥 Received data: $data\n";
132 | $responseData .= $data;
133 |
134 | // Attempt to parse the received data as JSON
135 | $parsedData = json_decode($responseData, true);
136 | if ($parsedData !== null) {
137 | echo "✅ JSON response successfully parsed.\n";
138 | fclose($client);
139 | return $parsedData;
140 | }
141 |
142 | // Check if the stream timed out
143 | $info = stream_get_meta_data($client);
144 | if ($info['timed_out']) {
145 | throw new Exception("Timeout waiting for data from server.");
146 | }
147 | }
148 |
149 | fclose($client);
150 | throw new Exception("Connection to the server was closed before a complete response was received.");
151 | }
152 |
153 | // Main function
154 | function main($argv) {
155 | $args = parseArguments($argv);
156 | $serverIp = $args['serverIp'] ?? null;
157 | $serverPort = $args['serverPort'] ?? null;
158 | $token = $args['token'] ?? null;
159 | $question = $args['question'] ?? null;
160 | $usePublic = $args['usePublic'] ?? false;
161 | $groups = $args['groups'] ?? [];
162 | $language = $args['language'] ?? 'en'; // Default to English
163 |
164 | // Check if all required parameters are present
165 | if (!$serverIp || !$serverPort || !$token || !$question) {
166 | fwrite(STDERR, "❌ ERROR: Missing required parameters.\n");
167 | fwrite(STDOUT, "Usage: php MCPChatClient.php --server-ip <IP> --server-port <Port> --token <Token> --question <Question> [--use-public] [--groups <Group1> <Group2> ...] [--language <Language>]\n");
168 | exit(1);
169 | }
170 |
171 | $payload = [
172 | "command" => "chat",
173 | "token" => $token,
174 | "arguments" => [
175 | "question" => $question,
176 | "usePublic" => $usePublic,
177 | "groups" => $groups,
178 | "language" => $language
179 | ]
180 | ];
181 |
182 | try {
183 | echo "💬 Sending chat request...\n";
184 | $response = sendChatRequest($serverIp, $serverPort, $payload);
185 | echo "✅ Server Response:\n";
186 | echo json_encode($response, JSON_PRETTY_PRINT) . "\n";
187 | } catch (Exception $e) {
188 | fwrite(STDERR, "❌ ERROR: " . $e->getMessage() . "\n");
189 | }
190 | }
191 |
192 | main($argv);
193 | ?>
194 |
```
--------------------------------------------------------------------------------
/agents/AgentMonitoring/ChatBot-Agent Dashboard Example - Grafana.json:
--------------------------------------------------------------------------------
```json
1 | {
2 | "annotations": {
3 | "list": [
4 | {
5 | "builtIn": 1,
6 | "datasource": {
7 | "type": "grafana",
8 | "uid": "-- Grafana --"
9 | },
10 | "enable": true,
11 | "hide": true,
12 | "iconColor": "rgba(0, 211, 255, 1)",
13 | "name": "Annotations & Alerts",
14 | "type": "dashboard"
15 | }
16 | ]
17 | },
18 | "editable": true,
19 | "fiscalYearStartMonth": 0,
20 | "graphTooltip": 0,
21 | "id": 3,
22 | "links": [],
23 | "panels": [
24 | {
25 | "datasource": {
26 | "type": "prometheus",
27 | "uid": "ceej3ydtls1kwb"
28 | },
29 | "fieldConfig": {
30 | "defaults": {
31 | "color": {
32 | "mode": "palette-classic"
33 | },
34 | "custom": {
35 | "axisBorderShow": false,
36 | "axisCenteredZero": false,
37 | "axisColorMode": "text",
38 | "axisLabel": "",
39 | "axisPlacement": "auto",
40 | "barAlignment": 0,
41 | "barWidthFactor": 0.6,
42 | "drawStyle": "line",
43 | "fillOpacity": 0,
44 | "gradientMode": "none",
45 | "hideFrom": {
46 | "legend": false,
47 | "tooltip": false,
48 | "viz": false
49 | },
50 | "insertNulls": false,
51 | "lineInterpolation": "linear",
52 | "lineWidth": 1,
53 | "pointSize": 5,
54 | "scaleDistribution": {
55 | "type": "linear"
56 | },
57 | "showPoints": "auto",
58 | "spanNulls": false,
59 | "stacking": {
60 | "group": "A",
61 | "mode": "none"
62 | },
63 | "thresholdsStyle": {
64 | "mode": "off"
65 | }
66 | },
67 | "mappings": [],
68 | "thresholds": {
69 | "mode": "absolute",
70 | "steps": [
71 | {
72 | "color": "green",
73 | "value": null
74 | },
75 | {
76 | "color": "red",
77 | "value": 80
78 | }
79 | ]
80 | },
81 | "unit": "req/s"
82 | },
83 | "overrides": []
84 | },
85 | "gridPos": {
86 | "h": 8,
87 | "w": 12,
88 | "x": 0,
89 | "y": 0
90 | },
91 | "id": 1,
92 | "options": {
93 | "legend": {
94 | "calcs": [],
95 | "displayMode": "list",
96 | "placement": "bottom",
97 | "showLegend": true
98 | },
99 | "tooltip": {
100 | "hideZeros": false,
101 | "mode": "single",
102 | "sort": "none"
103 | }
104 | },
105 | "pluginVersion": "11.5.2",
106 | "targets": [
107 | {
108 | "datasource": "prometheus",
109 | "editorMode": "code",
110 | "expr": "request_count_total{}",
111 | "interval": "",
112 | "legendFormat": "{{method}} {{endpoint}}",
113 | "range": true,
114 | "refId": "A"
115 | }
116 | ],
117 | "title": "Request Count (rate)",
118 | "type": "timeseries"
119 | },
120 | {
121 | "fieldConfig": {
122 | "defaults": {
123 | "color": {
124 | "mode": "palette-classic"
125 | },
126 | "custom": {
127 | "axisBorderShow": false,
128 | "axisCenteredZero": false,
129 | "axisColorMode": "text",
130 | "axisLabel": "",
131 | "axisPlacement": "auto",
132 | "barAlignment": 0,
133 | "barWidthFactor": 0.6,
134 | "drawStyle": "line",
135 | "fillOpacity": 0,
136 | "gradientMode": "none",
137 | "hideFrom": {
138 | "legend": false,
139 | "tooltip": false,
140 | "viz": false
141 | },
142 | "insertNulls": false,
143 | "lineInterpolation": "linear",
144 | "lineWidth": 1,
145 | "pointSize": 5,
146 | "scaleDistribution": {
147 | "type": "linear"
148 | },
149 | "showPoints": "auto",
150 | "spanNulls": false,
151 | "stacking": {
152 | "group": "A",
153 | "mode": "none"
154 | },
155 | "thresholdsStyle": {
156 | "mode": "off"
157 | }
158 | },
159 | "mappings": [],
160 | "thresholds": {
161 | "mode": "absolute",
162 | "steps": [
163 | {
164 | "color": "green",
165 | "value": null
166 | },
167 | {
168 | "color": "red",
169 | "value": 80
170 | }
171 | ]
172 | },
173 | "unit": "s"
174 | },
175 | "overrides": []
176 | },
177 | "gridPos": {
178 | "h": 8,
179 | "w": 12,
180 | "x": 12,
181 | "y": 0
182 | },
183 | "id": 2,
184 | "options": {
185 | "legend": {
186 | "calcs": [],
187 | "displayMode": "list",
188 | "placement": "bottom",
189 | "showLegend": true
190 | },
191 | "tooltip": {
192 | "hideZeros": false,
193 | "mode": "single",
194 | "sort": "none"
195 | }
196 | },
197 | "pluginVersion": "11.5.2",
198 | "targets": [
199 | {
200 | "datasource": "prometheus",
201 | "editorMode": "code",
202 | "expr": "histogram_quantile(0.95, sum(rate(request_latency_seconds_bucket[1m])) by (le, method, endpoint))",
203 | "legendFormat": "p95 latency: {{method}} {{endpoint}}",
204 | "refId": "A"
205 | }
206 | ],
207 | "title": "Request Latency (p95)",
208 | "type": "timeseries"
209 | },
210 | {
211 | "datasource": {
212 | "type": "prometheus",
213 | "uid": "ceej3ydtls1kwb"
214 | },
215 | "fieldConfig": {
216 | "defaults": {
217 | "mappings": [],
218 | "thresholds": {
219 | "mode": "absolute",
220 | "steps": [
221 | {
222 | "color": "green",
223 | "value": null
224 | },
225 | {
226 | "color": "red",
227 | "value": 80
228 | }
229 | ]
230 | },
231 | "unit": "none"
232 | },
233 | "overrides": []
234 | },
235 | "gridPos": {
236 | "h": 6,
237 | "w": 6,
238 | "x": 0,
239 | "y": 8
240 | },
241 | "id": 3,
242 | "options": {
243 | "colorMode": "value",
244 | "graphMode": "none",
245 | "justifyMode": "center",
246 | "orientation": "auto",
247 | "percentChangeColorMode": "standard",
248 | "reduceOptions": {
249 | "calcs": [
250 | "lastNotNull"
251 | ],
252 | "fields": "",
253 | "values": false
254 | },
255 | "showPercentChange": false,
256 | "textMode": "auto",
257 | "wideLayout": true
258 | },
259 | "pluginVersion": "11.5.2",
260 | "targets": [
261 | {
262 | "datasource": "prometheus",
263 | "editorMode": "code",
264 | "expr": "agent_ask_count_total{}",
265 | "range": true,
266 | "refId": "A"
267 | }
268 | ],
269 | "title": "ASK Count",
270 | "type": "stat"
271 | }
272 | ],
273 | "preload": false,
274 | "refresh": "5s",
275 | "schemaVersion": 40,
276 | "tags": [
277 | "PrivateGPT",
278 | "Prometheus",
279 | "Flask"
280 | ],
281 | "templating": {
282 | "list": []
283 | },
284 | "time": {
285 | "from": "now-15m",
286 | "to": "now"
287 | },
288 | "timepicker": {},
289 | "timezone": "",
290 | "title": "PrivateGPT Chatbot Monitoring",
291 | "uid": "aeej7wr8gcwlcd",
292 | "version": 5,
293 | "weekStart": ""
294 | }
```
--------------------------------------------------------------------------------
/agents/MCP-Client/Python/chat_handler.py:
--------------------------------------------------------------------------------
```python
1 | # chat_handler.py
2 | import json
3 | import asyncio
4 |
5 | from rich import print
6 | from rich.markdown import Markdown
7 | from rich.panel import Panel
8 | from rich.prompt import Prompt
9 |
10 | from .llm_client import LLMClient
11 | from .system_prompt_generator import SystemPromptGenerator
12 | from .tools_handler import convert_to_openai_tools, fetch_tools, handle_tool_call
13 |
14 | async def get_input(prompt: str):
15 | """Get input asynchronously."""
16 | loop = asyncio.get_event_loop()
17 | return await loop.run_in_executor(None, lambda: Prompt.ask(prompt).strip())
18 |
19 | async def handle_chat_mode(server_streams, provider="openai", model="gpt-4o-mini"):
20 | """Enter chat mode with multi-call support for autonomous tool chaining."""
21 | try:
22 | tools = []
23 | for read_stream, write_stream in server_streams:
24 | tools.extend(await fetch_tools(read_stream, write_stream))
25 |
26 | # for (read_stream, write_stream) in server_streams:
27 | # tools = await fetch_tools(read_stream, write_stream)
28 | if not tools:
29 | print("[red]No tools available. Exiting chat mode.[/red]")
30 | return
31 |
32 | system_prompt = generate_system_prompt(tools)
33 | openai_tools = convert_to_openai_tools(tools)
34 | #print(openai_tools)
35 | client = LLMClient(provider=provider, model=model)
36 | conversation_history = [{"role": "system", "content": system_prompt}]
37 |
38 | while True:
39 | try:
40 | # Change prompt to yellow
41 | user_message = await get_input("[bold yellow]>[/bold yellow]")
42 | if user_message.lower() in ["exit", "quit"]:
43 | print(Panel("Exiting chat mode.", style="bold red"))
44 | break
45 |
46 | # User panel in bold yellow
47 | user_panel_text = user_message if user_message else "[No Message]"
48 | print(Panel(user_panel_text, style="bold yellow", title="You"))
49 |
50 | conversation_history.append({"role": "user", "content": user_message})
51 | await process_conversation(
52 | client, conversation_history, openai_tools, server_streams
53 | )
54 |
55 | except Exception as e:
56 | print(f"[red]Error processing message:[/red] {e}")
57 | continue
58 | except Exception as e:
59 | print(f"[red]Error in chat mode:[/red] {e}")
60 |
61 |
62 | async def process_conversation(
63 | client, conversation_history, openai_tools, server_streams
64 | ):
65 | """Process the conversation loop, handling tool calls and responses."""
66 | while True:
67 | completion = client.create_completion(
68 | messages=conversation_history,
69 | tools=openai_tools,
70 | )
71 |
72 | response_content = completion.get("response", "No response")
73 | tool_calls = completion.get("tool_calls", [])
74 |
75 | if tool_calls:
76 | for tool_call in tool_calls:
77 | # Extract tool_name and raw_arguments as before
78 | if hasattr(tool_call, "function"):
79 | print(tool_call.function)
80 | tool_name = getattr(tool_call.function, "name", "unknown tool")
81 | raw_arguments = getattr(tool_call.function, "arguments", {})
82 | elif isinstance(tool_call, dict) and "function" in tool_call:
83 | fn_info = tool_call["function"]
84 | tool_name = fn_info.get("name", "unknown tool")
85 | raw_arguments = fn_info.get("arguments", {})
86 | else:
87 | tool_name = "unknown tool"
88 | raw_arguments = {}
89 |
90 | # If raw_arguments is a string, try to parse it as JSON
91 | if isinstance(raw_arguments, str):
92 | try:
93 | raw_arguments = json.loads(raw_arguments)
94 | except json.JSONDecodeError:
95 | # If it's not valid JSON, just display as is
96 | pass
97 |
98 | # Now raw_arguments should be a dict or something we can pretty-print as JSON
99 | tool_args_str = json.dumps(raw_arguments, indent=2)
100 |
101 |
102 |
103 | tool_md = f"**Tool Call:** {tool_name}\n\n```json\n{tool_args_str}\n```"
104 | print(
105 | Panel(
106 | Markdown(tool_md), style="bold magenta", title="Tool Invocation"
107 | )
108 | )
109 |
110 | await handle_tool_call(tool_call, conversation_history, server_streams)
111 | continue
112 |
113 | # Assistant panel with Markdown
114 | assistant_panel_text = response_content if response_content else "[No Response]"
115 | print(
116 | Panel(Markdown(assistant_panel_text), style="bold blue", title="Assistant")
117 | )
118 | conversation_history.append({"role": "assistant", "content": response_content})
119 | break
120 |
121 |
122 | def generate_system_prompt(tools):
123 | """
124 | Generate a concise system prompt for the assistant.
125 |
126 | This prompt is internal and not displayed to the user.
127 | """
128 | prompt_generator = SystemPromptGenerator()
129 | tools_json = {"tools": tools}
130 |
131 | system_prompt = prompt_generator.generate_prompt(tools_json)
132 | system_prompt += """
133 |
134 | **GENERAL GUIDELINES:**
135 |
136 | 1. Step-by-step reasoning:
137 | - Analyze tasks systematically.
138 | - Break down complex problems into smaller, manageable parts.
139 | - Verify assumptions at each step to avoid errors.
140 | - Reflect on results to improve subsequent actions.
141 |
142 | 2. Effective tool usage:
143 | - Explore:
144 | - Identify available information and verify its structure.
145 | - Check assumptions and understand data relationships.
146 | - Iterate:
147 | - Start with simple queries or actions.
148 | - Build upon successes, adjusting based on observations.
149 | - Handle errors:
150 | - Carefully analyze error messages.
151 | - Use errors as a guide to refine your approach.
152 | - Document what went wrong and suggest fixes.
153 |
154 | 3. Clear communication:
155 | - Explain your reasoning and decisions at each step.
156 | - Share discoveries transparently with the user.
157 | - Outline next steps or ask clarifying questions as needed.
158 |
159 | EXAMPLES OF BEST PRACTICES:
160 |
161 | - Working with databases:
162 | - Check schema before writing queries.
163 | - Verify the existence of columns or tables.
164 | - Start with basic queries and refine based on results.
165 |
166 | - Processing data:
167 | - Validate data formats and handle edge cases.
168 | - Ensure integrity and correctness of results.
169 |
170 | - Accessing resources:
171 | - Confirm resource availability and permissions.
172 | - Handle missing or incomplete data gracefully.
173 |
174 | REMEMBER:
175 | - Be thorough and systematic.
176 | - Each tool call should have a clear and well-explained purpose.
177 | - Make reasonable assumptions if ambiguous.
178 | - Minimize unnecessary user interactions by providing actionable insights.
179 |
180 | EXAMPLES OF ASSUMPTIONS:
181 | - Default sorting (e.g., descending order) if not specified.
182 | - Assume basic user intentions, such as fetching top results by a common metric.
183 | """
184 | return system_prompt
185 |
```
--------------------------------------------------------------------------------
/clients/PHP/2.1 mcp_continue_chat/MCPContinueChatClient.php:
--------------------------------------------------------------------------------
```php
1 | <?php
2 | /**
3 | * MCPContinueChatClient.php
4 | *
5 | * A PHP script acting as a Continue Chat Client. It connects to a server via TCP,
6 | * sends a Continue Chat request, and receives the server's response.
7 | *
8 | * Usage:
9 | * php MCPContinueChatClient.php --server-ip <IP> --server-port <Port> --token <Token> --conversation-id <ConversationID> --message <Message>
10 | */
11 |
12 | /**
13 | * Function to parse command line arguments
14 | *
15 | * @param array $args Command line arguments
16 | * @return array Associative array of parsed arguments
17 | */
18 | function parseArguments($args) {
19 | $parsedArgs = [];
20 | $argc = count($args);
21 | for ($i = 1; $i < $argc; $i++) {
22 | switch ($args[$i]) {
23 | case '--server-ip':
24 | if (isset($args[$i + 1]) && !startsWith($args[$i + 1], '--')) {
25 | $parsedArgs['serverIp'] = $args[++$i];
26 | } else {
27 | fwrite(STDERR, "Error: --server-ip expects a value.\n");
28 | exit(1);
29 | }
30 | break;
31 | case '--server-port':
32 | if (isset($args[$i + 1]) && !startsWith($args[$i + 1], '--')) {
33 | $parsedArgs['serverPort'] = intval($args[++$i]);
34 | } else {
35 | fwrite(STDERR, "Error: --server-port expects a value.\n");
36 | exit(1);
37 | }
38 | break;
39 | case '--token':
40 | if (isset($args[$i + 1]) && !startsWith($args[$i + 1], '--')) {
41 | $parsedArgs['token'] = $args[++$i];
42 | } else {
43 | fwrite(STDERR, "Error: --token expects a value.\n");
44 | exit(1);
45 | }
46 | break;
47 | case '--conversation-id':
48 | if (isset($args[$i + 1]) && !startsWith($args[$i + 1], '--')) {
49 | $parsedArgs['conversationId'] = $args[++$i];
50 | } else {
51 | fwrite(STDERR, "Error: --conversation-id expects a value.\n");
52 | exit(1);
53 | }
54 | break;
55 | case '--message':
56 | if (isset($args[$i + 1]) && !startsWith($args[$i + 1], '--')) {
57 | $parsedArgs['message'] = $args[++$i];
58 | } else {
59 | fwrite(STDERR, "Error: --message expects a value.\n");
60 | exit(1);
61 | }
62 | break;
63 | default:
64 | fwrite(STDERR, "⚠️ Warning: Unknown argument: {$args[$i]}\n");
65 | }
66 | }
67 | return $parsedArgs;
68 | }
69 |
70 | /**
71 | * Helper function to check if a string starts with a specific prefix
72 | *
73 | * @param string $string The string to check
74 | * @param string $prefix The prefix
75 | * @return bool True if the string starts with the prefix, otherwise False
76 | */
77 | function startsWith($string, $prefix) {
78 | return substr($string, 0, strlen($prefix)) === $prefix;
79 | }
80 |
81 | /**
82 | * Function for interactively prompting a parameter (optional)
83 | *
84 | * @param string $prompt The prompt message
85 | * @return string User input
86 | */
87 | function askQuestionPrompt($prompt) {
88 | if (preg_match('/^win/i', PHP_OS)) {
89 | // Windows-specific input prompt
90 | $vbscript = sys_get_temp_dir() . 'prompt_input.vbs';
91 | file_put_contents($vbscript, 'wscript.echo(InputBox("' . addslashes($prompt) . '", "", ""))');
92 | $response = shell_exec("cscript //nologo " . escapeshellarg($vbscript));
93 | unlink($vbscript);
94 | return trim($response);
95 | } else {
96 | // Unix/Linux input prompt
97 | echo $prompt;
98 | $handle = fopen("php://stdin", "r");
99 | $response = trim(fgets($handle));
100 | fclose($handle);
101 | return $response;
102 | }
103 | }
104 |
105 | /**
106 | * Function to send a Continue Chat request over a TCP connection
107 | *
108 | * @param string $serverIp Server IP address
109 | * @param int $serverPort Server port
110 | * @param array $payload Payload to send as an associative array
111 | * @return array Server response as an associative array
112 | * @throws Exception On connection errors or JSON parsing errors
113 | */
114 | function sendContinueChatRequest($serverIp, $serverPort, $payload) {
115 | $jsonPayload = json_encode($payload);
116 | if ($jsonPayload === false) {
117 | throw new Exception("Error encoding JSON payload.");
118 | }
119 |
120 | $errno = 0;
121 | $errstr = '';
122 | $timeout = 30; // seconds
123 | $client = @fsockopen($serverIp, $serverPort, $errno, $errstr, $timeout);
124 |
125 | if (!$client) {
126 | throw new Exception("Connection error: $errstr ($errno)");
127 | }
128 |
129 | echo "🔗 Connected to server ({$serverIp}:{$serverPort}).\n";
130 | echo "📤 Sending payload: $jsonPayload\n";
131 |
132 | fwrite($client, $jsonPayload);
133 |
134 | $responseData = '';
135 | stream_set_timeout($client, $timeout);
136 |
137 | while (!feof($client)) {
138 | $data = fread($client, 1024);
139 | if ($data === false) {
140 | throw new Exception("Error reading data from server.");
141 | }
142 | if ($data === '') {
143 | break; // No more data
144 | }
145 | echo "📥 Received data: $data\n";
146 | $responseData .= $data;
147 |
148 | // Attempt to parse received data as JSON
149 | $parsedData = json_decode($responseData, true);
150 | if ($parsedData !== null) {
151 | echo "✅ JSON response successfully parsed.\n";
152 | fclose($client);
153 | return $parsedData;
154 | }
155 |
156 | // Check if the stream timed out
157 | $info = stream_get_meta_data($client);
158 | if ($info['timed_out']) {
159 | throw new Exception("Timeout waiting for data from server.");
160 | }
161 | }
162 |
163 | fclose($client);
164 | throw new Exception("Connection to server closed before a complete response was received.");
165 | }
166 |
167 | /**
168 | * Main function of the script
169 | */
170 | function main($argv) {
171 | $parsedArgs = parseArguments($argv);
172 | $serverIp = $parsedArgs['serverIp'] ?? null;
173 | $serverPort = $parsedArgs['serverPort'] ?? null;
174 | $token = $parsedArgs['token'] ?? null;
175 | $conversationId = $parsedArgs['conversationId'] ?? null;
176 | $message = $parsedArgs['message'] ?? null;
177 |
178 | // Check if all required parameters are present
179 | if (!$serverIp || !$serverPort || !$token || !$conversationId || !$message) {
180 | fwrite(STDERR, "❌ ERROR: Missing required parameters.\n");
181 | fwrite(STDOUT, "Usage: php MCPContinueChatClient.php --server-ip <IP> --server-port <Port> --token <Token> --conversation-id <ConversationID> --message <Message>\n");
182 | exit(1);
183 | }
184 |
185 | $payload = [
186 | "command" => "continue_chat",
187 | "token" => $token,
188 | "arguments" => [
189 | "chatId" => $conversationId,
190 | "question" => $message
191 | ]
192 | ];
193 |
194 | try {
195 | echo "💬 Sending Continue Chat request...\n";
196 | $response = sendContinueChatRequest($serverIp, $serverPort, $payload);
197 | echo "✅ Server Response:\n";
198 | echo json_encode($response, JSON_PRETTY_PRINT) . "\n";
199 | } catch (Exception $e) {
200 | fwrite(STDERR, "❌ ERROR: " . $e->getMessage() . "\n");
201 | }
202 | }
203 |
204 | main($argv);
205 | ?>
206 |
```
--------------------------------------------------------------------------------
/clients/PHP/3.4 mcp_delete_source/MCPDeleteSourceClient.php:
--------------------------------------------------------------------------------
```php
1 | <?php
2 | /**
3 | * MCPDeleteSourceClient.php
4 | *
5 | * A PHP script acting as a Delete Source Client. It connects to a server via TCP,
6 | * sends a request to delete an existing source, and receives the server's response.
7 | *
8 | * Usage:
9 | * php MCPDeleteSourceClient.php --server-ip <IP> --server-port <Port> --token <Token> --source-id <SourceID>
10 | */
11 |
12 | /**
13 | * Function to parse command line arguments
14 | *
15 | * @param array $args Command line arguments
16 | * @return array Associative array of parsed arguments
17 | */
18 | function parseArguments($args) {
19 | $parsedArgs = [];
20 | $argc = count($args);
21 | for ($i = 1; $i < $argc; $i++) {
22 | switch ($args[$i]) {
23 | case '--server-ip':
24 | if (isset($args[$i + 1]) && !startsWith($args[$i + 1], '--')) {
25 | $parsedArgs['serverIp'] = $args[++$i];
26 | } else {
27 | fwrite(STDERR, "Error: --server-ip expects a value.\n");
28 | exit(1);
29 | }
30 | break;
31 | case '--server-port':
32 | if (isset($args[$i + 1]) && !startsWith($args[$i + 1], '--')) {
33 | $parsedArgs['serverPort'] = intval($args[++$i]);
34 | } else {
35 | fwrite(STDERR, "Error: --server-port expects a value.\n");
36 | exit(1);
37 | }
38 | break;
39 | case '--token':
40 | if (isset($args[$i + 1]) && !startsWith($args[$i + 1], '--')) {
41 | $parsedArgs['token'] = $args[++$i];
42 | } else {
43 | fwrite(STDERR, "Error: --token expects a value.\n");
44 | exit(1);
45 | }
46 | break;
47 | case '--source-id':
48 | if (isset($args[$i + 1]) && !startsWith($args[$i + 1], '--')) {
49 | $parsedArgs['sourceId'] = $args[++$i];
50 | } else {
51 | fwrite(STDERR, "Error: --source-id expects a value.\n");
52 | exit(1);
53 | }
54 | break;
55 | default:
56 | fwrite(STDERR, "⚠️ Warning: Unknown argument: {$args[$i]}\n");
57 | }
58 | }
59 | return $parsedArgs;
60 | }
61 |
62 | /**
63 | * Helper function to check if a string starts with a specific prefix
64 | *
65 | * @param string $string The string to check
66 | * @param string $prefix The prefix
67 | * @return bool True if the string starts with the prefix, otherwise False
68 | */
69 | function startsWith($string, $prefix) {
70 | return substr($string, 0, strlen($prefix)) === $prefix;
71 | }
72 |
73 | /**
74 | * Function for interactively prompting a parameter (optional)
75 | *
76 | * @param string $prompt The prompt message
77 | * @return string User input
78 | */
79 | function askQuestionPrompt($prompt) {
80 | if (preg_match('/^win/i', PHP_OS)) {
81 | $vbscript = sys_get_temp_dir() . 'prompt_input.vbs';
82 | file_put_contents($vbscript, 'wscript.echo(InputBox("' . addslashes($prompt) . '", "", ""))');
83 | $response = shell_exec("cscript //nologo " . escapeshellarg($vbscript));
84 | unlink($vbscript);
85 | return trim($response);
86 | } else {
87 | echo $prompt;
88 | $handle = fopen("php://stdin", "r");
89 | $response = trim(fgets($handle));
90 | fclose($handle);
91 | return $response;
92 | }
93 | }
94 |
95 | /**
96 | * Function to send a Delete Source request over a TCP connection
97 | *
98 | * @param string $serverIp The server's IP address
99 | * @param int $serverPort The server's port
100 | * @param array $payload The payload to send as an associative array
101 | * @return array The response received from the server as an associative array
102 | * @throws Exception On connection errors or JSON parsing errors
103 | */
104 | function sendDeleteSourceRequest($serverIp, $serverPort, $payload) {
105 | $jsonPayload = json_encode($payload);
106 | if ($jsonPayload === false) {
107 | throw new Exception("Error while coding the JSON payload: " . json_last_error_msg());
108 | }
109 |
110 | $errno = 0;
111 | $errstr = '';
112 | $timeout = 10; // Seconds
113 | $client = @fsockopen($serverIp, $serverPort, $errno, $errstr, $timeout);
114 |
115 | if (!$client) {
116 | throw new Exception("Connection error: $errstr ($errno)");
117 | }
118 |
119 | echo "🔗 Connected to the server ({$serverIp}:{$serverPort}).\n";
120 | echo "📤 Sending payload: $jsonPayload\n";
121 |
122 | fwrite($client, $jsonPayload);
123 |
124 | $responseData = '';
125 | stream_set_timeout($client, $timeout);
126 |
127 | while (!feof($client)) {
128 | $data = fread($client, 1024);
129 | if ($data === false) {
130 | throw new Exception("Error reading data from the server.");
131 | }
132 | if ($data === '') {
133 | break; // No more data
134 | }
135 | echo "📥 Received data: $data\n";
136 | $responseData .= $data;
137 |
138 | $parsedData = json_decode($responseData, true);
139 | if ($parsedData !== null) {
140 | echo "✅ JSON response successfully parsed.\n";
141 | fclose($client);
142 | return $parsedData;
143 | }
144 |
145 | $info = stream_get_meta_data($client);
146 | if ($info['timed_out']) {
147 | throw new Exception("Timeout waiting for data from the server.");
148 | }
149 | }
150 |
151 | fclose($client);
152 | throw new Exception("Connection to the server was closed before a complete response was received.");
153 | }
154 |
155 | /**
156 | * Main function of the script
157 | */
158 | function main($argv) {
159 | $parsedArgs = parseArguments($argv);
160 | $serverIp = $parsedArgs['serverIp'] ?? null;
161 | $serverPort = $parsedArgs['serverPort'] ?? null;
162 | $token = $parsedArgs['token'] ?? null;
163 | $sourceId = $parsedArgs['sourceId'] ?? null;
164 |
165 | if (!$serverIp) {
166 | $serverIp = askQuestionPrompt('🔗 Please enter the server IP: ');
167 | }
168 | if (!$serverPort) {
169 | $portInput = askQuestionPrompt('🔗 Please enter the server port: ');
170 | $serverPort = intval($portInput);
171 | if ($serverPort <= 0) {
172 | fwrite(STDERR, "❌ ERROR: Invalid server port.\n");
173 | exit(1);
174 | }
175 | }
176 | if (!$token) {
177 | $token = askQuestionPrompt('🔒 Please enter your authentication token: ');
178 | }
179 | if (!$sourceId) {
180 | $sourceId = askQuestionPrompt('📁 Please enter the Source ID: ');
181 | }
182 |
183 | if (!$serverIp || !$serverPort || !$token || !$sourceId) {
184 | fwrite(STDERR, "❌ ERROR: Missing required parameters.\n");
185 | fwrite(STDOUT, "Usage: php MCPDeleteSourceClient.php --server-ip <IP> --server-port <Port> --token <Token> --source-id <SourceID>\n");
186 | exit(1);
187 | }
188 |
189 | $payload = [
190 | "command" => "delete_source",
191 | "token" => $token,
192 | "arguments" => [
193 | "sourceId" => $sourceId
194 | ]
195 | ];
196 |
197 | try {
198 | echo "🗑️ Sending Delete Source request...\n";
199 | $response = sendDeleteSourceRequest($serverIp, $serverPort, $payload);
200 | echo "✅ Server Response:\n";
201 | echo json_encode($response, JSON_PRETTY_PRINT) . "\n";
202 | } catch (Exception $e) {
203 | fwrite(STDERR, "❌ ERROR: " . $e->getMessage() . "\n");
204 | }
205 | }
206 |
207 | if (version_compare(PHP_VERSION, '7.1.0') < 0) {
208 | fwrite(STDERR, "❌ ERROR: This script requires PHP version 7.1 or higher.\n");
209 | exit(1);
210 | }
211 |
212 | main($argv);
213 | ?>
214 |
```
--------------------------------------------------------------------------------
/clients/PHP/4.2 mcp_delete_group/MCPDeleteGroupClient.php:
--------------------------------------------------------------------------------
```php
1 | <?php
2 | /**
3 | * MCPDeleteGroupClient.php
4 | *
5 | * A PHP script acting as a Delete Group Client. It connects to a server via TCP,
6 | * sends a request to delete an existing group, and receives the server's response.
7 | *
8 | * Usage:
9 | * php MCPDeleteGroupClient.php --server-ip <IP> --server-port <Port> --token <Token> --group-name <GroupName>
10 | */
11 |
12 | /**
13 | * Function to parse command line arguments
14 | *
15 | * @param array $args Command line arguments
16 | * @return array Associative array of parsed arguments
17 | */
18 | function parseArguments($args) {
19 | $parsedArgs = [];
20 | $argc = count($args);
21 | for ($i = 1; $i < $argc; $i++) {
22 | switch ($args[$i]) {
23 | case '--server-ip':
24 | if (isset($args[$i + 1]) && !startsWith($args[$i + 1], '--')) {
25 | $parsedArgs['serverIp'] = $args[++$i];
26 | } else {
27 | fwrite(STDERR, "⚠️ Warning: No value provided for --server-ip.\n");
28 | }
29 | break;
30 | case '--server-port':
31 | if (isset($args[$i + 1]) && !startsWith($args[$i + 1], '--')) {
32 | $parsedArgs['serverPort'] = intval($args[++$i]);
33 | } else {
34 | fwrite(STDERR, "⚠️ Warning: No value provided for --server-port.\n");
35 | }
36 | break;
37 | case '--token':
38 | if (isset($args[$i + 1]) && !startsWith($args[$i + 1], '--')) {
39 | $parsedArgs['token'] = $args[++$i];
40 | } else {
41 | fwrite(STDERR, "⚠️ Warning: No value provided for --token.\n");
42 | }
43 | break;
44 | case '--group-name':
45 | if (isset($args[$i + 1]) && !startsWith($args[$i + 1], '--')) {
46 | $parsedArgs['groupName'] = $args[++$i];
47 | } else {
48 | fwrite(STDERR, "⚠️ Warning: No value provided for --group-name.\n");
49 | }
50 | break;
51 | default:
52 | fwrite(STDERR, "⚠️ Warning: Unknown argument: {$args[$i]}\n");
53 | }
54 | }
55 | return $parsedArgs;
56 | }
57 |
58 | /**
59 | * Helper function to check if a string starts with a specific prefix
60 | *
61 | * @param string $string The string to check
62 | * @param string $prefix The prefix
63 | * @return bool True if the string starts with the prefix, otherwise False
64 | */
65 | function startsWith($string, $prefix) {
66 | return substr($string, 0, strlen($prefix)) === $prefix;
67 | }
68 |
69 | /**
70 | * Function for interactively prompting a parameter (optional)
71 | *
72 | * @param string $prompt The prompt message
73 | * @return string User input
74 | */
75 | function askQuestionPrompt($prompt) {
76 | if (preg_match('/^win/i', PHP_OS)) {
77 | $vbscript = sys_get_temp_dir() . 'prompt_input.vbs';
78 | file_put_contents($vbscript, 'wscript.echo(InputBox("' . addslashes($prompt) . '", "", ""))');
79 | $response = shell_exec("cscript //nologo " . escapeshellarg($vbscript));
80 | unlink($vbscript);
81 | return trim($response);
82 | } else {
83 | echo $prompt;
84 | $handle = fopen("php://stdin", "r");
85 | $response = trim(fgets($handle));
86 | fclose($handle);
87 | return $response;
88 | }
89 | }
90 |
91 | /**
92 | * Function to send a Delete Group request over a TCP connection
93 | *
94 | * @param string $serverIp The server's IP address
95 | * @param int $serverPort The server's port
96 | * @param string $token The authentication token
97 | * @param string $groupName The name of the group to be deleted
98 | * @return array The response received from the server as an associative array
99 | * @throws Exception On connection errors or JSON parsing errors
100 | */
101 | function sendDeleteGroupRequest($serverIp, $serverPort, $token, $groupName) {
102 | $payload = [
103 | "command" => "delete_group",
104 | "token" => $token,
105 | "arguments" => [
106 | "groupName" => $groupName
107 | ]
108 | ];
109 |
110 | $jsonPayload = json_encode($payload);
111 | if ($jsonPayload === false) {
112 | throw new Exception("Error while coding the JSON payload: " . json_last_error_msg());
113 | }
114 |
115 | $errno = 0;
116 | $errstr = '';
117 | $timeoutDuration = 10; // Seconds
118 | $client = @fsockopen($serverIp, $serverPort, $errno, $errstr, $timeoutDuration);
119 |
120 | if (!$client) {
121 | throw new Exception("Connection error: $errstr ($errno)");
122 | }
123 |
124 | echo "🔗 Connected to the server ({$serverIp}:{$serverPort}).\n";
125 | echo "📤 Sending payload: $jsonPayload\n";
126 |
127 | fwrite($client, $jsonPayload);
128 |
129 | $responseData = '';
130 | stream_set_timeout($client, $timeoutDuration);
131 |
132 | while (!feof($client)) {
133 | $data = fread($client, 1024);
134 | if ($data === false) {
135 | throw new Exception("Error reading data from the server.");
136 | }
137 | if ($data === '') {
138 | break;
139 | }
140 | echo "📥 Received data: $data\n";
141 | $responseData .= $data;
142 |
143 | $parsedData = json_decode($responseData, true);
144 | if ($parsedData !== null) {
145 | echo "✅ JSON response successfully parsed.\n";
146 | fclose($client);
147 | return $parsedData;
148 | }
149 |
150 | $info = stream_get_meta_data($client);
151 | if ($info['timed_out']) {
152 | throw new Exception("Timeout waiting for data from the server.");
153 | }
154 | }
155 |
156 | fclose($client);
157 | throw new Exception("Connection to the server was closed before a complete response was received.");
158 | }
159 |
160 | /**
161 | * Main function of the script
162 | */
163 | function main($argv) {
164 | $parsedArgs = parseArguments($argv);
165 | $serverIp = $parsedArgs['serverIp'] ?? null;
166 | $serverPort = $parsedArgs['serverPort'] ?? null;
167 | $token = $parsedArgs['token'] ?? null;
168 | $groupName = $parsedArgs['groupName'] ?? null;
169 |
170 | if (!$serverIp) {
171 | $serverIp = askQuestionPrompt('🔗 Please enter the server IP: ');
172 | }
173 | if (!$serverPort) {
174 | $portInput = askQuestionPrompt('🔗 Please enter the server port: ');
175 | $serverPort = intval($portInput);
176 | if ($serverPort <= 0) {
177 | fwrite(STDERR, "❌ ERROR: Invalid server port.\n");
178 | exit(1);
179 | }
180 | }
181 | if (!$token) {
182 | $token = askQuestionPrompt('🔒 Please enter your authentication token: ');
183 | }
184 | if (!$groupName) {
185 | $groupName = askQuestionPrompt('👥 Please enter the group name: ');
186 | }
187 |
188 | if (!$serverIp || !$serverPort || !$token || !$groupName) {
189 | fwrite(STDERR, "❌ ERROR: Missing required parameters.\n");
190 | fwrite(STDOUT, "Usage: php MCPDeleteGroupClient.php --server-ip <IP> --server-port <Port> --token <Token> --group-name <GroupName>\n");
191 | exit(1);
192 | }
193 |
194 | try {
195 | echo "🗑️ Sending Delete Group request...\n";
196 | $response = sendDeleteGroupRequest($serverIp, $serverPort, $token, $groupName);
197 | echo "✔️ Server Response:\n";
198 | echo json_encode($response, JSON_PRETTY_PRINT) . "\n";
199 | } catch (Exception $e) {
200 | fwrite(STDERR, "❌ ERROR: " . $e->getMessage() . "\n");
201 | }
202 | }
203 |
204 | if (version_compare(PHP_VERSION, '7.1.0') < 0) {
205 | fwrite(STDERR, "❌ ERROR: This script requires PHP version 7.1 or higher.\n");
206 | exit(1);
207 | }
208 |
209 | main($argv);
210 | ?>
211 |
```
--------------------------------------------------------------------------------
/clients/PHP/2.2 mcp_get_chat_info/MCPGetChatInfoClient.php:
--------------------------------------------------------------------------------
```php
1 | <?php
2 | /**
3 | * MCPGetChatInfoClient.php
4 | *
5 | * A PHP script acting as a Get Chat Info Client. It connects to a server via TCP,
6 | * sends a request to retrieve chat information, and receives the server's response.
7 | *
8 | * Usage:
9 | * php MCPGetChatInfoClient.php --server-ip <IP> --server-port <Port> --token <Token> --chat-id <ChatID>
10 | */
11 |
12 | /**
13 | * Function to parse command line arguments
14 | *
15 | * @param array $args Command line arguments
16 | * @return array Associative array of parsed arguments
17 | */
18 | function parseArguments($args) {
19 | $parsedArgs = [];
20 | $argc = count($args);
21 | for ($i = 1; $i < $argc; $i++) {
22 | switch ($args[$i]) {
23 | case '--server-ip':
24 | if (isset($args[$i + 1]) && !startsWith($args[$i + 1], '--')) {
25 | $parsedArgs['serverIp'] = $args[++$i];
26 | } else {
27 | fwrite(STDERR, "Error: --server-ip expects a value.\n");
28 | exit(1);
29 | }
30 | break;
31 | case '--server-port':
32 | if (isset($args[$i + 1]) && !startsWith($args[$i + 1], '--')) {
33 | $parsedArgs['serverPort'] = intval($args[++$i]);
34 | } else {
35 | fwrite(STDERR, "Error: --server-port expects a value.\n");
36 | exit(1);
37 | }
38 | break;
39 | case '--token':
40 | if (isset($args[$i + 1]) && !startsWith($args[$i + 1], '--')) {
41 | $parsedArgs['token'] = $args[++$i];
42 | } else {
43 | fwrite(STDERR, "Error: --token expects a value.\n");
44 | exit(1);
45 | }
46 | break;
47 | case '--chat-id':
48 | if (isset($args[$i + 1]) && !startsWith($args[$i + 1], '--')) {
49 | $parsedArgs['chatId'] = $args[++$i];
50 | } else {
51 | fwrite(STDERR, "Error: --chat-id expects a value.\n");
52 | exit(1);
53 | }
54 | break;
55 | default:
56 | fwrite(STDERR, "⚠️ Warning: Unknown argument: {$args[$i]}\n");
57 | }
58 | }
59 | return $parsedArgs;
60 | }
61 |
62 | /**
63 | * Helper function to check if a string starts with a specific prefix
64 | *
65 | * @param string $string The string to check
66 | * @param string $prefix The prefix
67 | * @return bool True if the string starts with the prefix, otherwise False
68 | */
69 | function startsWith($string, $prefix) {
70 | return substr($string, 0, strlen($prefix)) === $prefix;
71 | }
72 |
73 | /**
74 | * Function for interactively prompting a parameter (optional)
75 | *
76 | * @param string $prompt The prompt message
77 | * @return string User input
78 | */
79 | function askQuestionPrompt($prompt) {
80 | if (preg_match('/^win/i', PHP_OS)) {
81 | // Windows-specific input prompt
82 | $vbscript = sys_get_temp_dir() . 'prompt_input.vbs';
83 | file_put_contents($vbscript, 'wscript.echo(InputBox("' . addslashes($prompt) . '", "", ""))');
84 | $response = shell_exec("cscript //nologo " . escapeshellarg($vbscript));
85 | unlink($vbscript);
86 | return trim($response);
87 | } else {
88 | // Unix/Linux input prompt
89 | echo $prompt;
90 | $handle = fopen("php://stdin", "r");
91 | $response = trim(fgets($handle));
92 | fclose($handle);
93 | return $response;
94 | }
95 | }
96 |
97 | /**
98 | * Function to send a request over a TCP connection
99 | *
100 | * @param string $serverIp The server's IP address
101 | * @param int $serverPort The server's port
102 | * @param array $payload The payload to send as an associative array
103 | * @return array The response received from the server as an associative array
104 | * @throws Exception On connection errors or JSON parsing errors
105 | */
106 | function sendRequest($serverIp, $serverPort, $payload) {
107 | $jsonPayload = json_encode($payload);
108 | if ($jsonPayload === false) {
109 | throw new Exception("Error while coding the JSON payload: " . json_last_error_msg());
110 | }
111 |
112 | $errno = 0;
113 | $errstr = '';
114 | $timeout = 30; // seconds
115 | $client = @fsockopen($serverIp, $serverPort, $errno, $errstr, $timeout);
116 |
117 | if (!$client) {
118 | throw new Exception("Connection error: $errstr ($errno)");
119 | }
120 |
121 | echo "🔗 Connected to the server ({$serverIp}:{$serverPort}).\n";
122 | echo "📤 Sending payload: $jsonPayload\n";
123 |
124 | fwrite($client, $jsonPayload);
125 |
126 | $responseData = '';
127 | stream_set_timeout($client, $timeout);
128 |
129 | while (!feof($client)) {
130 | $data = fread($client, 1024);
131 | if ($data === false) {
132 | throw new Exception("Error reading data from the server.");
133 | }
134 | if ($data === '') {
135 | break; // No more data
136 | }
137 | echo "📥 Received data: $data\n";
138 | $responseData .= $data;
139 |
140 | // Attempt to parse received data as JSON
141 | $parsedData = json_decode($responseData, true);
142 | if ($parsedData !== null) {
143 | echo "✅ JSON response successfully parsed.\n";
144 | fclose($client);
145 | return $parsedData;
146 | }
147 |
148 | // Check if the stream timed out
149 | $info = stream_get_meta_data($client);
150 | if ($info['timed_out']) {
151 | throw new Exception("Timeout waiting for data from the server.");
152 | }
153 | }
154 |
155 | fclose($client);
156 | throw new Exception("Connection to the server was closed before a complete response was received.");
157 | }
158 |
159 | /**
160 | * Main function of the script
161 | */
162 | function main($argv) {
163 | $parsedArgs = parseArguments($argv);
164 | $serverIp = $parsedArgs['serverIp'] ?? null;
165 | $serverPort = $parsedArgs['serverPort'] ?? null;
166 | $token = $parsedArgs['token'] ?? null;
167 | $chatId = $parsedArgs['chatId'] ?? null;
168 |
169 | // Interactively prompt for missing parameters
170 | if (!$serverIp) {
171 | $serverIp = askQuestionPrompt('🔗 Please enter the server IP: ');
172 | }
173 | if (!$serverPort) {
174 | $portInput = askQuestionPrompt('🔗 Please enter the server port: ');
175 | $serverPort = intval($portInput);
176 | if ($serverPort <= 0) {
177 | fwrite(STDERR, "❌ ERROR: Invalid server port.\n");
178 | exit(1);
179 | }
180 | }
181 | if (!$token) {
182 | $token = askQuestionPrompt('🔒 Please enter your authentication token: ');
183 | }
184 | if (!$chatId) {
185 | $chatId = askQuestionPrompt('💬 Please enter the Chat ID: ');
186 | }
187 |
188 | // Check if all required parameters are now present
189 | if (!$serverIp || !$serverPort || !$token || !$chatId) {
190 | fwrite(STDERR, "❌ ERROR: Missing required parameters.\n");
191 | fwrite(STDOUT, "Usage: php MCPGetChatInfoClient.php --server-ip <IP> --server-port <Port> --token <Token> --chat-id <ChatID>\n");
192 | exit(1);
193 | }
194 |
195 | $payload = [
196 | "command" => "get_chat_info",
197 | "token" => $token,
198 | "arguments" => [
199 | "chatId" => $chatId
200 | ]
201 | ];
202 |
203 | try {
204 | echo "📤 Sending request...\n";
205 | $response = sendRequest($serverIp, $serverPort, $payload);
206 | echo "✅ Server Response:\n";
207 | echo json_encode($response, JSON_PRETTY_PRINT) . "\n";
208 | } catch (Exception $e) {
209 | fwrite(STDERR, "❌ ERROR: " . $e->getMessage() . "\n");
210 | }
211 | }
212 |
213 | // Ensure PHP version is at least 7.1
214 | if (version_compare(PHP_VERSION, '7.1.0') < 0) {
215 | fwrite(STDERR, "❌ ERROR: This script requires PHP version 7.1 or higher.\n");
216 | exit(1);
217 | }
218 |
219 | // Call the main function
220 | main($argv);
221 | ?>
222 |
```