#
tokens: 49207/50000 22/511 files (page 10/20)
lines: on (toggle) GitHub
raw markdown copy reset
This is page 10 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

--------------------------------------------------------------------------------
/clients/C# .Net/5.0 mcp_store_user/Program.cs:
--------------------------------------------------------------------------------

```csharp
  1 | using System;
  2 | using System.Collections.Generic;
  3 | using System.Net.Sockets;
  4 | using System.Text;
  5 | using Newtonsoft.Json;
  6 | 
  7 | namespace MCPStoreUserClient
  8 | {
  9 |     class Program
 10 |     {
 11 |         static void Main(string[] args)
 12 |         {
 13 |             if (args.Length < 14)
 14 |             {
 15 |                 Console.WriteLine("Usage: --server-ip <IP> --server-port <PORT> --token <TOKEN> --name <NAME> --email <EMAIL> --password <PASSWORD> [--language <LANG>] [--timezone <TIMEZONE>] [--roles <ROLE1 ROLE2>] [--groups <GROUP1 GROUP2>] [--usePublic] [--activateFtp] [--ftpPassword <FTP_PASSWORD>]");
 16 |                 return;
 17 |             }
 18 | 
 19 |             string serverIp = GetArgument(args, "--server-ip");
 20 |             int serverPort = int.Parse(GetArgument(args, "--server-port"));
 21 |             string token = GetArgument(args, "--token");
 22 |             string name = GetArgument(args, "--name");
 23 |             string email = GetArgument(args, "--email");
 24 |             string password = GetArgument(args, "--password");
 25 |             string language = GetArgument(args, "--language") ?? "en";
 26 |             string timezone = GetArgument(args, "--timezone") ?? "Europe/Berlin";
 27 |             List<string> roles = GetListArgument(args, "--roles");
 28 |             List<string> groups = GetListArgument(args, "--groups");
 29 |             bool usePublic = Array.Exists(args, arg => arg == "--usePublic");
 30 |             bool activateFtp = Array.Exists(args, arg => arg == "--activateFtp");
 31 |             string ftpPassword = GetArgument(args, "--ftpPassword") ?? "";
 32 | 
 33 |             var payload = new
 34 |             {
 35 |                 command = "store_user",
 36 |                 token = token,
 37 |                 arguments = new
 38 |                 {
 39 |                     name = name,
 40 |                     email = email,
 41 |                     password = password,
 42 |                     language = language,
 43 |                     timezone = timezone,
 44 |                     roles = roles,
 45 |                     groups = groups,
 46 |                     usePublic = usePublic,
 47 |                     activateFtp = activateFtp,
 48 |                     ftpPassword = ftpPassword
 49 |                 }
 50 |             };
 51 | 
 52 |             Console.WriteLine("📤 Sending store user request...");
 53 |             string response = SendRequest(serverIp, serverPort, payload);
 54 |             Console.WriteLine("✔️ Response from server:");
 55 |             Console.WriteLine(response);
 56 |         }
 57 | 
 58 |         static string GetArgument(string[] args, string key)
 59 |         {
 60 |             int index = Array.IndexOf(args, key);
 61 |             return index >= 0 && index < args.Length - 1 ? args[index + 1] : null;
 62 |         }
 63 | 
 64 |         static List<string> GetListArgument(string[] args, string key)
 65 |         {
 66 |             int index = Array.IndexOf(args, key);
 67 |             List<string> values = new List<string>();
 68 |             if (index >= 0)
 69 |             {
 70 |                 for (int i = index + 1; i < args.Length && !args[i].StartsWith("--"); i++)
 71 |                 {
 72 |                     values.Add(args[i]);
 73 |                 }
 74 |             }
 75 |             return values;
 76 |         }
 77 | 
 78 |         static string SendRequest(string serverIp, int serverPort, object payload)
 79 |         {
 80 |             string payloadJson = JsonConvert.SerializeObject(payload);
 81 | 
 82 |             try
 83 |             {
 84 |                 using (TcpClient client = new TcpClient(serverIp, serverPort))
 85 |                 {
 86 |                     NetworkStream stream = client.GetStream();
 87 | 
 88 |                     // Send payload
 89 |                     byte[] data = Encoding.UTF8.GetBytes(payloadJson);
 90 |                     stream.Write(data, 0, data.Length);
 91 | 
 92 |                     // Receive response
 93 |                     byte[] buffer = new byte[4096];
 94 |                     int bytesRead;
 95 |                     StringBuilder response = new StringBuilder();
 96 | 
 97 |                     do
 98 |                     {
 99 |                         bytesRead = stream.Read(buffer, 0, buffer.Length);
100 |                         response.Append(Encoding.UTF8.GetString(buffer, 0, bytesRead));
101 |                     } while (bytesRead == buffer.Length);
102 | 
103 |                     return response.ToString();
104 |                 }
105 |             }
106 |             catch (Exception e)
107 |             {
108 |                 return $"Error: {e.Message}";
109 |             }
110 |         }
111 |     }
112 | }
113 | 
```

--------------------------------------------------------------------------------
/clients/C# .Net/Code Archiv/mcp_store_user.cs:
--------------------------------------------------------------------------------

```csharp
  1 | using System;
  2 | using System.Collections.Generic;
  3 | using System.Net.Sockets;
  4 | using System.Text;
  5 | using Newtonsoft.Json;
  6 | 
  7 | namespace MCPStoreUserClient
  8 | {
  9 |     class Program
 10 |     {
 11 |         static void Main(string[] args)
 12 |         {
 13 |             if (args.Length < 14)
 14 |             {
 15 |                 Console.WriteLine("Usage: --server-ip <IP> --server-port <PORT> --token <TOKEN> --name <NAME> --email <EMAIL> --password <PASSWORD> [--language <LANG>] [--timezone <TIMEZONE>] [--roles <ROLE1 ROLE2>] [--groups <GROUP1 GROUP2>] [--usePublic] [--activateFtp] [--ftpPassword <FTP_PASSWORD>]");
 16 |                 return;
 17 |             }
 18 | 
 19 |             string serverIp = GetArgument(args, "--server-ip");
 20 |             int serverPort = int.Parse(GetArgument(args, "--server-port"));
 21 |             string token = GetArgument(args, "--token");
 22 |             string name = GetArgument(args, "--name");
 23 |             string email = GetArgument(args, "--email");
 24 |             string password = GetArgument(args, "--password");
 25 |             string language = GetArgument(args, "--language") ?? "en";
 26 |             string timezone = GetArgument(args, "--timezone") ?? "Europe/Berlin";
 27 |             List<string> roles = GetListArgument(args, "--roles");
 28 |             List<string> groups = GetListArgument(args, "--groups");
 29 |             bool usePublic = Array.Exists(args, arg => arg == "--usePublic");
 30 |             bool activateFtp = Array.Exists(args, arg => arg == "--activateFtp");
 31 |             string ftpPassword = GetArgument(args, "--ftpPassword") ?? "";
 32 | 
 33 |             var payload = new
 34 |             {
 35 |                 command = "store_user",
 36 |                 token = token,
 37 |                 arguments = new
 38 |                 {
 39 |                     name = name,
 40 |                     email = email,
 41 |                     password = password,
 42 |                     language = language,
 43 |                     timezone = timezone,
 44 |                     roles = roles,
 45 |                     groups = groups,
 46 |                     usePublic = usePublic,
 47 |                     activateFtp = activateFtp,
 48 |                     ftpPassword = ftpPassword
 49 |                 }
 50 |             };
 51 | 
 52 |             Console.WriteLine("📤 Sending store user request...");
 53 |             string response = SendRequest(serverIp, serverPort, payload);
 54 |             Console.WriteLine("✔️ Response from server:");
 55 |             Console.WriteLine(response);
 56 |         }
 57 | 
 58 |         static string GetArgument(string[] args, string key)
 59 |         {
 60 |             int index = Array.IndexOf(args, key);
 61 |             return index >= 0 && index < args.Length - 1 ? args[index + 1] : null;
 62 |         }
 63 | 
 64 |         static List<string> GetListArgument(string[] args, string key)
 65 |         {
 66 |             int index = Array.IndexOf(args, key);
 67 |             List<string> values = new List<string>();
 68 |             if (index >= 0)
 69 |             {
 70 |                 for (int i = index + 1; i < args.Length && !args[i].StartsWith("--"); i++)
 71 |                 {
 72 |                     values.Add(args[i]);
 73 |                 }
 74 |             }
 75 |             return values;
 76 |         }
 77 | 
 78 |         static string SendRequest(string serverIp, int serverPort, object payload)
 79 |         {
 80 |             string payloadJson = JsonConvert.SerializeObject(payload);
 81 | 
 82 |             try
 83 |             {
 84 |                 using (TcpClient client = new TcpClient(serverIp, serverPort))
 85 |                 {
 86 |                     NetworkStream stream = client.GetStream();
 87 | 
 88 |                     // Send payload
 89 |                     byte[] data = Encoding.UTF8.GetBytes(payloadJson);
 90 |                     stream.Write(data, 0, data.Length);
 91 | 
 92 |                     // Receive response
 93 |                     byte[] buffer = new byte[4096];
 94 |                     int bytesRead;
 95 |                     StringBuilder response = new StringBuilder();
 96 | 
 97 |                     do
 98 |                     {
 99 |                         bytesRead = stream.Read(buffer, 0, buffer.Length);
100 |                         response.Append(Encoding.UTF8.GetString(buffer, 0, bytesRead));
101 |                     } while (bytesRead == buffer.Length);
102 | 
103 |                     return response.ToString();
104 |                 }
105 |             }
106 |             catch (Exception e)
107 |             {
108 |                 return $"Error: {e.Message}";
109 |             }
110 |         }
111 |     }
112 | }
113 | 
```

--------------------------------------------------------------------------------
/clients/Python/5.0 mcp_store_user/MCPStoreUserClient.py:
--------------------------------------------------------------------------------

```python
  1 | import socket
  2 | import ssl
  3 | import json
  4 | import argparse
  5 | import sys
  6 | 
  7 | def send_store_user_request(server_ip, server_port, token, name, email, password, language, timezone, roles, groups, usePublic, activateFtp, ftpPassword, use_ssl=True, accept_self_signed=False):
  8 |     """
  9 |     Sends a request to create a new user on the MCP server.
 10 |     """
 11 |     payload = {
 12 |         "command": "store_user",
 13 |         "token": token,
 14 |         "arguments": {
 15 |             "name": name,
 16 |             "email": email,
 17 |             "password": password,
 18 |             "language": language,
 19 |             "timezone": timezone,
 20 |             "roles": roles,
 21 |             "groups": groups,
 22 |             "usePublic": usePublic,
 23 |             "activateFtp": activateFtp,
 24 |             "ftpPassword": ftpPassword
 25 |         }
 26 |     }
 27 | 
 28 |     payload_json = json.dumps(payload)
 29 |     
 30 |     raw_socket = None
 31 |     client_socket = None
 32 | 
 33 |     try:
 34 |         raw_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 35 |         raw_socket.settimeout(10)
 36 | 
 37 |         if use_ssl:
 38 |             context = ssl.create_default_context()
 39 |             if accept_self_signed:
 40 |                 context.check_hostname = False
 41 |                 context.verify_mode = ssl.CERT_NONE
 42 |             client_socket = context.wrap_socket(raw_socket, server_hostname=server_ip)
 43 |         else:
 44 |             client_socket = raw_socket
 45 |         
 46 |         client_socket.connect((server_ip, server_port))
 47 |         client_socket.sendall(payload_json.encode('utf-8'))
 48 | 
 49 |         response = b""
 50 |         while True:
 51 |             part = client_socket.recv(4096)
 52 |             if not part:
 53 |                 break
 54 |             response += part
 55 | 
 56 |         return response.decode('utf-8')
 57 |     except ssl.SSLError:
 58 |         return "Error: Server and/or client may require TLS encryption. Please enable SSL/TLS."
 59 |     except Exception as e:
 60 |         return f"Error: {e}"
 61 |     
 62 |     finally:
 63 |         if client_socket is not None:
 64 |             try:
 65 |                 client_socket.shutdown(socket.SHUT_RDWR)
 66 |             except:
 67 |                 pass
 68 |             client_socket.close()
 69 | 
 70 | if __name__ == "__main__":
 71 |     parser = argparse.ArgumentParser(
 72 |         description="Send a request to create a new user on the MCP server.",
 73 |         formatter_class=argparse.RawTextHelpFormatter
 74 |     )
 75 |     parser.add_argument("--server-ip", required=True, help="IP address of the MCP server")
 76 |     parser.add_argument("--server-port", required=True, type=int, help="Port number of the MCP server")
 77 |     parser.add_argument("--token", required=True, help="Authentication token")
 78 |     parser.add_argument("--name", required=True, help="Name of the user")
 79 |     parser.add_argument("--email", required=True, help="Email of the user")
 80 |     parser.add_argument("--password", required=True, help="Password for the user")
 81 |     parser.add_argument("--language", default="en", help="Language code (optional)")
 82 |     parser.add_argument("--timezone", default="Europe/Berlin", help="Timezone (optional)")
 83 |     parser.add_argument("--roles", nargs="+", default=[], help="Roles for the user (optional)")
 84 |     parser.add_argument("--groups", nargs="+", default=[], help="Groups for the user (optional)")
 85 |     parser.add_argument("--usePublic", action="store_true", help="Use the public knowledge base")
 86 |     parser.add_argument("--activateFtp", action="store_true", help="Activate FTP for the user")
 87 |     parser.add_argument("--ftpPassword", default="", help="FTP password for the user (optional)")
 88 |     parser.add_argument("--use-ssl", action="store_true", help="Connect using SSL/TLS")
 89 |     parser.add_argument("--accept-self-signed", action="store_true", help="Accept self-signed certificates (disable certificate verification)")
 90 | 
 91 |     if len(sys.argv) == 1:
 92 |         parser.print_help(sys.stderr)
 93 |         sys.exit(1)
 94 | 
 95 |     args = parser.parse_args()
 96 | 
 97 |     response = send_store_user_request(
 98 |         args.server_ip,
 99 |         args.server_port,
100 |         args.token,
101 |         args.name,
102 |         args.email,
103 |         args.password,
104 |         args.language,
105 |         args.timezone,
106 |         args.roles,
107 |         args.groups,
108 |         args.usePublic,
109 |         args.activateFtp,
110 |         args.ftpPassword,
111 |         use_ssl=args.use_ssl,
112 |         accept_self_signed=args.accept_self_signed
113 |     )
114 |     print("Response from server:", response)
115 | 
```

--------------------------------------------------------------------------------
/agents/MCP-Client/Python/llm_client.py:
--------------------------------------------------------------------------------

```python
  1 | import logging
  2 | import os
  3 | import uuid
  4 | from typing import Any, Dict, List
  5 | 
  6 | import httpx
  7 | from dotenv import load_dotenv
  8 | from openai import OpenAI
  9 | 
 10 | 
 11 | # Load environment variables
 12 | load_dotenv()
 13 | 
 14 | 
 15 | class LLMClient:
 16 |     def __init__(self, provider="pgpt", model="pgpt-mistral-nemo-12b", api_key=None):
 17 |         # set the provider, model and api key
 18 |         self.provider = provider
 19 |         self.model = model
 20 | 
 21 | 
 22 | 
 23 |     def create_completion(
 24 |         self, messages: List[Dict], tools: List = None
 25 |     ) -> Dict[str, Any]:
 26 |         """Create a chat completion using the specified LLM provider."""
 27 |         if self.provider == "pgpt":
 28 |             return self._pgpt_completion(messages, tools)
 29 | 
 30 |         else:
 31 |             # unsupported providers
 32 |             raise ValueError(f"Unsupported provider: {self.provider}")
 33 | 
 34 | 
 35 | 
 36 |     def _pgpt_completion(self, messages: List[Dict], tools: List) -> Dict[str, Any]:
 37 |         vllm = os.getenv("USE_VLLM", "False")
 38 | 
 39 |         try:
 40 |             if vllm == "True":
 41 |                 base_url = os.getenv("PGPT_OAI_BASE_URL_VLLM")
 42 |                 if not base_url:
 43 |                     raise ValueError("The PGPT_OAI_BASE_URL_VLLM environment variable is not set.")
 44 |                 api_key = os.getenv("PGPT_API_KEY_VLLM")
 45 |                 if not api_key:
 46 |                     raise ValueError("The PGPT_API_KEY_VLLM environment variable is not set.")
 47 | 
 48 | 
 49 |                 http_client = httpx.Client(verify=False, http2=True)
 50 | 
 51 |                 client = OpenAI(
 52 |                     base_url=base_url,
 53 |                     api_key=api_key,
 54 |                     http_client=http_client
 55 |                 )
 56 | 
 57 |                 logging.info(f"Amount of messages: {len(messages)}")
 58 | 
 59 |                 response = client.chat.completions.create(
 60 |                     model="/models/mistral-nemo-12b",
 61 |                     temperature=0.8,
 62 |                     top_p=0.8,
 63 |                     messages=messages,
 64 |                     tools = tools or None,
 65 |                     stream = False
 66 |                 )
 67 |             else:
 68 |                 newSession = False
 69 |                 if len(messages) % 2:  # system prompt and user prompt
 70 |                     newSession = True
 71 | 
 72 |                 base_url = os.getenv("PGPT_OAI_BASE_URL")
 73 |                 if not base_url:
 74 |                     raise ValueError("The PGPT_OAI_BASE_URL environment variable is not set.")
 75 |                 api_key = os.getenv("PGPT_API_KEY")
 76 |                 if not api_key:
 77 |                     raise ValueError("The PGPT_API_KEY environment variable is not set.")
 78 | 
 79 |                 client = OpenAI(
 80 |                     api_key=api_key,
 81 |                     base_url=base_url  # change the default port if needed
 82 |                 )
 83 |                 response = client.chat.completions.create(
 84 |                     model="pgpt-mistral-nemo-12b",
 85 |                     messages=messages,
 86 |                     tools=tools or None,
 87 |                     extra_body={
 88 |                         "groups": [],
 89 |                         "newSession": newSession
 90 |                     },
 91 |                     stream = False)
 92 | 
 93 | 
 94 |             logging.info(f"PGPT raw response: {response}")
 95 | 
 96 |             # Extract the message and tool calls
 97 |             try:
 98 |                 message = response.choices[0].message
 99 |             except:
100 |                 message = response
101 |             tool_calls = []
102 | 
103 |             # Convert Ollama tool calls to OpenAI format
104 |             if hasattr(message, "tool_calls") and message.tool_calls:
105 |                 for tool in message.tool_calls:
106 |                     tool_calls.append(
107 |                         {
108 |                             "id": str(uuid.uuid4()),  # Generate unique ID
109 |                             "type": "function",
110 |                             "function": {
111 |                                 "name": tool.function.name,
112 |                                 "arguments": tool.function.arguments,
113 |                             },
114 |                         }
115 |                     )
116 | 
117 |             return {
118 |                 "response": message.content if message else "No response",
119 |                 "tool_calls": tool_calls,
120 |             }
121 | 
122 |         except Exception as e:
123 |             # error
124 |             logging.error(f"PGPT API Error: {str(e)}")
125 |             raise ValueError(f"PGPT API Error: {str(e)}")
126 | 
```

--------------------------------------------------------------------------------
/clients/C++/3.0 mcp_create_source/MCPCreateSourceClient.cpp:
--------------------------------------------------------------------------------

```cpp
  1 | #include <iostream>
  2 | #include <string>
  3 | #include <map>
  4 | #include <vector>
  5 | #include <sstream>
  6 | #include <stdexcept>
  7 | #include <json/json.h>
  8 | #include <winsock2.h>
  9 | #include <ws2tcpip.h>
 10 | 
 11 | #pragma comment(lib, "ws2_32.lib") // Winsock-Bibliothek verlinken
 12 | 
 13 | // Funktion zum Argument-Parsing
 14 | std::map<std::string, std::string> parseArguments(int argc, char* argv[], std::vector<std::string>& groups) {
 15 |     std::map<std::string, std::string> args;
 16 |     for (int i = 1; i < argc; ++i) {
 17 |         std::string key = argv[i];
 18 |         if (i + 1 < argc && key.rfind("--", 0) == 0) {
 19 |             if (key == "--groups") {
 20 |                 while (++i < argc && argv[i][0] != '-') {
 21 |                     groups.push_back(argv[i]);
 22 |                 }
 23 |                 --i; // Schritt zurücksetzen, um nicht zu überspringen
 24 |             } else {
 25 |                 args[key] = argv[++i];
 26 |             }
 27 |         }
 28 |     }
 29 |     return args;
 30 | }
 31 | 
 32 | // Funktion zum Senden der Anfrage
 33 | std::string sendRequest(const std::string& serverIp, int serverPort, const Json::Value& payload) {
 34 |     Json::StreamWriterBuilder writer;
 35 |     std::string payloadJson = Json::writeString(writer, payload);
 36 | 
 37 |     // Winsock initialisieren
 38 |     WSADATA wsaData;
 39 |     if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
 40 |         throw std::runtime_error("Failed to initialize Winsock.");
 41 |     }
 42 | 
 43 |     // Socket erstellen
 44 |     SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
 45 |     if (sock == INVALID_SOCKET) {
 46 |         WSACleanup();
 47 |         throw std::runtime_error("Failed to create socket.");
 48 |     }
 49 | 
 50 |     // Server-Adresse konfigurieren
 51 |     sockaddr_in serverAddr;
 52 |     serverAddr.sin_family = AF_INET;
 53 |     serverAddr.sin_port = htons(serverPort);
 54 |     if (inet_pton(AF_INET, serverIp.c_str(), &serverAddr.sin_addr) <= 0) {
 55 |         closesocket(sock);
 56 |         WSACleanup();
 57 |         throw std::runtime_error("Invalid server IP address.");
 58 |     }
 59 | 
 60 |     // Verbindung herstellen
 61 |     if (connect(sock, (sockaddr*)&serverAddr, sizeof(serverAddr)) < 0) {
 62 |         closesocket(sock);
 63 |         WSACleanup();
 64 |         throw std::runtime_error("Connection failed.");
 65 |     }
 66 | 
 67 |     // Daten senden
 68 |     if (send(sock, payloadJson.c_str(), payloadJson.size(), 0) < 0) {
 69 |         closesocket(sock);
 70 |         WSACleanup();
 71 |         throw std::runtime_error("Failed to send data.");
 72 |     }
 73 | 
 74 |     // Antwort empfangen
 75 |     char buffer[4096];
 76 |     int bytesRead;
 77 |     std::ostringstream response;
 78 | 
 79 |     do {
 80 |         bytesRead = recv(sock, buffer, sizeof(buffer) - 1, 0);
 81 |         if (bytesRead > 0) {
 82 |             buffer[bytesRead] = '\0'; // Null-terminieren
 83 |             response << buffer;
 84 |         }
 85 |     } while (bytesRead == sizeof(buffer) - 1);
 86 | 
 87 |     // Socket schließen
 88 |     closesocket(sock);
 89 |     WSACleanup();
 90 | 
 91 |     return response.str();
 92 | }
 93 | 
 94 | int main(int argc, char* argv[]) {
 95 |     try {
 96 |         std::vector<std::string> groups;
 97 |         auto args = parseArguments(argc, argv, groups);
 98 | 
 99 |         // Argumente extrahieren
100 |         std::string serverIp = args["--server-ip"];
101 |         int serverPort = std::stoi(args["--server-port"]);
102 |         std::string token = args["--token"];
103 |         std::string name = args["--name"];
104 |         std::string content = args["--content"];
105 | 
106 |         // Überprüfen, ob alle erforderlichen Parameter angegeben sind
107 |         if (serverIp.empty() || serverPort == 0 || token.empty() || name.empty() || content.empty()) {
108 |             std::cerr << "Usage: MCPCreateSourceClient --server-ip <IP> --server-port <PORT> --token <TOKEN> --name <NAME> --content <CONTENT> [--groups <GROUP1 GROUP2 ...>]\n";
109 |             return 1;
110 |         }
111 | 
112 |         std::cout << "📤 Sending request to create a new source...\n";
113 | 
114 |         // JSON-Payload erstellen
115 |         Json::Value payload;
116 |         payload["command"] = "create_source";
117 |         payload["token"] = token;
118 |         payload["arguments"]["name"] = name;
119 |         payload["arguments"]["content"] = content;
120 | 
121 |         Json::Value groupsJson(Json::arrayValue);
122 |         for (const auto& group : groups) {
123 |             groupsJson.append(group);
124 |         }
125 |         payload["arguments"]["groups"] = groupsJson;
126 | 
127 |         // Anfrage senden und Antwort erhalten
128 |         std::string response = sendRequest(serverIp, serverPort, payload);
129 | 
130 |         std::cout << "✔️ Response from server:\n" << response << "\n";
131 |     } catch (const std::exception& e) {
132 |         std::cerr << "❌ ERROR: " << e.what() << "\n";
133 |         return 1;
134 |     }
135 | 
136 |     return 0;
137 | }
138 | 
```

--------------------------------------------------------------------------------
/clients/Python/2.0 mcp_chat/MCPChatClient.py:
--------------------------------------------------------------------------------

```python
  1 | import socket
  2 | import ssl
  3 | import json
  4 | import argparse
  5 | import sys
  6 | sys.stdout.reconfigure(encoding='utf-8')
  7 | sys.stdin.reconfigure(encoding='utf-8')
  8 | 
  9 | 
 10 | def send_mcp_request(server_ip, server_port, token, question, use_public, groups=None, language="de", use_ssl=True, accept_self_signed=False):
 11 |     """
 12 |     Sends a question to an MCP server and retrieves the response.
 13 | 
 14 |     :param server_ip: IP address of the MCP server
 15 |     :param server_port: Port number of the MCP server
 16 |     :param token: Authentication token for the MCP server
 17 |     :param question: The question to send
 18 |     :param use_public: Whether to use the public knowledge base
 19 |     :param groups: List of groups for retrieval-augmented generation
 20 |     :param language: Language code for the request
 21 |     :param use_ssl: Whether to use SSL/TLS for the connection
 22 |     :param accept_self_signed: Whether to accept self-signed certificates
 23 |     :return: Response from the server
 24 |     """
 25 |     # Prepare the request payload
 26 |     payload = {
 27 |         "command": "chat",
 28 |         "token": token,
 29 |         "arguments": {
 30 |             "question": question,
 31 |             "usePublic": use_public,
 32 |             "groups": groups or [],
 33 |             "language": language
 34 |         }
 35 |     }
 36 | 
 37 |     # Convert the payload to a JSON string
 38 |     payload_json = json.dumps(payload)
 39 |     
 40 |     # Initialize socket variables
 41 |     raw_socket = None
 42 |     client_socket = None
 43 | 
 44 |     try:
 45 |         # Create a socket object
 46 |         raw_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 47 |         raw_socket.settimeout(10)
 48 | 
 49 |         # Establish SSL/TLS connection if required
 50 |         if use_ssl:
 51 |             context = ssl.create_default_context()
 52 |             if accept_self_signed:
 53 |                 context.check_hostname = False
 54 |                 context.verify_mode = ssl.CERT_NONE
 55 |             client_socket = context.wrap_socket(raw_socket, server_hostname=server_ip)
 56 |         else:
 57 |             client_socket = raw_socket
 58 |         
 59 |         # Connect to the server
 60 |         client_socket.connect((server_ip, server_port))
 61 | 
 62 |         # Send the request
 63 |         client_socket.sendall(payload_json.encode('utf-8'))
 64 | 
 65 |         # Receive the response
 66 |         response = b""
 67 |         while True:
 68 |             part = client_socket.recv(4096)
 69 |             if not part:
 70 |                 break
 71 |             response += part
 72 | 
 73 |         # Decode the response
 74 |         return json.loads(response.decode('utf-8'))
 75 | 
 76 |     except ssl.SSLError:
 77 |         return {"status": "error", "message": "Connection failed: Server and/or Client may require TLS encryption. Please enable SSL/TLS."}
 78 |     except Exception as e:
 79 |         return {"status": "error", "message": str(e)}
 80 |     
 81 |     finally:
 82 |         if client_socket is not None:
 83 |             try:
 84 |                 client_socket.shutdown(socket.SHUT_RDWR)
 85 |             except:
 86 |                 pass
 87 |             client_socket.close()
 88 | 
 89 | if __name__ == "__main__":
 90 |     parser = argparse.ArgumentParser(description="Send a question to the MCP server and retrieve the response.")
 91 |     parser.add_argument("--server-ip", required=True, help="IP address of the MCP server")
 92 |     parser.add_argument("--server-port", required=True, type=int, help="Port number of the MCP server")
 93 |     parser.add_argument("--token", required=True, help="Authentication token")
 94 |     parser.add_argument("--question", required=True, help="The question to ask the MCP server")
 95 |     parser.add_argument("--use-public", action="store_true", help="Use the public knowledge base")
 96 |     parser.add_argument("--groups", nargs="*", help="List of groups for retrieval-augmented generation", default=[])
 97 |     parser.add_argument("--language", default="de", help="Language code for the request (default: 'de')")
 98 |     parser.add_argument("--use-ssl", action="store_true", help="Connect using SSL/TLS")
 99 |     parser.add_argument("--accept-self-signed", action="store_true", help="Accept self-signed certificates (disable certificate verification)")
100 | 
101 |     args = parser.parse_args()
102 | 
103 |     # Send the question to the MCP server
104 |     response = send_mcp_request(
105 |         server_ip=args.server_ip,
106 |         server_port=args.server_port,
107 |         token=args.token,
108 |         question=args.question,
109 |         use_public=args.use_public,
110 |         groups=args.groups,
111 |         language=args.language,
112 |         use_ssl=args.use_ssl,
113 |         accept_self_signed=args.accept_self_signed
114 |     )
115 | 
116 |     print("Response from server:", json.dumps(response, indent=2, ensure_ascii=False))
117 | 
```

--------------------------------------------------------------------------------
/clients/C# .Net/5.1 mcp_edit_user/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 MCPEditUserClient
  9 | {
 10 |     class Program
 11 |     {
 12 |         static void Main(string[] args)
 13 |         {
 14 |             if (args.Length < 4)
 15 |             {
 16 |                 Console.WriteLine("Usage: --server-ip <IP> --server-port <PORT> --token <TOKEN> --user-id <USER_ID> [optional parameters]");
 17 |                 return;
 18 |             }
 19 | 
 20 |             string serverIp = GetArgument(args, "--server-ip");
 21 |             int serverPort = int.Parse(GetArgument(args, "--server-port"));
 22 |             string token = GetArgument(args, "--token");
 23 |             string userId = GetArgument(args, "--user-id");
 24 |             string name = GetArgument(args, "--name");
 25 |             string email = GetArgument(args, "--email");
 26 |             string password = GetArgument(args, "--password");
 27 |             string language = GetArgument(args, "--language");
 28 |             string timezone = GetArgument(args, "--timezone");
 29 |             List<string> roles = GetListArgument(args, "--roles");
 30 |             List<string> groups = GetListArgument(args, "--groups");
 31 |             bool usePublic = Array.Exists(args, arg => arg == "--usePublic");
 32 |             bool activateFtp = Array.Exists(args, arg => arg == "--activateFtp");
 33 |             string ftpPassword = GetArgument(args, "--ftpPassword");
 34 | 
 35 |             var arguments = new Dictionary<string, object>
 36 |             {
 37 |                 { "userId", userId },
 38 |                 { "name", name },
 39 |                 { "email", email },
 40 |                 { "password", password },
 41 |                 { "language", language },
 42 |                 { "timezone", timezone },
 43 |                 { "roles", roles },
 44 |                 { "groups", groups },
 45 |                 { "usePublic", usePublic },
 46 |                 { "activateFtp", activateFtp },
 47 |                 { "ftpPassword", ftpPassword }
 48 |             };
 49 | 
 50 |             // Remove null or empty values from arguments
 51 |             arguments = arguments.Where(kv => kv.Value != null && !(kv.Value is string str && string.IsNullOrWhiteSpace(str))).ToDictionary(kv => kv.Key, kv => kv.Value);
 52 | 
 53 |             var payload = new
 54 |             {
 55 |                 command = "edit_user",
 56 |                 token = token,
 57 |                 arguments = arguments
 58 |             };
 59 | 
 60 |             Console.WriteLine("📤 Sending edit user request...");
 61 |             string response = SendRequest(serverIp, serverPort, payload);
 62 |             Console.WriteLine("✔️ Response from server:");
 63 |             Console.WriteLine(response);
 64 |         }
 65 | 
 66 |         static string GetArgument(string[] args, string key)
 67 |         {
 68 |             int index = Array.IndexOf(args, key);
 69 |             return index >= 0 && index < args.Length - 1 ? args[index + 1] : null;
 70 |         }
 71 | 
 72 |         static List<string> GetListArgument(string[] args, string key)
 73 |         {
 74 |             int index = Array.IndexOf(args, key);
 75 |             List<string> values = new List<string>();
 76 |             if (index >= 0)
 77 |             {
 78 |                 for (int i = index + 1; i < args.Length && !args[i].StartsWith("--"); i++)
 79 |                 {
 80 |                     values.Add(args[i]);
 81 |                 }
 82 |             }
 83 |             return values;
 84 |         }
 85 | 
 86 |         static string SendRequest(string serverIp, int serverPort, object payload)
 87 |         {
 88 |             string payloadJson = JsonConvert.SerializeObject(payload);
 89 | 
 90 |             try
 91 |             {
 92 |                 using (TcpClient client = new TcpClient(serverIp, serverPort))
 93 |                 {
 94 |                     NetworkStream stream = client.GetStream();
 95 | 
 96 |                     // Send payload
 97 |                     byte[] data = Encoding.UTF8.GetBytes(payloadJson);
 98 |                     stream.Write(data, 0, data.Length);
 99 | 
100 |                     // Receive response
101 |                     byte[] buffer = new byte[4096];
102 |                     int bytesRead;
103 |                     StringBuilder response = new StringBuilder();
104 | 
105 |                     do
106 |                     {
107 |                         bytesRead = stream.Read(buffer, 0, buffer.Length);
108 |                         response.Append(Encoding.UTF8.GetString(buffer, 0, bytesRead));
109 |                     } while (bytesRead == buffer.Length);
110 | 
111 |                     return response.ToString();
112 |                 }
113 |             }
114 |             catch (Exception e)
115 |             {
116 |                 return $"Error: {e.Message}";
117 |             }
118 |         }
119 |     }
120 | }
121 | 
```

--------------------------------------------------------------------------------
/clients/C# .Net/Code Archiv/mcp_edit_user.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 MCPEditUserClient
  9 | {
 10 |     class Program
 11 |     {
 12 |         static void Main(string[] args)
 13 |         {
 14 |             if (args.Length < 4)
 15 |             {
 16 |                 Console.WriteLine("Usage: --server-ip <IP> --server-port <PORT> --token <TOKEN> --user-id <USER_ID> [optional parameters]");
 17 |                 return;
 18 |             }
 19 | 
 20 |             string serverIp = GetArgument(args, "--server-ip");
 21 |             int serverPort = int.Parse(GetArgument(args, "--server-port"));
 22 |             string token = GetArgument(args, "--token");
 23 |             string userId = GetArgument(args, "--user-id");
 24 |             string name = GetArgument(args, "--name");
 25 |             string email = GetArgument(args, "--email");
 26 |             string password = GetArgument(args, "--password");
 27 |             string language = GetArgument(args, "--language");
 28 |             string timezone = GetArgument(args, "--timezone");
 29 |             List<string> roles = GetListArgument(args, "--roles");
 30 |             List<string> groups = GetListArgument(args, "--groups");
 31 |             bool usePublic = Array.Exists(args, arg => arg == "--usePublic");
 32 |             bool activateFtp = Array.Exists(args, arg => arg == "--activateFtp");
 33 |             string ftpPassword = GetArgument(args, "--ftpPassword");
 34 | 
 35 |             var arguments = new Dictionary<string, object>
 36 |             {
 37 |                 { "userId", userId },
 38 |                 { "name", name },
 39 |                 { "email", email },
 40 |                 { "password", password },
 41 |                 { "language", language },
 42 |                 { "timezone", timezone },
 43 |                 { "roles", roles },
 44 |                 { "groups", groups },
 45 |                 { "usePublic", usePublic },
 46 |                 { "activateFtp", activateFtp },
 47 |                 { "ftpPassword", ftpPassword }
 48 |             };
 49 | 
 50 |             // Remove null or empty values from arguments
 51 |             arguments = arguments.Where(kv => kv.Value != null && !(kv.Value is string str && string.IsNullOrWhiteSpace(str))).ToDictionary(kv => kv.Key, kv => kv.Value);
 52 | 
 53 |             var payload = new
 54 |             {
 55 |                 command = "edit_user",
 56 |                 token = token,
 57 |                 arguments = arguments
 58 |             };
 59 | 
 60 |             Console.WriteLine("📤 Sending edit user request...");
 61 |             string response = SendRequest(serverIp, serverPort, payload);
 62 |             Console.WriteLine("✔️ Response from server:");
 63 |             Console.WriteLine(response);
 64 |         }
 65 | 
 66 |         static string GetArgument(string[] args, string key)
 67 |         {
 68 |             int index = Array.IndexOf(args, key);
 69 |             return index >= 0 && index < args.Length - 1 ? args[index + 1] : null;
 70 |         }
 71 | 
 72 |         static List<string> GetListArgument(string[] args, string key)
 73 |         {
 74 |             int index = Array.IndexOf(args, key);
 75 |             List<string> values = new List<string>();
 76 |             if (index >= 0)
 77 |             {
 78 |                 for (int i = index + 1; i < args.Length && !args[i].StartsWith("--"); i++)
 79 |                 {
 80 |                     values.Add(args[i]);
 81 |                 }
 82 |             }
 83 |             return values;
 84 |         }
 85 | 
 86 |         static string SendRequest(string serverIp, int serverPort, object payload)
 87 |         {
 88 |             string payloadJson = JsonConvert.SerializeObject(payload);
 89 | 
 90 |             try
 91 |             {
 92 |                 using (TcpClient client = new TcpClient(serverIp, serverPort))
 93 |                 {
 94 |                     NetworkStream stream = client.GetStream();
 95 | 
 96 |                     // Send payload
 97 |                     byte[] data = Encoding.UTF8.GetBytes(payloadJson);
 98 |                     stream.Write(data, 0, data.Length);
 99 | 
100 |                     // Receive response
101 |                     byte[] buffer = new byte[4096];
102 |                     int bytesRead;
103 |                     StringBuilder response = new StringBuilder();
104 | 
105 |                     do
106 |                     {
107 |                         bytesRead = stream.Read(buffer, 0, buffer.Length);
108 |                         response.Append(Encoding.UTF8.GetString(buffer, 0, bytesRead));
109 |                     } while (bytesRead == buffer.Length);
110 | 
111 |                     return response.ToString();
112 |                 }
113 |             }
114 |             catch (Exception e)
115 |             {
116 |                 return $"Error: {e.Message}";
117 |             }
118 |         }
119 |     }
120 | }
121 | 
```

--------------------------------------------------------------------------------
/clients/JavaScript/3.4 mcp_delete_source/MCPDeleteSourceClient.js:
--------------------------------------------------------------------------------

```javascript
  1 | const net = require('net');
  2 | const readline = require('readline');
  3 | const { argv, exit } = require('process');
  4 | 
  5 | // Funktion zum Parsen der Kommandozeilenargumente
  6 | function parseArguments(args) {
  7 |     const parsedArgs = {};
  8 |     for (let i = 2; i < args.length; i++) {
  9 |         switch (args[i]) {
 10 |             case '--server-ip':
 11 |                 parsedArgs.serverIp = args[++i];
 12 |                 break;
 13 |             case '--server-port':
 14 |                 parsedArgs.serverPort = parseInt(args[++i], 10);
 15 |                 break;
 16 |             case '--token':
 17 |                 parsedArgs.token = args[++i];
 18 |                 break;
 19 |             case '--source-id':
 20 |                 parsedArgs.sourceId = args[++i];
 21 |                 break;
 22 |             default:
 23 |                 console.warn(`⚠️ Unbekanntes Argument: ${args[i]}`);
 24 |         }
 25 |     }
 26 |     return parsedArgs;
 27 | }
 28 | 
 29 | // Funktion zum interaktiven Abfragen eines Parameters (optional)
 30 | function askQuestion(query) {
 31 |     const rl = readline.createInterface({
 32 |         input: process.stdin,
 33 |         output: process.stdout,
 34 |         terminal: true
 35 |     });
 36 | 
 37 |     return new Promise((resolve) => {
 38 |         rl.question(query, (answer) => {
 39 |             rl.close();
 40 |             resolve(answer);
 41 |         });
 42 |     });
 43 | }
 44 | 
 45 | // Funktion zum Senden einer Delete-Source-Anfrage über eine TCP-Verbindung
 46 | function sendDeleteSourceRequest(serverIp, serverPort, payload) {
 47 |     return new Promise((resolve, reject) => {
 48 |         const client = new net.Socket();
 49 |         let responseData = '';
 50 |         const TIMEOUT_DURATION = 10000; // 10 Sekunden
 51 | 
 52 |         // Setze einen Timeout
 53 |         const timeout = setTimeout(() => {
 54 |             client.destroy(); // Zerstöre die Verbindung
 55 |             reject(new Error('Verbindungs-Timeout: Der Server hat nicht rechtzeitig geantwortet.'));
 56 |         }, TIMEOUT_DURATION);
 57 | 
 58 |         client.connect(serverPort, serverIp, () => {
 59 |             console.log(`🔗 Verbindung zum Server (${serverIp}:${serverPort}) hergestellt.`);
 60 |             const payloadString = JSON.stringify(payload);
 61 |             console.log(`📤 Sende Payload: ${payloadString}`);
 62 |             client.write(payloadString);
 63 |         });
 64 | 
 65 |         client.on('data', (data) => {
 66 |             console.log(`📥 Empfangene Daten: ${data}`);
 67 |             responseData += data.toString();
 68 |             try {
 69 |                 const parsedData = JSON.parse(responseData);
 70 |                 console.log('✅ JSON-Antwort erfolgreich geparst.');
 71 |                 clearTimeout(timeout); // Entferne den Timeout
 72 |                 resolve(parsedData);
 73 |                 client.destroy(); // Verbindung schließen
 74 |             } catch (err) {
 75 |                 console.warn('⚠️ Antwort noch nicht vollständig oder ungültiges JSON. Weitere Daten werden erwartet.');
 76 |                 // Antwort noch nicht vollständig, weiter empfangen
 77 |             }
 78 |         });
 79 | 
 80 |         client.on('close', () => {
 81 |             console.log('🔒 Verbindung zum Server geschlossen.');
 82 |             clearTimeout(timeout); // Entferne den Timeout
 83 |         });
 84 | 
 85 |         client.on('error', (err) => {
 86 |             console.error('❌ Verbindungsfehler:', err.message);
 87 |             clearTimeout(timeout); // Entferne den Timeout
 88 |             reject(err);
 89 |         });
 90 |     });
 91 | }
 92 | 
 93 | // Hauptfunktion
 94 | async function main() {
 95 |     const args = argv;
 96 |     const parsedArgs = parseArguments(args);
 97 |     let { serverIp, serverPort, token, sourceId } = parsedArgs;
 98 | 
 99 |     // Überprüfen, ob alle erforderlichen Parameter vorhanden sind, sonst interaktiv abfragen
100 |     if (!serverIp) {
101 |         serverIp = await askQuestion('🔗 Bitte gib die Server-IP ein: ');
102 |     }
103 |     if (!serverPort) {
104 |         const portInput = await askQuestion('🔗 Bitte gib den Server-Port ein: ');
105 |         serverPort = parseInt(portInput, 10);
106 |     }
107 |     if (!token) {
108 |         token = await askQuestion('🔒 Bitte gib dein Authentifizierungstoken ein: ');
109 |     }
110 |     if (!sourceId) {
111 |         sourceId = await askQuestion('📁 Bitte gib die Source-ID ein: ');
112 |     }
113 | 
114 |     const payload = {
115 |         command: "delete_source",
116 |         token: token,
117 |         arguments: {
118 |             sourceId: sourceId
119 |         }
120 |     };
121 | 
122 |     try {
123 |         console.log('🗑️ Sende Delete-Source-Anfrage...');
124 |         const response = await sendDeleteSourceRequest(serverIp, serverPort, payload);
125 |         console.log('✅ Server Response:');
126 |         console.log(JSON.stringify(response, null, 2));
127 |     } catch (err) {
128 |         console.error('❌ ERROR:', err.message);
129 |     }
130 | }
131 | 
132 | main();
133 | 
```

--------------------------------------------------------------------------------
/agents/OpenAI_Compatible_API_Agent/Python/vllmproxy.py:
--------------------------------------------------------------------------------

```python
  1 | import argparse
  2 | import asyncio
  3 | import json
  4 | import time
  5 | import httpx
  6 | from openai import OpenAI
  7 | from openai.types.chat import ChatCompletionUserMessageParam, ChatCompletionAssistantMessageParam, \
  8 |     ChatCompletionSystemMessageParam, ChatCompletionToolParam
  9 | from starlette.responses import StreamingResponse
 10 | 
 11 | from fastapi import FastAPI, Request, HTTPException
 12 | from threading import local
 13 | 
 14 | from agents.OpenAI_Compatible_API_Agent.Python.open_ai_helper import ChatCompletionRequest, models, Message, num_tokens, \
 15 |     CompletionRequest
 16 | import uvicorn
 17 | 
 18 | 
 19 | app = FastAPI(title="OpenAI-compatible API for PrivateGPT")
 20 | request_context = local()
 21 | 
 22 | 
 23 | @app.middleware("http")
 24 | async def store_request_headers(request: Request, call_next):
 25 |     request_context.headers = dict(request.headers)
 26 |     response = await call_next(request)
 27 |     return response
 28 | 
 29 | @app.post("/chat/completions")
 30 | async def chat_completions(request: ChatCompletionRequest):
 31 |     parser = argparse.ArgumentParser(description="Provide an API key to connect to OpenAI-compatible API.")
 32 |     parser.add_argument("--api_key", required=True, help="API key for login")
 33 |     parser.add_argument("--base_url", required=True, help="The base url of the VLLM server")
 34 |     args = parser.parse_args()
 35 | 
 36 | 
 37 |     client = OpenAI(
 38 |         base_url=args.base_url,
 39 |         api_key=args.api_key,
 40 |         http_client=httpx.Client(verify=False)
 41 |     )
 42 | 
 43 | 
 44 |     msgs = []
 45 |     for message in request.messages:
 46 |         if message.role == "system":
 47 |             msgs.append(ChatCompletionSystemMessageParam(role="system", content=message.content))
 48 |         elif message.role == "user":
 49 |             msgs.append(ChatCompletionUserMessageParam(role="user", content=message.content))
 50 |         elif message.role == "assistant":
 51 |             msgs.append(ChatCompletionAssistantMessageParam(role="assistant", content=message.content))
 52 | 
 53 | 
 54 | 
 55 |     tools = []
 56 |     #tools_json = json.loads(json.dumps(request.tools))
 57 |     #for tool in tools_json:
 58 |     #    tools.append(json.loads(str(tool)))
 59 | 
 60 |     #if len(tools) == 0:
 61 |     #    tools = None
 62 | 
 63 |     response = client.chat.completions.create(
 64 |         model="/models/mistral-nemo-12b",
 65 |         temperature=request.temperature,
 66 |         #top_p=float(request.top_p),
 67 |         stream=True,
 68 |         tools=tools or None,
 69 |         messages=msgs
 70 |     )
 71 | 
 72 |     if request.stream:
 73 | 
 74 |         return StreamingResponse(
 75 |             _resp_async_generator_vllm(response, request), media_type="application/x-ndjson"
 76 |         )
 77 | 
 78 |     else:
 79 |         return {
 80 |             "id": response.id,
 81 |             "object": "chat.completion",
 82 |             "created": time.time(),
 83 |             "model": request.model,
 84 |             "choices": [{"message": Message(role="assistant", content="Response", tool_calls=[])}],
 85 |             "citations": [],
 86 |             "usage": {
 87 |                 "prompt_tokens": 10,
 88 |                 "completion_tokens": 10,
 89 |                 "total_tokens": 20
 90 |             }
 91 |         }
 92 | 
 93 | async def _resp_async_generator_vllm(response, request):
 94 |     partial_message = ""
 95 |     user_input = ""
 96 |     for message in request.messages:
 97 |         user_input += json.dumps({'role': message.role, 'content': message.content})
 98 | 
 99 |     i = 0
100 |     for chunk in response:
101 |         num_tokens_request, num_tokens_reply, num_tokens_overall = num_tokens(user_input, chunk.choices[0].delta.content)
102 |         chunk = {
103 |             "id": i,
104 |             "object": "chat.completion.chunk",
105 |             "created": time.time(),
106 |             "model": request.model,
107 |             "choices": [{"delta": {"content": chunk.choices[0].delta.content}}],
108 |             "usage": {
109 |                 "prompt_tokens": num_tokens_request,
110 |                 "completion_tokens": num_tokens_reply,
111 |                 "total_tokens": num_tokens_overall
112 |             }
113 |         }
114 |         i = i+1
115 |         yield f"data: {json.dumps(chunk)}\n\n"
116 |         await asyncio.sleep(0.05)
117 |     yield "data: [DONE]\n\n"
118 | 
119 | 
120 | @app.get("/models")
121 | def return_models():
122 |     return {
123 |         "object": "list",
124 |         "data": models
125 |     }
126 | 
127 | 
128 | @app.get('/models/{model_id}')
129 | async def get_model(model_id: str):
130 |     filtered_entries = list(filter(lambda item: item["id"] == model_id, models))
131 |     entry = filtered_entries[0] if filtered_entries else None
132 |     print(entry)
133 |     if entry is None:
134 |             raise HTTPException(status_code=404, detail="Model not found")
135 |     return entry
136 | 
137 | 
138 | if __name__ == "__main__":
139 |     api_ip = "0.0.0.0"
140 |     api_port = 8003
141 |     uvicorn.run(app, host=api_ip, port=int(api_port))
142 | 
143 | 
144 | 
145 | 
```

--------------------------------------------------------------------------------
/clients/Python/5.1 mcp_edit_user/MCPEditUserClient.py:
--------------------------------------------------------------------------------

```python
  1 | import socket
  2 | import ssl
  3 | import json
  4 | import argparse
  5 | import sys
  6 | 
  7 | def send_edit_user_request(server_ip, server_port, token, name=None, email=None, password=None, language=None,
  8 |                            timezone=None, roles=None, groups=None, use_public=False, activate_ftp=False, ftp_password=None,
  9 |                            use_ssl=True, accept_self_signed=False):
 10 |     """
 11 |     Sends a request to edit an existing user to the MCP server.
 12 |     """
 13 |     payload = {
 14 |         "command": "edit_user",
 15 |         "token": token,
 16 |         "arguments": {
 17 |             "name": name,
 18 |             "email": email,
 19 |             "password": password,
 20 |             "language": language,
 21 |             "timezone": timezone,
 22 |             "roles": roles or [],
 23 |             "groups": groups or [],
 24 |             "usePublic": use_public,
 25 |             "activateFtp": activate_ftp,
 26 |             "ftpPassword": ftp_password
 27 |         }
 28 |     }
 29 | 
 30 |     # Remove keys with None values
 31 |     payload["arguments"] = {k: v for k, v in payload["arguments"].items() if v is not None}
 32 | 
 33 |     payload_json = json.dumps(payload)
 34 |     
 35 |     raw_socket = None
 36 |     client_socket = None
 37 | 
 38 |     try:
 39 |         raw_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 40 |         raw_socket.settimeout(10)
 41 | 
 42 |         if use_ssl:
 43 |             context = ssl.create_default_context()
 44 |             if accept_self_signed:
 45 |                 context.check_hostname = False
 46 |                 context.verify_mode = ssl.CERT_NONE
 47 |             client_socket = context.wrap_socket(raw_socket, server_hostname=server_ip)
 48 |         else:
 49 |             client_socket = raw_socket
 50 |         
 51 |         client_socket.connect((server_ip, server_port))
 52 |         client_socket.sendall(payload_json.encode('utf-8'))
 53 | 
 54 |         response = b""
 55 |         while True:
 56 |             part = client_socket.recv(4096)
 57 |             if not part:
 58 |                 break
 59 |             response += part
 60 | 
 61 |         return response.decode('utf-8')
 62 |     except ssl.SSLError:
 63 |         return "Error: Server and/or client may require TLS encryption. Please enable SSL/TLS."
 64 |     except Exception as e:
 65 |         return f"Error: {e}"
 66 |     
 67 |     finally:
 68 |         if client_socket is not None:
 69 |             try:
 70 |                 client_socket.shutdown(socket.SHUT_RDWR)
 71 |             except:
 72 |                 pass
 73 |             client_socket.close()
 74 | 
 75 | if __name__ == "__main__":
 76 |     parser = argparse.ArgumentParser(
 77 |         description="Send a request to edit an existing user to the MCP server.",
 78 |         formatter_class=argparse.RawTextHelpFormatter
 79 |     )
 80 |     parser.add_argument("--server-ip", required=True, help="IP address of the MCP server")
 81 |     parser.add_argument("--server-port", required=True, type=int, help="Port number of the MCP server")
 82 |     parser.add_argument("--token", required=True, help="Authentication token")
 83 |     parser.add_argument("--name", help="New name of the user")
 84 |     parser.add_argument("--email", help="New email of the user")
 85 |     parser.add_argument("--password", help="New password of the user")
 86 |     parser.add_argument("--language", help="Preferred language of the user")
 87 |     parser.add_argument("--timezone", help="Timezone of the user")
 88 |     parser.add_argument("--roles", nargs="*", help="List of roles to assign to the user")
 89 |     parser.add_argument("--groups", nargs="*", help="List of groups to assign to the user")
 90 |     parser.add_argument("--usePublic", action="store_true", help="Enable public knowledge base access")
 91 |     parser.add_argument("--activateFtp", action="store_true", help="Activate FTP access")
 92 |     parser.add_argument("--ftpPassword", help="Password for FTP access")
 93 |     parser.add_argument("--use-ssl", action="store_true", help="Connect using SSL/TLS")
 94 |     parser.add_argument("--accept-self-signed", action="store_true", help="Accept self-signed certificates (disable certificate verification)")
 95 | 
 96 |     if len(sys.argv) == 1:
 97 |         parser.print_help(sys.stderr)
 98 |         sys.exit(1)
 99 | 
100 |     args = parser.parse_args()
101 | 
102 |     response = send_edit_user_request(
103 |         args.server_ip,
104 |         args.server_port,
105 |         args.token,
106 |         name=args.name,
107 |         email=args.email,
108 |         password=args.password,
109 |         language=args.language,
110 |         timezone=args.timezone,
111 |         roles=args.roles,
112 |         groups=args.groups,
113 |         use_public=args.usePublic,
114 |         activate_ftp=args.activateFtp,
115 |         ftp_password=args.ftpPassword,
116 |         use_ssl=args.use_ssl,
117 |         accept_self_signed=args.accept_self_signed
118 |     )
119 |     print("Response from server:", response)
120 | 
```

--------------------------------------------------------------------------------
/clients/JavaScript/2.0 mcp_chat/MCPChatClient.js:
--------------------------------------------------------------------------------

```javascript
  1 | const net = require('net');
  2 | const readline = require('readline');
  3 | const { argv, exit } = require('process');
  4 | 
  5 | // Funktion zum Parsen der Kommandozeilenargumente
  6 | function parseArguments(args) {
  7 |     const parsedArgs = {};
  8 |     for (let i = 2; i < args.length; i++) {
  9 |         switch (args[i]) {
 10 |             case '--server-ip':
 11 |                 parsedArgs.serverIp = args[++i];
 12 |                 break;
 13 |             case '--server-port':
 14 |                 parsedArgs.serverPort = parseInt(args[++i], 10);
 15 |                 break;
 16 |             case '--token':
 17 |                 parsedArgs.token = args[++i];
 18 |                 break;
 19 |             case '--question':
 20 |                 parsedArgs.question = args[++i];
 21 |                 break;
 22 |             case '--use-public':
 23 |                 parsedArgs.usePublic = true;
 24 |                 break;
 25 |             case '--groups':
 26 |                 // Sammle alle Gruppenargumente bis zum nächsten Flag oder Ende
 27 |                 parsedArgs.groups = [];
 28 |                 while (i + 1 < args.length && !args[i + 1].startsWith('--')) {
 29 |                     parsedArgs.groups.push(args[++i]);
 30 |                 }
 31 |                 break;
 32 |             case '--language':
 33 |                 parsedArgs.language = args[++i];
 34 |                 break;
 35 |             default:
 36 |                 console.warn(`Unbekanntes Argument: ${args[i]}`);
 37 |         }
 38 |     }
 39 |     return parsedArgs;
 40 | }
 41 | 
 42 | // Funktion zum interaktiven Abfragen eines Parameters (optional)
 43 | function askQuestion(query) {
 44 |     const rl = readline.createInterface({
 45 |         input: process.stdin,
 46 |         output: process.stdout,
 47 |         terminal: true
 48 |     });
 49 | 
 50 |     return new Promise((resolve) => {
 51 |         rl.question(query, (answer) => {
 52 |             rl.close();
 53 |             resolve(answer);
 54 |         });
 55 |     });
 56 | }
 57 | 
 58 | // Funktion zum Senden einer Chat-Anfrage über eine TCP-Verbindung
 59 | function sendChatRequest(serverIp, serverPort, payload) {
 60 |     return new Promise((resolve, reject) => {
 61 |         const client = new net.Socket();
 62 |         let responseData = '';
 63 | 
 64 |         client.connect(serverPort, serverIp, () => {
 65 |             console.log('🔗 Verbindung zum Server hergestellt.');
 66 |             const payloadString = JSON.stringify(payload);
 67 |             console.log(`📤 Sende Payload: ${payloadString}`);
 68 |             client.write(payloadString);
 69 |         });
 70 | 
 71 |         client.on('data', (data) => {
 72 |             console.log(`📥 Empfangene Daten: ${data}`);
 73 |             responseData += data.toString();
 74 |             try {
 75 |                 const parsedData = JSON.parse(responseData);
 76 |                 console.log('✅ JSON-Antwort erfolgreich geparst.');
 77 |                 resolve(parsedData);
 78 |                 client.destroy(); // Verbindung schließen
 79 |             } catch (err) {
 80 |                 console.warn('⚠️ Antwort noch nicht vollständig oder ungültiges JSON. Weitere Daten werden erwartet.');
 81 |                 // Antwort noch nicht vollständig, weiter empfangen
 82 |             }
 83 |         });
 84 | 
 85 |         client.on('close', () => {
 86 |             console.log('🔒 Verbindung zum Server geschlossen.');
 87 |         });
 88 | 
 89 |         client.on('error', (err) => {
 90 |             console.error('❌ Verbindungsfehler:', err.message);
 91 |             reject(err);
 92 |         });
 93 |     });
 94 | }
 95 | 
 96 | // Hauptfunktion
 97 | async function main() {
 98 |     const args = argv;
 99 |     const parsedArgs = parseArguments(args);
100 |     const { serverIp, serverPort, token, question, usePublic, groups, language } = parsedArgs;
101 | 
102 |     // Überprüfen, ob alle erforderlichen Parameter vorhanden sind
103 |     if (!serverIp || !serverPort || !token || !question) {
104 |         console.error('❌ ERROR: Fehlende erforderliche Parameter.');
105 |         console.log('Verwendung: node MCPChatClient.js --server-ip <IP> --server-port <Port> --token <Token> --question <Frage> [--use-public] [--groups <Gruppe1> <Gruppe2> ...] [--language <Sprache>]');
106 |         exit(1);
107 |     }
108 | 
109 |     // Optional: Fallback für optionale Parameter
110 |     const finalLanguage = language || 'de';
111 |     const finalGroups = groups || [];
112 | 
113 |     const payload = {
114 |         command: "chat",
115 |         token: token,
116 |         arguments: {
117 |             question: question,
118 |             usePublic: usePublic || false,
119 |             groups: finalGroups,
120 |             language: finalLanguage
121 |         }
122 |     };
123 | 
124 |     try {
125 |         console.log('💬 Sende Chat-Anfrage...');
126 |         const response = await sendChatRequest(serverIp, serverPort, payload);
127 |         console.log('✅ Server Response:');
128 |         console.log(JSON.stringify(response, null, 2));
129 |     } catch (err) {
130 |         console.error('❌ ERROR:', err.message);
131 |     }
132 | }
133 | 
134 | main();
135 | 
```

--------------------------------------------------------------------------------
/src/services/pgpt-service.ts:
--------------------------------------------------------------------------------

```typescript
  1 | import axios, { AxiosInstance } from 'axios';
  2 | import { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';
  3 | import { ChatArgs, SourceArgs, ListSourcesArgs, GetSourceArgs } from '../types/api.js';
  4 | 
  5 | export class PGPTService {
  6 |   private api: AxiosInstance;
  7 |   private token: string | null = null;
  8 | 
  9 |   constructor() {
 10 |     // Initialize axios instance with base configuration
 11 |     this.api = axios.create({
 12 |       baseURL: process.env.PGPT_API_URL || 'http://localhost:3000',
 13 |       headers: {
 14 |         'Accept': 'application/json',
 15 |         'Content-Type': 'application/json',
 16 |       },
 17 |     });
 18 |   }
 19 | 
 20 |   private async ensureAuthenticated(): Promise<void> {
 21 |     if (!this.token) {
 22 |       const email = process.env.PGPT_EMAIL;
 23 |       const password = process.env.PGPT_PASSWORD;
 24 | 
 25 |       if (!email || !password) {
 26 |         throw new McpError(
 27 |           ErrorCode.InvalidRequest,
 28 |           'Missing authentication credentials'
 29 |         );
 30 |       }
 31 | 
 32 |       try {
 33 |         const response = await this.api.post('/api/v1/login', {
 34 |           email,
 35 |           password,
 36 |         });
 37 |         this.token = response.data.data.token;
 38 |         this.api.defaults.headers.common['Authorization'] = `Bearer ${this.token}`;
 39 |       } catch (error) {
 40 |         throw new McpError(
 41 |           ErrorCode.InvalidRequest,
 42 |           'Authentication failed'
 43 |         );
 44 |       }
 45 |     }
 46 |   }
 47 | 
 48 |   async chat(args: ChatArgs) {
 49 |     await this.ensureAuthenticated();
 50 | 
 51 |     try {
 52 |       const response = await this.api.post('/api/v1/chats', {
 53 |         language: args.language || 'en',
 54 |         question: args.question,
 55 |         usePublic: args.usePublic || false,
 56 |         groups: args.groups || [],
 57 |       });
 58 | 
 59 |       return {
 60 |         content: [
 61 |           {
 62 |             type: 'text',
 63 |             text: response.data.data.answer,
 64 |           },
 65 |         ],
 66 |       };
 67 |     } catch (error) {
 68 |       if (axios.isAxiosError(error)) {
 69 |         throw new McpError(
 70 |           ErrorCode.InternalError,
 71 |           `Chat failed: ${error.response?.data?.message || error.message}`
 72 |         );
 73 |       }
 74 |       throw error;
 75 |     }
 76 |   }
 77 | 
 78 |   async createSource(args: SourceArgs) {
 79 |     await this.ensureAuthenticated();
 80 | 
 81 |     try {
 82 |       const response = await this.api.post('/api/v1/sources', {
 83 |         name: args.name,
 84 |         content: args.content,
 85 |         groups: args.groups || [],
 86 |       });
 87 | 
 88 |       return {
 89 |         content: [
 90 |           {
 91 |             type: 'text',
 92 |             text: JSON.stringify(response.data.data, null, 2),
 93 |           },
 94 |         ],
 95 |       };
 96 |     } catch (error) {
 97 |       if (axios.isAxiosError(error)) {
 98 |         throw new McpError(
 99 |           ErrorCode.InternalError,
100 |           `Source creation failed: ${error.response?.data?.message || error.message}`
101 |         );
102 |       }
103 |       throw error;
104 |     }
105 |   }
106 | 
107 |   async listGroups() {
108 |     await this.ensureAuthenticated();
109 | 
110 |     try {
111 |       const response = await this.api.get('/api/v1/groups');
112 | 
113 |       return {
114 |         content: [
115 |           {
116 |             type: 'text',
117 |             text: JSON.stringify(response.data.data, null, 2),
118 |           },
119 |         ],
120 |       };
121 |     } catch (error) {
122 |       if (axios.isAxiosError(error)) {
123 |         throw new McpError(
124 |           ErrorCode.InternalError,
125 |           `Group listing failed: ${error.response?.data?.message || error.message}`
126 |         );
127 |       }
128 |       throw error;
129 |     }
130 |   }
131 | 
132 |   async listSources(args: ListSourcesArgs) {
133 |     await this.ensureAuthenticated();
134 | 
135 |     try {
136 |       const response = await this.api.post('/api/v1/sources/groups', {
137 |         groupName: args.groupName,
138 |       });
139 | 
140 |       return {
141 |         content: [
142 |           {
143 |             type: 'text',
144 |             text: JSON.stringify(response.data.data, null, 2),
145 |           },
146 |         ],
147 |       };
148 |     } catch (error) {
149 |       if (axios.isAxiosError(error)) {
150 |         throw new McpError(
151 |           ErrorCode.InternalError,
152 |           `Source listing failed: ${error.response?.data?.message || error.message}`
153 |         );
154 |       }
155 |       throw error;
156 |     }
157 |   }
158 | 
159 |   async getSource(args: GetSourceArgs) {
160 |     await this.ensureAuthenticated();
161 | 
162 |     try {
163 |       const response = await this.api.get(`/api/v1/sources/${args.sourceId}`);
164 | 
165 |       return {
166 |         content: [
167 |           {
168 |             type: 'text',
169 |             text: JSON.stringify(response.data.data, null, 2),
170 |           },
171 |         ],
172 |       };
173 |     } catch (error) {
174 |       if (axios.isAxiosError(error)) {
175 |         throw new McpError(
176 |           ErrorCode.InternalError,
177 |           `Source retrieval failed: ${error.response?.data?.message || error.message}`
178 |         );
179 |       }
180 |       throw error;
181 |     }
182 |   }
183 | }
184 | 
```

--------------------------------------------------------------------------------
/clients/C++/3.3 mcp_edit_source/MCPEditSourceClient.cpp:
--------------------------------------------------------------------------------

```cpp
  1 | #include <iostream>
  2 | #include <string>
  3 | #include <map>
  4 | #include <vector>
  5 | #include <sstream>
  6 | #include <stdexcept>
  7 | #include <json/json.h>
  8 | #include <winsock2.h>
  9 | #include <ws2tcpip.h>
 10 | 
 11 | #pragma comment(lib, "ws2_32.lib") // Winsock-Bibliothek verlinken
 12 | 
 13 | // Funktion zum Argument-Parsing
 14 | std::map<std::string, std::string> parseArguments(int argc, char* argv[], std::vector<std::string>& groups) {
 15 |     std::map<std::string, std::string> args;
 16 |     for (int i = 1; i < argc; ++i) {
 17 |         std::string key = argv[i];
 18 |         if (i + 1 < argc && key.rfind("--", 0) == 0) {
 19 |             if (key == "--groups") {
 20 |                 while (++i < argc && argv[i][0] != '-') {
 21 |                     groups.push_back(argv[i]);
 22 |                 }
 23 |                 --i; // Rückgängigmachen des letzten Schritts
 24 |             } else {
 25 |                 args[key] = argv[++i];
 26 |             }
 27 |         }
 28 |     }
 29 |     return args;
 30 | }
 31 | 
 32 | // Funktion zum Senden der Anfrage
 33 | std::string sendRequest(const std::string& serverIp, int serverPort, const Json::Value& payload) {
 34 |     Json::StreamWriterBuilder writer;
 35 |     std::string payloadJson = Json::writeString(writer, payload);
 36 | 
 37 |     // Winsock initialisieren
 38 |     WSADATA wsaData;
 39 |     if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
 40 |         throw std::runtime_error("Failed to initialize Winsock.");
 41 |     }
 42 | 
 43 |     // Socket erstellen
 44 |     SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
 45 |     if (sock == INVALID_SOCKET) {
 46 |         WSACleanup();
 47 |         throw std::runtime_error("Failed to create socket.");
 48 |     }
 49 | 
 50 |     // Server-Adresse konfigurieren
 51 |     sockaddr_in serverAddr;
 52 |     serverAddr.sin_family = AF_INET;
 53 |     serverAddr.sin_port = htons(serverPort);
 54 |     if (inet_pton(AF_INET, serverIp.c_str(), &serverAddr.sin_addr) <= 0) {
 55 |         closesocket(sock);
 56 |         WSACleanup();
 57 |         throw std::runtime_error("Invalid server IP address.");
 58 |     }
 59 | 
 60 |     // Verbindung herstellen
 61 |     if (connect(sock, (sockaddr*)&serverAddr, sizeof(serverAddr)) < 0) {
 62 |         closesocket(sock);
 63 |         WSACleanup();
 64 |         throw std::runtime_error("Connection failed.");
 65 |     }
 66 | 
 67 |     // Daten senden
 68 |     if (send(sock, payloadJson.c_str(), payloadJson.size(), 0) < 0) {
 69 |         closesocket(sock);
 70 |         WSACleanup();
 71 |         throw std::runtime_error("Failed to send data.");
 72 |     }
 73 | 
 74 |     // Antwort empfangen
 75 |     char buffer[4096];
 76 |     int bytesRead;
 77 |     std::ostringstream response;
 78 | 
 79 |     do {
 80 |         bytesRead = recv(sock, buffer, sizeof(buffer) - 1, 0);
 81 |         if (bytesRead > 0) {
 82 |             buffer[bytesRead] = '\0'; // Null-terminieren
 83 |             response << buffer;
 84 |         }
 85 |     } while (bytesRead == sizeof(buffer) - 1);
 86 | 
 87 |     // Socket schließen
 88 |     closesocket(sock);
 89 |     WSACleanup();
 90 | 
 91 |     return response.str();
 92 | }
 93 | 
 94 | int main(int argc, char* argv[]) {
 95 |     try {
 96 |         std::vector<std::string> groups;
 97 |         auto args = parseArguments(argc, argv, groups);
 98 | 
 99 |         // Argumente extrahieren
100 |         std::string serverIp = args["--server-ip"];
101 |         int serverPort = std::stoi(args["--server-port"]);
102 |         std::string token = args["--token"];
103 |         std::string sourceId = args["--source-id"];
104 |         std::string title = args["--title"];
105 |         std::string content = args["--content"];
106 | 
107 |         // Überprüfen, ob alle erforderlichen Parameter angegeben sind
108 |         if (serverIp.empty() || serverPort == 0 || token.empty() || sourceId.empty()) {
109 |             std::cerr << "Usage: MCPEditSourceClient --server-ip <IP> --server-port <PORT> --token <TOKEN> --source-id <SOURCE_ID> [--title <TITLE>] [--content <CONTENT>] [--groups <GROUP1 GROUP2 ...>]\n";
110 |             return 1;
111 |         }
112 | 
113 |         std::cout << "📤 Sending request to edit the source...\n";
114 | 
115 |         // JSON-Payload erstellen
116 |         Json::Value payload;
117 |         payload["command"] = "edit_source";
118 |         payload["token"] = token;
119 | 
120 |         Json::Value arguments;
121 |         arguments["sourceId"] = sourceId;
122 |         if (!title.empty()) {
123 |             arguments["title"] = title;
124 |         }
125 |         if (!content.empty()) {
126 |             arguments["content"] = content;
127 |         }
128 | 
129 |         Json::Value groupsJson(Json::arrayValue);
130 |         for (const auto& group : groups) {
131 |             groupsJson.append(group);
132 |         }
133 |         arguments["groups"] = groupsJson;
134 | 
135 |         payload["arguments"] = arguments;
136 | 
137 |         // Anfrage senden und Antwort erhalten
138 |         std::string response = sendRequest(serverIp, serverPort, payload);
139 | 
140 |         std::cout << "✔️ Response from server:\n" << response << "\n";
141 |     } catch (const std::exception& e) {
142 |         std::cerr << "❌ ERROR: " << e.what() << "\n";
143 |         return 1;
144 |     }
145 | 
146 |     return 0;
147 | }
148 | 
```

--------------------------------------------------------------------------------
/clients/C++/2.0 mcp_chat/MCPChatClient.cpp:
--------------------------------------------------------------------------------

```cpp
  1 | #include <iostream>
  2 | #include <string>
  3 | #include <vector>
  4 | #include <map>
  5 | #include <sstream>
  6 | #include <stdexcept>
  7 | #include <json/json.h>
  8 | #include <winsock2.h>
  9 | #include <ws2tcpip.h>
 10 | 
 11 | #pragma comment(lib, "ws2_32.lib") // Winsock-Bibliothek verlinken
 12 | 
 13 | // Funktion zum Argument-Parsing
 14 | std::map<std::string, std::string> parseArguments(int argc, char* argv[]) {
 15 |     std::map<std::string, std::string> args;
 16 |     for (int i = 1; i < argc; ++i) {
 17 |         std::string key = argv[i];
 18 |         if (i + 1 < argc && key.rfind("--", 0) == 0) {
 19 |             args[key] = argv[++i];
 20 |         }
 21 |     }
 22 |     return args;
 23 | }
 24 | 
 25 | // Funktion zum Senden der MCP-Anfrage
 26 | std::string sendMCPRequest(const std::string& serverIp, int serverPort, const std::string& token,
 27 |                            const std::string& question, bool usePublic, const std::vector<std::string>& groups, 
 28 |                            const std::string& language) {
 29 |     // JSON-Payload erstellen
 30 |     Json::Value payload;
 31 |     payload["command"] = "chat";
 32 |     payload["token"] = token;
 33 |     payload["arguments"]["question"] = question;
 34 |     payload["arguments"]["usePublic"] = usePublic;
 35 |     payload["arguments"]["language"] = language;
 36 | 
 37 |     Json::Value groupsJson(Json::arrayValue);
 38 |     for (const auto& group : groups) {
 39 |         groupsJson.append(group);
 40 |     }
 41 |     payload["arguments"]["groups"] = groupsJson;
 42 | 
 43 |     Json::StreamWriterBuilder writer;
 44 |     std::string payloadJson = Json::writeString(writer, payload);
 45 | 
 46 |     // Winsock initialisieren
 47 |     WSADATA wsaData;
 48 |     if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
 49 |         throw std::runtime_error("Failed to initialize Winsock.");
 50 |     }
 51 | 
 52 |     // Socket erstellen
 53 |     SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
 54 |     if (sock == INVALID_SOCKET) {
 55 |         WSACleanup();
 56 |         throw std::runtime_error("Failed to create socket.");
 57 |     }
 58 | 
 59 |     // Server-Adresse konfigurieren
 60 |     sockaddr_in serverAddr;
 61 |     serverAddr.sin_family = AF_INET;
 62 |     serverAddr.sin_port = htons(serverPort);
 63 |     if (inet_pton(AF_INET, serverIp.c_str(), &serverAddr.sin_addr) <= 0) {
 64 |         closesocket(sock);
 65 |         WSACleanup();
 66 |         throw std::runtime_error("Invalid server IP address.");
 67 |     }
 68 | 
 69 |     // Verbindung herstellen
 70 |     if (connect(sock, (sockaddr*)&serverAddr, sizeof(serverAddr)) < 0) {
 71 |         closesocket(sock);
 72 |         WSACleanup();
 73 |         throw std::runtime_error("Connection failed.");
 74 |     }
 75 | 
 76 |     // Daten senden
 77 |     if (send(sock, payloadJson.c_str(), payloadJson.size(), 0) < 0) {
 78 |         closesocket(sock);
 79 |         WSACleanup();
 80 |         throw std::runtime_error("Failed to send data.");
 81 |     }
 82 | 
 83 |     // Antwort empfangen
 84 |     char buffer[4096];
 85 |     int bytesRead;
 86 |     std::ostringstream response;
 87 | 
 88 |     do {
 89 |         bytesRead = recv(sock, buffer, sizeof(buffer) - 1, 0);
 90 |         if (bytesRead > 0) {
 91 |             buffer[bytesRead] = '\0'; // Null-terminieren
 92 |             response << buffer;
 93 |         }
 94 |     } while (bytesRead == sizeof(buffer) - 1);
 95 | 
 96 |     // Socket schließen
 97 |     closesocket(sock);
 98 |     WSACleanup();
 99 | 
100 |     return response.str();
101 | }
102 | 
103 | int main(int argc, char* argv[]) {
104 |     try {
105 |         auto args = parseArguments(argc, argv);
106 | 
107 |         // Argumente extrahieren
108 |         std::string serverIp = args["--server-ip"];
109 |         int serverPort = std::stoi(args["--server-port"]);
110 |         std::string token = args["--token"];
111 |         std::string question = args["--question"];
112 |         bool usePublic = args.find("--use-public") != args.end();
113 |         std::string language = args.count("--language") ? args["--language"] : "de";
114 | 
115 |         // Gruppen extrahieren
116 |         std::vector<std::string> groups;
117 |         if (args.count("--groups")) {
118 |             std::istringstream groupStream(args["--groups"]);
119 |             std::string group;
120 |             while (std::getline(groupStream, group, ',')) {
121 |                 groups.push_back(group);
122 |             }
123 |         }
124 | 
125 |         // Überprüfen, ob alle erforderlichen Parameter angegeben sind
126 |         if (serverIp.empty() || serverPort == 0 || token.empty() || question.empty()) {
127 |             std::cerr << "Usage: --server-ip <IP> --server-port <PORT> --token <TOKEN> --question <QUESTION> [--use-public] [--groups <GROUPS>] [--language <LANGUAGE>]\n";
128 |             return 1;
129 |         }
130 | 
131 |         std::cout << "🔒 Sending MCP chat request...\n";
132 | 
133 |         // MCP-Anfrage senden und Antwort erhalten
134 |         std::string response = sendMCPRequest(serverIp, serverPort, token, question, usePublic, groups, language);
135 | 
136 |         std::cout << "Response from server:\n" << response << "\n";
137 |     } catch (const std::exception& e) {
138 |         std::cerr << "❌ ERROR: " << e.what() << "\n";
139 |         return 1;
140 |     }
141 | 
142 |     return 0;
143 | }
144 | 
```

--------------------------------------------------------------------------------
/clients/JavaScript/3.0 mcp_create_source/MCPCreateSourceClient.js:
--------------------------------------------------------------------------------

```javascript
  1 | const net = require('net');
  2 | const readline = require('readline');
  3 | const { argv, exit } = require('process');
  4 | 
  5 | // Funktion zum Parsen der Kommandozeilenargumente
  6 | function parseArguments(args) {
  7 |     const parsedArgs = {};
  8 |     for (let i = 2; i < args.length; i++) {
  9 |         switch (args[i]) {
 10 |             case '--server-ip':
 11 |                 parsedArgs.serverIp = args[++i];
 12 |                 break;
 13 |             case '--server-port':
 14 |                 parsedArgs.serverPort = parseInt(args[++i], 10);
 15 |                 break;
 16 |             case '--token':
 17 |                 parsedArgs.token = args[++i];
 18 |                 break;
 19 |             case '--name':
 20 |                 parsedArgs.name = args[++i];
 21 |                 break;
 22 |             case '--content':
 23 |                 parsedArgs.content = args[++i];
 24 |                 break;
 25 |             case '--groups':
 26 |                 // Sammle alle Gruppenargumente bis zum nächsten Flag oder Ende
 27 |                 parsedArgs.groups = [];
 28 |                 while (i + 1 < args.length && !args[i + 1].startsWith('--')) {
 29 |                     parsedArgs.groups.push(args[++i]);
 30 |                 }
 31 |                 break;
 32 |             default:
 33 |                 console.warn(`⚠️ Unbekanntes Argument: ${args[i]}`);
 34 |         }
 35 |     }
 36 |     return parsedArgs;
 37 | }
 38 | 
 39 | // Funktion zum interaktiven Abfragen eines Parameters (optional)
 40 | function askQuestion(query) {
 41 |     const rl = readline.createInterface({
 42 |         input: process.stdin,
 43 |         output: process.stdout,
 44 |         terminal: true
 45 |     });
 46 | 
 47 |     return new Promise((resolve) => {
 48 |         rl.question(query, (answer) => {
 49 |             rl.close();
 50 |             resolve(answer);
 51 |         });
 52 |     });
 53 | }
 54 | 
 55 | // Funktion zum Senden einer Create-Source-Anfrage über eine TCP-Verbindung
 56 | function sendCreateSourceRequest(serverIp, serverPort, payload) {
 57 |     return new Promise((resolve, reject) => {
 58 |         const client = new net.Socket();
 59 |         let responseData = '';
 60 | 
 61 |         client.connect(serverPort, serverIp, () => {
 62 |             console.log(`🔗 Verbindung zum Server (${serverIp}:${serverPort}) hergestellt.`);
 63 |             const payloadString = JSON.stringify(payload);
 64 |             console.log(`📤 Sende Payload: ${payloadString}`);
 65 |             client.write(payloadString);
 66 |         });
 67 | 
 68 |         client.on('data', (data) => {
 69 |             console.log(`📥 Empfangene Daten: ${data}`);
 70 |             responseData += data.toString();
 71 |             try {
 72 |                 const parsedData = JSON.parse(responseData);
 73 |                 console.log('✅ JSON-Antwort erfolgreich geparst.');
 74 |                 resolve(parsedData);
 75 |                 client.destroy(); // Verbindung schließen
 76 |             } catch (err) {
 77 |                 console.warn('⚠️ Antwort noch nicht vollständig oder ungültiges JSON. Weitere Daten werden erwartet.');
 78 |                 // Antwort noch nicht vollständig, weiter empfangen
 79 |             }
 80 |         });
 81 | 
 82 |         client.on('close', () => {
 83 |             console.log('🔒 Verbindung zum Server geschlossen.');
 84 |         });
 85 | 
 86 |         client.on('error', (err) => {
 87 |             console.error('❌ Verbindungsfehler:', err.message);
 88 |             reject(err);
 89 |         });
 90 |     });
 91 | }
 92 | 
 93 | // Hauptfunktion
 94 | async function main() {
 95 |     const args = argv;
 96 |     const parsedArgs = parseArguments(args);
 97 |     let { serverIp, serverPort, token, name, content, groups } = parsedArgs;
 98 | 
 99 |     // Überprüfen, ob alle erforderlichen Parameter vorhanden sind, sonst interaktiv abfragen
100 |     if (!serverIp) {
101 |         serverIp = await askQuestion('🔗 Bitte gib die Server-IP ein: ');
102 |     }
103 |     if (!serverPort) {
104 |         const portInput = await askQuestion('🔗 Bitte gib den Server-Port ein: ');
105 |         serverPort = parseInt(portInput, 10);
106 |     }
107 |     if (!token) {
108 |         token = await askQuestion('🔒 Bitte gib dein Authentifizierungstoken ein: ');
109 |     }
110 |     if (!name) {
111 |         name = await askQuestion('📛 Bitte gib den Namen der neuen Quelle ein: ');
112 |     }
113 |     if (!content) {
114 |         content = await askQuestion('📝 Bitte gib den Inhalt der neuen Quelle (Markdown) ein: ');
115 |     }
116 |     if (!groups) {
117 |         const groupsInput = await askQuestion('👥 Bitte gib die Gruppen an (getrennt durch Leerzeichen, optional): ');
118 |         groups = groupsInput ? groupsInput.split(' ') : [];
119 |     }
120 | 
121 |     const payload = {
122 |         command: "create_source",
123 |         token: token,
124 |         arguments: {
125 |             name: name,
126 |             content: content,
127 |             groups: groups
128 |         }
129 |     };
130 | 
131 |     try {
132 |         console.log('🛠️ Sende Create-Source-Anfrage...');
133 |         const response = await sendCreateSourceRequest(serverIp, serverPort, payload);
134 |         console.log('✅ Server Response:');
135 |         console.log(JSON.stringify(response, null, 2));
136 |     } catch (err) {
137 |         console.error('❌ ERROR:', err.message);
138 |     }
139 | }
140 | 
141 | main();
142 | 
```

--------------------------------------------------------------------------------
/clients/PHP/1.0 mcp_login/MCPLoginClient.php:
--------------------------------------------------------------------------------

```php
  1 | <?php
  2 | // Functions for parsing command line arguments
  3 | function parseArguments($args) {
  4 |     $parsedArgs = [];
  5 |     $argc = count($args);
  6 |     for ($i = 1; $i < $argc; $i++) {
  7 |         switch ($args[$i]) {
  8 |             case '--server-ip':
  9 |                 if (isset($args[$i + 1])) {
 10 |                     $parsedArgs['serverIp'] = $args[++$i];
 11 |                 } else {
 12 |                     fwrite(STDERR, "Error: --server-ip expects a value.\n");
 13 |                     exit(1);
 14 |                 }
 15 |                 break;
 16 |             case '--server-port':
 17 |                 if (isset($args[$i + 1])) {
 18 |                     $parsedArgs['serverPort'] = intval($args[++$i]);
 19 |                 } else {
 20 |                     fwrite(STDERR, "Error: --server-port expects a value.\n");
 21 |                     exit(1);
 22 |                 }
 23 |                 break;
 24 |             case '--email':
 25 |                 if (isset($args[$i + 1])) {
 26 |                     $parsedArgs['email'] = $args[++$i];
 27 |                 } else {
 28 |                     fwrite(STDERR, "Error: --email expects a value.\n");
 29 |                     exit(1);
 30 |                 }
 31 |                 break;
 32 |             case '--password':
 33 |                 if (isset($args[$i + 1])) {
 34 |                     $parsedArgs['password'] = $args[++$i];
 35 |                 } else {
 36 |                     fwrite(STDERR, "Error: --password expects a value.\n");
 37 |                     exit(1);
 38 |                 }
 39 |                 break;
 40 |             default:
 41 |                 fwrite(STDERR, "Warning: Unknown argument: {$args[$i]}\n");
 42 |         }
 43 |     }
 44 |     return $parsedArgs;
 45 | }
 46 | 
 47 | // Function for sending a request over a TCP connection
 48 | function sendRequest($serverIp, $serverPort, $payload) {
 49 |     $jsonPayload = json_encode($payload);
 50 |     if ($jsonPayload === false) {
 51 |         throw new Exception("Error encoding JSON payload.");
 52 |     }
 53 | 
 54 |     $errno = 0;
 55 |     $errstr = '';
 56 |     $timeout = 30; // seconds
 57 |     $client = fsockopen($serverIp, $serverPort, $errno, $errstr, $timeout);
 58 |     
 59 |     if (!$client) {
 60 |         throw new Exception("Connection error: $errstr ($errno)");
 61 |     }
 62 | 
 63 |     echo "🔗 Connection to server established.\n";
 64 | 
 65 |     fwrite($client, $jsonPayload);
 66 | 
 67 |     $responseData = '';
 68 |     stream_set_timeout($client, $timeout);
 69 | 
 70 |     while (!feof($client)) {
 71 |         $data = fread($client, 1024);
 72 |         if ($data === false) {
 73 |             throw new Exception("Error reading data from server.");
 74 |         }
 75 |         $responseData .= $data;
 76 | 
 77 |         // Attempt to parse the received data as JSON
 78 |         $parsedData = json_decode($responseData, true);
 79 |         if ($parsedData !== null) {
 80 |             fclose($client);
 81 |             return $parsedData;
 82 |         }
 83 | 
 84 |         // Check if the stream timed out
 85 |         $info = stream_get_meta_data($client);
 86 |         if ($info['timed_out']) {
 87 |             throw new Exception("Timeout waiting for data from server.");
 88 |         }
 89 |     }
 90 | 
 91 |     fclose($client);
 92 |     throw new Exception("Connection to the server was closed before a complete response was received.");
 93 | }
 94 | 
 95 | // Function for interactively asking for a password (optional)
 96 | function askPassword($prompt) {
 97 |     if (preg_match('/^win/i', PHP_OS)) {
 98 |         // Windows-specific password prompt
 99 |         $vbscript = sys_get_temp_dir() . 'prompt_password.vbs';
100 |         file_put_contents($vbscript, 'wscript.echo(InputBox("' . addslashes($prompt) . '", "", "password here"))');
101 |         $password = shell_exec("cscript //nologo " . escapeshellarg($vbscript));
102 |         unlink($vbscript);
103 |         return trim($password);
104 |     } else {
105 |         // Unix/Linux password prompt
106 |         echo $prompt;
107 |         system('stty -echo');
108 |         $password = rtrim(fgets(STDIN), "\n");
109 |         system('stty echo');
110 |         echo "\n";
111 |         return $password;
112 |     }
113 | }
114 | 
115 | // Main function
116 | function main($argv) {
117 |     $args = parseArguments($argv);
118 |     $serverIp = $args['serverIp'] ?? null;
119 |     $serverPort = $args['serverPort'] ?? null;
120 |     $email = $args['email'] ?? null;
121 |     $password = $args['password'] ?? null;
122 | 
123 |     // Check if all required parameters are present
124 |     if (!$serverIp || !$serverPort || !$email || !$password) {
125 |         fwrite(STDERR, "❌ ERROR: Missing required parameters.\n");
126 |         fwrite(STDOUT, "Usage: php MCPLoginClient.php --server-ip <IP> --server-port <Port> --email <Email> --password <Password>\n");
127 |         exit(1);
128 |     }
129 | 
130 |     $payload = [
131 |         "command" => "login",
132 |         "arguments" => [
133 |             "email" => $email,
134 |             "password" => $password
135 |         ]
136 |     ];
137 | 
138 |     try {
139 |         echo "🔐 Logging in...\n";
140 |         $response = sendRequest($serverIp, $serverPort, $payload);
141 |         echo "✅ Server Response:\n";
142 |         echo json_encode($response, JSON_PRETTY_PRINT) . "\n";
143 |     } catch (Exception $e) {
144 |         fwrite(STDERR, "❌ ERROR: " . $e->getMessage() . "\n");
145 |     }
146 | }
147 | 
148 | main($argv);
149 | ?>
150 | 
```

--------------------------------------------------------------------------------
/clients/PHP/1.1 mcp_logout/MCPLogoutClient.php:
--------------------------------------------------------------------------------

```php
  1 | <?php
  2 | // Functions for parsing command line arguments
  3 | function parseArguments($args) {
  4 |     $parsedArgs = [];
  5 |     $argc = count($args);
  6 |     for ($i = 1; $i < $argc; $i++) {
  7 |         switch ($args[$i]) {
  8 |             case '--server-ip':
  9 |                 if (isset($args[$i + 1])) {
 10 |                     $parsedArgs['serverIp'] = $args[++$i];
 11 |                 } else {
 12 |                     fwrite(STDERR, "Error: --server-ip expects a value.\n");
 13 |                     exit(1);
 14 |                 }
 15 |                 break;
 16 |             case '--server-port':
 17 |                 if (isset($args[$i + 1])) {
 18 |                     $parsedArgs['serverPort'] = intval($args[++$i]);
 19 |                 } else {
 20 |                     fwrite(STDERR, "Error: --server-port expects a value.\n");
 21 |                     exit(1);
 22 |                 }
 23 |                 break;
 24 |             case '--token':
 25 |                 if (isset($args[$i + 1])) {
 26 |                     $parsedArgs['token'] = $args[++$i];
 27 |                 } else {
 28 |                     fwrite(STDERR, "Error: --token expects a value.\n");
 29 |                     exit(1);
 30 |                 }
 31 |                 break;
 32 |             default:
 33 |                 fwrite(STDERR, "Warning: Unknown argument: {$args[$i]}\n");
 34 |         }
 35 |     }
 36 |     return $parsedArgs;
 37 | }
 38 | 
 39 | // Function for interactively asking for a token (optional)
 40 | function askToken($prompt) {
 41 |     if (preg_match('/^win/i', PHP_OS)) {
 42 |         // Windows-specific token prompt
 43 |         $vbscript = sys_get_temp_dir() . 'prompt_token.vbs';
 44 |         file_put_contents($vbscript, 'wscript.echo(InputBox("' . addslashes($prompt) . '", "", "token here"))');
 45 |         $token = shell_exec("cscript //nologo " . escapeshellarg($vbscript));
 46 |         unlink($vbscript);
 47 |         return trim($token);
 48 |     } else {
 49 |         // Unix/Linux token prompt
 50 |         echo $prompt;
 51 |         // Token input typically without echo
 52 |         if (shell_exec('which stty')) {
 53 |             system('stty -echo');
 54 |             $token = rtrim(fgets(STDIN), "\n");
 55 |             system('stty echo');
 56 |             echo "\n";
 57 |             return $token;
 58 |         } else {
 59 |             // Fallback if stty is unavailable
 60 |             return rtrim(fgets(STDIN), "\n");
 61 |         }
 62 |     }
 63 | }
 64 | 
 65 | // Function for sending a logout request over a TCP connection
 66 | function sendLogoutRequest($serverIp, $serverPort, $payload) {
 67 |     $jsonPayload = json_encode($payload);
 68 |     if ($jsonPayload === false) {
 69 |         throw new Exception("Error encoding JSON payload.");
 70 |     }
 71 | 
 72 |     $errno = 0;
 73 |     $errstr = '';
 74 |     $timeout = 30; // seconds
 75 |     $client = fsockopen($serverIp, $serverPort, $errno, $errstr, $timeout);
 76 |     
 77 |     if (!$client) {
 78 |         throw new Exception("Connection error: $errstr ($errno)");
 79 |     }
 80 | 
 81 |     echo "🔗 Connection to server established.\n";
 82 | 
 83 |     fwrite($client, $jsonPayload);
 84 | 
 85 |     $responseData = '';
 86 |     stream_set_timeout($client, $timeout);
 87 | 
 88 |     while (!feof($client)) {
 89 |         $data = fread($client, 1024);
 90 |         if ($data === false) {
 91 |             throw new Exception("Error reading data from server.");
 92 |         }
 93 |         $responseData .= $data;
 94 | 
 95 |         // Attempt to parse the received data as JSON
 96 |         $parsedData = json_decode($responseData, true);
 97 |         if ($parsedData !== null) {
 98 |             fclose($client);
 99 |             return $parsedData;
100 |         }
101 | 
102 |         // Check if the stream timed out
103 |         $info = stream_get_meta_data($client);
104 |         if ($info['timed_out']) {
105 |             throw new Exception("Timeout waiting for data from server.");
106 |         }
107 |     }
108 | 
109 |     fclose($client);
110 |     throw new Exception("Connection to the server was closed before a complete response was received.");
111 | }
112 | 
113 | // Main function
114 | function main($argv) {
115 |     $args = parseArguments($argv);
116 |     $serverIp = $args['serverIp'] ?? null;
117 |     $serverPort = $args['serverPort'] ?? null;
118 |     $token = $args['token'] ?? null;
119 | 
120 |     // Check if all required parameters except token are present
121 |     if (!$serverIp || !$serverPort) {
122 |         fwrite(STDERR, "❌ ERROR: Missing required parameters.\n");
123 |         fwrite(STDOUT, "Usage: php MCPLogoutClient.php --server-ip <IP> --server-port <Port> --token <Token>\n");
124 |         exit(1);
125 |     }
126 | 
127 |     // Interactively ask for token if not provided in arguments
128 |     $authToken = $token;
129 |     if (!$authToken) {
130 |         $authToken = askToken('🔒 Please enter your authentication token: ');
131 |     }
132 | 
133 |     if (empty($authToken)) {
134 |         fwrite(STDERR, "❌ ERROR: Authentication token must not be empty.\n");
135 |         exit(1);
136 |     }
137 | 
138 |     $payload = [
139 |         "command" => "logout",
140 |         "token" => $authToken
141 |     ];
142 | 
143 |     try {
144 |         echo "🚪 Logging out...\n";
145 |         $response = sendLogoutRequest($serverIp, $serverPort, $payload);
146 |         echo "✅ Server Response:\n";
147 |         echo json_encode($response, JSON_PRETTY_PRINT) . "\n";
148 |     } catch (Exception $e) {
149 |         fwrite(STDERR, "❌ ERROR: " . $e->getMessage() . "\n");
150 |     }
151 | }
152 | 
153 | main($argv);
154 | ?>
155 | 
```

--------------------------------------------------------------------------------
/clients/C++/5.0 mcp_store_user/MCPStoreUserClient.cpp:
--------------------------------------------------------------------------------

```cpp
  1 | #include <iostream>
  2 | #include <string>
  3 | #include <map>
  4 | #include <vector>
  5 | #include <sstream>
  6 | #include <stdexcept>
  7 | #include <json/json.h>
  8 | #include <winsock2.h>
  9 | #include <ws2tcpip.h>
 10 | 
 11 | #pragma comment(lib, "ws2_32.lib") // Verlinkung mit der Winsock-Bibliothek
 12 | 
 13 | // Funktion zum Parsen von Argumenten
 14 | std::map<std::string, std::string> parseArguments(int argc, char* argv[]) {
 15 |     std::map<std::string, std::string> args;
 16 |     for (int i = 1; i < argc; ++i) {
 17 |         std::string key = argv[i];
 18 |         if (i + 1 < argc && key.rfind("--", 0) == 0) {
 19 |             args[key] = argv[++i];
 20 |         }
 21 |     }
 22 |     return args;
 23 | }
 24 | 
 25 | // Funktion zum Parsen von Listen-Argumenten
 26 | std::vector<std::string> parseListArgument(int argc, char* argv[], const std::string& key) {
 27 |     std::vector<std::string> values;
 28 |     for (int i = 1; i < argc; ++i) {
 29 |         if (argv[i] == key && i + 1 < argc) {
 30 |             for (int j = i + 1; j < argc && std::string(argv[j]).rfind("--", 0) != 0; ++j) {
 31 |                 values.push_back(argv[j]);
 32 |             }
 33 |         }
 34 |     }
 35 |     return values;
 36 | }
 37 | 
 38 | // Funktion zum Senden der Anfrage
 39 | std::string sendRequest(const std::string& serverIp, int serverPort, const Json::Value& payload) {
 40 |     Json::StreamWriterBuilder writer;
 41 |     std::string payloadJson = Json::writeString(writer, payload);
 42 | 
 43 |     // Winsock initialisieren
 44 |     WSADATA wsaData;
 45 |     if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
 46 |         throw std::runtime_error("Failed to initialize Winsock.");
 47 |     }
 48 | 
 49 |     // Socket erstellen
 50 |     SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
 51 |     if (sock == INVALID_SOCKET) {
 52 |         WSACleanup();
 53 |         throw std::runtime_error("Failed to create socket.");
 54 |     }
 55 | 
 56 |     // Server-Adresse konfigurieren
 57 |     sockaddr_in serverAddr;
 58 |     serverAddr.sin_family = AF_INET;
 59 |     serverAddr.sin_port = htons(serverPort);
 60 |     if (inet_pton(AF_INET, serverIp.c_str(), &serverAddr.sin_addr) <= 0) {
 61 |         closesocket(sock);
 62 |         WSACleanup();
 63 |         throw std::runtime_error("Invalid server IP address.");
 64 |     }
 65 | 
 66 |     // Verbindung herstellen
 67 |     if (connect(sock, (sockaddr*)&serverAddr, sizeof(serverAddr)) < 0) {
 68 |         closesocket(sock);
 69 |         WSACleanup();
 70 |         throw std::runtime_error("Connection failed.");
 71 |     }
 72 | 
 73 |     // Daten senden
 74 |     if (send(sock, payloadJson.c_str(), payloadJson.size(), 0) < 0) {
 75 |         closesocket(sock);
 76 |         WSACleanup();
 77 |         throw std::runtime_error("Failed to send data.");
 78 |     }
 79 | 
 80 |     // Antwort empfangen
 81 |     char buffer[4096];
 82 |     int bytesRead;
 83 |     std::ostringstream response;
 84 | 
 85 |     do {
 86 |         bytesRead = recv(sock, buffer, sizeof(buffer) - 1, 0);
 87 |         if (bytesRead > 0) {
 88 |             buffer[bytesRead] = '\0'; // Null-terminieren
 89 |             response << buffer;
 90 |         }
 91 |     } while (bytesRead == sizeof(buffer) - 1);
 92 | 
 93 |     // Socket schließen
 94 |     closesocket(sock);
 95 |     WSACleanup();
 96 | 
 97 |     return response.str();
 98 | }
 99 | 
100 | int main(int argc, char* argv[]) {
101 |     try {
102 |         auto args = parseArguments(argc, argv);
103 | 
104 |         // Argumente auslesen
105 |         std::string serverIp = args["--server-ip"];
106 |         int serverPort = std::stoi(args["--server-port"]);
107 |         std::string token = args["--token"];
108 |         std::string name = args["--name"];
109 |         std::string email = args["--email"];
110 |         std::string password = args["--password"];
111 |         std::string language = args.count("--language") ? args["--language"] : "en";
112 |         std::string timezone = args.count("--timezone") ? args["--timezone"] : "Europe/Berlin";
113 |         auto roles = parseListArgument(argc, argv, "--roles");
114 |         auto groups = parseListArgument(argc, argv, "--groups");
115 |         bool usePublic = args.count("--usePublic");
116 |         bool activateFtp = args.count("--activateFtp");
117 |         std::string ftpPassword = args.count("--ftpPassword") ? args["--ftpPassword"] : "";
118 | 
119 |         // JSON-Payload erstellen
120 |         Json::Value payload;
121 |         payload["command"] = "store_user";
122 |         payload["token"] = token;
123 |         payload["arguments"]["name"] = name;
124 |         payload["arguments"]["email"] = email;
125 |         payload["arguments"]["password"] = password;
126 |         payload["arguments"]["language"] = language;
127 |         payload["arguments"]["timezone"] = timezone;
128 |         for (const auto& role : roles) {
129 |             payload["arguments"]["roles"].append(role);
130 |         }
131 |         for (const auto& group : groups) {
132 |             payload["arguments"]["groups"].append(group);
133 |         }
134 |         payload["arguments"]["usePublic"] = usePublic;
135 |         payload["arguments"]["activateFtp"] = activateFtp;
136 |         payload["arguments"]["ftpPassword"] = ftpPassword;
137 | 
138 |         std::cout << "📤 Sending store user request...\n";
139 | 
140 |         // Anfrage senden und Antwort erhalten
141 |         std::string response = sendRequest(serverIp, serverPort, payload);
142 | 
143 |         std::cout << "✔️ Response from server:\n" << response << "\n";
144 |     } catch (const std::exception& e) {
145 |         std::cerr << "❌ ERROR: " << e.what() << "\n";
146 |         return 1;
147 |     }
148 | 
149 |     return 0;
150 | }
151 | 
```

--------------------------------------------------------------------------------
/agents/IoTAgent/Python/language.py:
--------------------------------------------------------------------------------

```python
 1 | # language.py
 2 | languages = {
 3 |     "en": {
 4 |         "configuration_loaded": "Configuration loaded from {config_path}.",
 5 |         "error_loading_config": "Error loading configuration: {e}",
 6 |         "welcome": "Connected to MQTT broker successfully.",
 7 |         "chatbot_error_status": "Chatbot returned error status {status_code}.",
 8 |         "start_uploading_file": "Starting upload for file: {file_path}.",
 9 |         "error_sftp_upload": "Error uploading file {file_path}: {e}",
10 |         "file_archived": "File {file_path} archived as {archive_name}.",
11 |         "error_archiving_file": "Error archiving file {file_path}: {e}",
12 |         "file_size": "File {file_path} size: {file_size} bytes.",
13 |         "file_limit_reached": "File {file_path} reached size limit of {size_limit} bytes.",
14 |         "new_file_created": "New file created at {file_path}.",
15 |         "cannot_create_new_file": "Cannot create new file of type {file_type} for language {language}.",
16 |         "error_getting_suffixes": "Error getting suffixes: {e}",
17 |         "record_added": "Record added to {file_path}.",
18 |         "invalid_group": "Invalid group type: {groups}.",
19 |         "error_writing_file": "Error writing to file {file_path}: {e}",
20 |         "file_empty_or_corrupted": "File {file_path} is empty or corrupted.",
21 |         "language_sentence_generated": "Language: {language_full} | Sentence: {sentence}",
22 |         "no_translation_file_config": "No translation file configured for language {language}.",
23 |         "no_file_handler_found": "No file handler found for language {language}.",
24 |         "no_translation_file_in_config": "No translation file configured in config for language {language}.",
25 |         "empty_answer_field": "Warning: 'answer' field is empty in the chatbot response.",
26 |         "max_retries_reached": "Maximum retry attempts reached.",
27 |         "communication_error": "Communication error: {e} | Attempt {attempt} of {max_retries}.",
28 |         "waiting_before_retry": "Waiting {wait_seconds} seconds before retrying...",
29 |         "error_in_interpret_and_output": "Error in interpret_and_output: {e}",
30 |         "sending_request_to_chatbot": "Sending request to chatbot (Attempt {attempt}).",
31 |         "chatbot_response": "Chatbot response: {response}",
32 |         "unknown_language": "Unknown language: {language}.",
33 |         "no_sentence_generated": "No sentence generated for language {language_full}.",
34 |         "user_exit": "User initiated exit."
35 |     },
36 |     "de": {
37 |         "configuration_loaded": "Konfiguration geladen von {config_path}.",
38 |         "error_loading_config": "Fehler beim Laden der Konfiguration: {e}",
39 |         "welcome": "Erfolgreich mit dem MQTT-Broker verbunden.",
40 |         "chatbot_error_status": "Chatbot hat Fehlerstatus {status_code} zurückgegeben.",
41 |         "start_uploading_file": "Starte Upload für Datei: {file_path}.",
42 |         "error_sftp_upload": "Fehler beim Hochladen der Datei {file_path}: {e}",
43 |         "file_archived": "Datei {file_path} archiviert als {archive_name}.",
44 |         "error_archiving_file": "Fehler beim Archivieren der Datei {file_path}: {e}",
45 |         "file_size": "Datei {file_path} Größe: {file_size} Bytes.",
46 |         "file_limit_reached": "Datei {file_path} hat das Größenlimit von {size_limit} Bytes erreicht.",
47 |         "new_file_created": "Neue Datei erstellt unter {file_path}.",
48 |         "cannot_create_new_file": "Kann keine neue Datei vom Typ {file_type} für Sprache {language} erstellen.",
49 |         "error_getting_suffixes": "Fehler beim Abrufen der Suffixe: {e}",
50 |         "record_added": "Datensatz hinzugefügt zu {file_path}.",
51 |         "invalid_group": "Ungültiger Gruppentyp: {groups}.",
52 |         "error_writing_file": "Fehler beim Schreiben in die Datei {file_path}: {e}",
53 |         "file_empty_or_corrupted": "Datei {file_path} ist leer oder beschädigt.",
54 |         "language_sentence_generated": "Sprache: {language_full} | Satz: {sentence}",
55 |         "no_translation_file_config": "Keine Übersetzungsdatei für Sprache {language} konfiguriert.",
56 |         "no_file_handler_found": "Kein Dateihandler für Sprache {language} gefunden.",
57 |         "no_translation_file_in_config": "Keine Übersetzungsdatei in der Konfiguration für Sprache {language} konfiguriert.",
58 |         "empty_answer_field": "Warnung: 'answer'-Feld ist in der Chatbot-Antwort leer.",
59 |         "max_retries_reached": "Maximale Anzahl an Wiederholungsversuchen erreicht.",
60 |         "communication_error": "Kommunikationsfehler: {e} | Versuch {attempt} von {max_retries}.",
61 |         "waiting_before_retry": "Warte {wait_seconds} Sekunden bevor erneut versucht wird...",
62 |         "error_in_interpret_and_output": "Fehler in interpret_and_output: {e}",
63 |         "sending_request_to_chatbot": "Sende Anfrage an Chatbot (Versuch {attempt}).",
64 |         "chatbot_response": "Chatbot-Antwort: {response}",
65 |         "unknown_language": "Unbekannte Sprache: {language}.",
66 |         "no_sentence_generated": "Kein Satz für Sprache {language_full} generiert.",
67 |         "user_exit": "Benutzer hat die Anwendung beendet."
68 |     }
69 | }
70 | 
```

--------------------------------------------------------------------------------
/agents/ISMAgent/Python/language.py:
--------------------------------------------------------------------------------

```python
 1 | # language.py
 2 | languages = {
 3 |     "en": {
 4 |         "configuration_loaded": "Configuration loaded from {config_path}.",
 5 |         "error_loading_config": "Error loading configuration: {e}",
 6 |         "welcome": "Connected to MQTT broker successfully.",
 7 |         "chatbot_error_status": "Chatbot returned error status {status_code}.",
 8 |         "start_uploading_file": "Starting upload for file: {file_path}.",
 9 |         "error_sftp_upload": "Error uploading file {file_path}: {e}",
10 |         "file_archived": "File {file_path} archived as {archive_name}.",
11 |         "error_archiving_file": "Error archiving file {file_path}: {e}",
12 |         "file_size": "File {file_path} size: {file_size} bytes.",
13 |         "file_limit_reached": "File {file_path} reached size limit of {size_limit} bytes.",
14 |         "new_file_created": "New file created at {file_path}.",
15 |         "cannot_create_new_file": "Cannot create new file of type {file_type} for language {language}.",
16 |         "error_getting_suffixes": "Error getting suffixes: {e}",
17 |         "record_added": "Record added to {file_path}.",
18 |         "invalid_group": "Invalid group type: {groups}.",
19 |         "error_writing_file": "Error writing to file {file_path}: {e}",
20 |         "file_empty_or_corrupted": "File {file_path} is empty or corrupted.",
21 |         "language_sentence_generated": "Language: {language_full} | Sentence: {sentence}",
22 |         "no_translation_file_config": "No translation file configured for language {language}.",
23 |         "no_file_handler_found": "No file handler found for language {language}.",
24 |         "no_translation_file_in_config": "No translation file configured in config for language {language}.",
25 |         "empty_answer_field": "Warning: 'answer' field is empty in the chatbot response.",
26 |         "max_retries_reached": "Maximum retry attempts reached.",
27 |         "communication_error": "Communication error: {e} | Attempt {attempt} of {max_retries}.",
28 |         "waiting_before_retry": "Waiting {wait_seconds} seconds before retrying...",
29 |         "error_in_interpret_and_output": "Error in interpret_and_output: {e}",
30 |         "sending_request_to_chatbot": "Sending request to chatbot (Attempt {attempt}).",
31 |         "chatbot_response": "Chatbot response: {response}",
32 |         "unknown_language": "Unknown language: {language}.",
33 |         "no_sentence_generated": "No sentence generated for language {language_full}.",
34 |         "user_exit": "User initiated exit."
35 |     },
36 |     "de": {
37 |         "configuration_loaded": "Konfiguration geladen von {config_path}.",
38 |         "error_loading_config": "Fehler beim Laden der Konfiguration: {e}",
39 |         "welcome": "Erfolgreich mit dem MQTT-Broker verbunden.",
40 |         "chatbot_error_status": "Chatbot hat Fehlerstatus {status_code} zurückgegeben.",
41 |         "start_uploading_file": "Starte Upload für Datei: {file_path}.",
42 |         "error_sftp_upload": "Fehler beim Hochladen der Datei {file_path}: {e}",
43 |         "file_archived": "Datei {file_path} archiviert als {archive_name}.",
44 |         "error_archiving_file": "Fehler beim Archivieren der Datei {file_path}: {e}",
45 |         "file_size": "Datei {file_path} Größe: {file_size} Bytes.",
46 |         "file_limit_reached": "Datei {file_path} hat das Größenlimit von {size_limit} Bytes erreicht.",
47 |         "new_file_created": "Neue Datei erstellt unter {file_path}.",
48 |         "cannot_create_new_file": "Kann keine neue Datei vom Typ {file_type} für Sprache {language} erstellen.",
49 |         "error_getting_suffixes": "Fehler beim Abrufen der Suffixe: {e}",
50 |         "record_added": "Datensatz hinzugefügt zu {file_path}.",
51 |         "invalid_group": "Ungültiger Gruppentyp: {groups}.",
52 |         "error_writing_file": "Fehler beim Schreiben in die Datei {file_path}: {e}",
53 |         "file_empty_or_corrupted": "Datei {file_path} ist leer oder beschädigt.",
54 |         "language_sentence_generated": "Sprache: {language_full} | Satz: {sentence}",
55 |         "no_translation_file_config": "Keine Übersetzungsdatei für Sprache {language} konfiguriert.",
56 |         "no_file_handler_found": "Kein Dateihandler für Sprache {language} gefunden.",
57 |         "no_translation_file_in_config": "Keine Übersetzungsdatei in der Konfiguration für Sprache {language} konfiguriert.",
58 |         "empty_answer_field": "Warnung: 'answer'-Feld ist in der Chatbot-Antwort leer.",
59 |         "max_retries_reached": "Maximale Anzahl an Wiederholungsversuchen erreicht.",
60 |         "communication_error": "Kommunikationsfehler: {e} | Versuch {attempt} von {max_retries}.",
61 |         "waiting_before_retry": "Warte {wait_seconds} Sekunden bevor erneut versucht wird...",
62 |         "error_in_interpret_and_output": "Fehler in interpret_and_output: {e}",
63 |         "sending_request_to_chatbot": "Sende Anfrage an Chatbot (Versuch {attempt}).",
64 |         "chatbot_response": "Chatbot-Antwort: {response}",
65 |         "unknown_language": "Unbekannte Sprache: {language}.",
66 |         "no_sentence_generated": "Kein Satz für Sprache {language_full} generiert.",
67 |         "user_exit": "Benutzer hat die Anwendung beendet."
68 |     }
69 | }
70 | 
```

--------------------------------------------------------------------------------
/clients/Java/3.0 mcp_create_source/MCPCreateSourceClient.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.List;
 11 | 
 12 | public class MCPCreateSourceClient {
 13 | 
 14 |     public static void main(String[] args) {
 15 |         // Entspricht dem Minimalcheck (8 Parameter) wie im C#-Code.
 16 |         if (args.length < 8) {
 17 |             printUsage();
 18 |             return;
 19 |         }
 20 | 
 21 |         String serverIp  = getArgument(args, "--server-ip");
 22 |         String portStr   = getArgument(args, "--server-port");
 23 |         String token     = getArgument(args, "--token");
 24 |         String name      = getArgument(args, "--name");
 25 |         String content   = getArgument(args, "--content");
 26 |         List<String> groups = getArgumentList(args, "--groups");
 27 | 
 28 |         // Falls wichtige Argumente fehlen, direkt Usage anzeigen
 29 |         if (serverIp == null || portStr == null || token == null 
 30 |             || name == null || content == null) {
 31 |             printUsage();
 32 |             return;
 33 |         }
 34 | 
 35 |         int serverPort = Integer.parseInt(portStr);
 36 | 
 37 |         System.out.println("📤 Sending request to create a new source...");
 38 | 
 39 |         // JSON-Payload erstellen
 40 |         JSONObject payload = new JSONObject();
 41 |         payload.put("command", "create_source");
 42 |         payload.put("token", token);
 43 | 
 44 |         // "arguments" Objekt
 45 |         JSONObject arguments = new JSONObject();
 46 |         arguments.put("name", name);
 47 |         arguments.put("content", content);
 48 | 
 49 |         // "groups" als JSONArray hinzufügen
 50 |         JSONArray groupsJsonArray = new JSONArray(groups);
 51 |         arguments.put("groups", groupsJsonArray);
 52 | 
 53 |         payload.put("arguments", arguments);
 54 | 
 55 |         // Request an den MCP-Server senden
 56 |         String response = sendRequest(serverIp, serverPort, payload);
 57 |         System.out.println("✔️ Response from server:");
 58 |         System.out.println(response);
 59 |     }
 60 | 
 61 |     /**
 62 |      * Gibt einen einzelnen Argumentwert für das gegebene Schlüsselwort zurück,
 63 |      * oder null, wenn keiner gefunden wurde.
 64 |      */
 65 |     private static String getArgument(String[] args, String key) {
 66 |         for (int i = 0; i < args.length - 1; i++) {
 67 |             if (args[i].equals(key)) {
 68 |                 return args[i + 1];
 69 |             }
 70 |         }
 71 |         return null;
 72 |     }
 73 | 
 74 |     /**
 75 |      * Sucht im args-Array nach dem Schlüssel 'key' und liest dann solange
 76 |      * weiter, bis das nächste Argument wieder mit "--" beginnt (oder das Array endet).
 77 |      * So können mehrere Gruppenwerte nacheinander gelesen werden.
 78 |      */
 79 |     private static List<String> getArgumentList(String[] args, String key) {
 80 |         List<String> values = new ArrayList<>();
 81 |         for (int i = 0; i < args.length; i++) {
 82 |             if (args[i].equals(key)) {
 83 |                 // Ab hier die folgenden Einträge sammeln, bis "--" oder Ende
 84 |                 for (int j = i + 1; j < args.length; j++) {
 85 |                     if (args[j].startsWith("--")) {
 86 |                         break;
 87 |                     }
 88 |                     values.add(args[j]);
 89 |                 }
 90 |                 break; // Suche beenden, sobald wir die Liste gefunden haben
 91 |             }
 92 |         }
 93 |         return values;
 94 |     }
 95 | 
 96 |     /**
 97 |      * Baut eine Socket-Verbindung zum Server auf, sendet das JSON-Payload
 98 |      * und empfängt die Antwort.
 99 |      */
100 |     private static String sendRequest(String serverIp, int serverPort, JSONObject payload) {
101 |         String payloadJson = payload.toString();
102 | 
103 |         try (Socket client = new Socket(serverIp, serverPort)) {
104 |             // Daten senden
105 |             OutputStream out = client.getOutputStream();
106 |             byte[] data = payloadJson.getBytes(StandardCharsets.UTF_8);
107 |             out.write(data);
108 |             out.flush();
109 | 
110 |             // Antwort empfangen
111 |             InputStream in = client.getInputStream();
112 |             byte[] buffer = new byte[4096];
113 |             StringBuilder responseBuilder = new StringBuilder();
114 |             int bytesRead;
115 | 
116 |             do {
117 |                 bytesRead = in.read(buffer);
118 |                 if (bytesRead > 0) {
119 |                     responseBuilder.append(new String(buffer, 0, bytesRead, StandardCharsets.UTF_8));
120 |                 }
121 |             } while (bytesRead == buffer.length);
122 | 
123 |             return responseBuilder.toString();
124 | 
125 |         } catch (IOException e) {
126 |             return "Error: " + e.getMessage();
127 |         }
128 |     }
129 | 
130 |     private static void printUsage() {
131 |         System.out.println("Usage:");
132 |         System.out.println("  --server-ip <IP> --server-port <PORT> --token <TOKEN> "
133 |                          + "--name <NAME> --content <CONTENT> [--groups <GROUP1 GROUP2 ...>]");
134 |         System.out.println();
135 |         System.out.println("Example:");
136 |         System.out.println("  java -cp .;json-20241224.jar MCPCreateSourceClient "
137 |                          + "--server-ip 127.0.0.1 --server-port 1234 --token MyToken "
138 |                          + "--name \"Test Source\" --content \"This is some content\" "
139 |                          + "--groups dev hr admin");
140 |     }
141 | }
142 | 
```
Page 10/20FirstPrevNextLast