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 |
```