geoservercloud-mcp 0.1.6__tar.gz → 0.1.7__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/PKG-INFO +39 -61
  2. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/README.md +38 -60
  3. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoservercloud/mcp/server.py +49 -14
  4. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/pyproject.toml +1 -1
  5. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/LICENSE +0 -0
  6. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/.gitignore +0 -0
  7. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/README.md +0 -0
  8. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/__init__.py +0 -0
  9. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/cli.py +0 -0
  10. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/compose/example.compose.yaml +0 -0
  11. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/compose/geodatabase/001_create_schemas.sql +0 -0
  12. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/config.py +0 -0
  13. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/data/sampledata.tgz +0 -0
  14. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/example.config.yaml +0 -0
  15. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/tests/__init__.py +0 -0
  16. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/tests/conftest.py +0 -0
  17. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/tests/resources/__init__.py +0 -0
  18. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/tests/resources/i18n/__init__.py +0 -0
  19. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/tests/resources/i18n/labels/default_locale/default_value/language_None_expected.png +0 -0
  20. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/tests/resources/i18n/labels/default_locale/default_value/language__expected.png +0 -0
  21. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/tests/resources/i18n/labels/default_locale/default_value/language_de_expected.png +0 -0
  22. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/tests/resources/i18n/labels/default_locale/default_value/language_fr_expected.png +0 -0
  23. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/tests/resources/i18n/labels/default_locale/default_value/language_it_expected.png +0 -0
  24. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/tests/resources/i18n/labels/default_locale/no_default_value/language_None_expected.png +0 -0
  25. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/tests/resources/i18n/labels/default_locale/no_default_value/language__expected.png +0 -0
  26. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/tests/resources/i18n/labels/default_locale/no_default_value/language_it_expected.png +0 -0
  27. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/tests/resources/i18n/labels/no_default_locale/default_value/language_None_expected.png +0 -0
  28. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/tests/resources/i18n/labels/no_default_locale/default_value/language__expected.png +0 -0
  29. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/tests/resources/i18n/labels/no_default_locale/default_value/language_de_expected.png +0 -0
  30. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/tests/resources/i18n/labels/no_default_locale/default_value/language_fr_expected.png +0 -0
  31. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/tests/resources/i18n/labels/no_default_locale/default_value/language_it_expected.png +0 -0
  32. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/tests/resources/i18n/labels/no_default_locale/no_default_value/language_None_expected.png +0 -0
  33. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/tests/resources/i18n/labels/no_default_locale/no_default_value/language__expected.png +0 -0
  34. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/tests/resources/i18n/labels/no_default_locale/no_default_value/language_it_expected.png +0 -0
  35. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/tests/resources/i18n/localized_labels.sld +0 -0
  36. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/tests/resources/i18n/localized_no_default.sld +0 -0
  37. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/tests/resources/i18n/localized_with_default.sld +0 -0
  38. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/tests/resources/wfs/__init__.py +0 -0
  39. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/tests/resources/wfs/wfs_delete_payload.xml +0 -0
  40. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/tests/resources/wfs/wfs_insert_payload.xml +0 -0
  41. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/tests/resources/wms/__init__.py +0 -0
  42. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/tests/resources/wms/getmap_expected.png +0 -0
  43. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/tests/test_cascaded_stores.py +0 -0
  44. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/tests/test_cog.py +0 -0
  45. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/tests/test_datastore.py +0 -0
  46. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/tests/test_get_version.py +0 -0
  47. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/tests/test_gwc.py +0 -0
  48. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/tests/test_i18n.py +0 -0
  49. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/tests/test_imagemosaic.py +0 -0
  50. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/tests/test_imagemosaic_cog.py +0 -0
  51. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/tests/test_installed_fonts.py +0 -0
  52. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/tests/test_ogcapi_features.py +0 -0
  53. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/tests/test_s3_credentials_chain.py +0 -0
  54. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/tests/test_wfs.py +0 -0
  55. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/tests/test_wms.py +0 -0
  56. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/tests/test_workspace.py +0 -0
  57. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoserver_acceptance_tests/tests/utils.py +0 -0
  58. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoservercloud/__init__.py +0 -0
  59. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoservercloud/geoservercloud.py +0 -0
  60. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoservercloud/geoservercloudsync.py +0 -0
  61. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoservercloud/gridsets/2056.xml +0 -0
  62. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoservercloud/gridsets/21781.xml +0 -0
  63. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoservercloud/gridsets/3857.xml +0 -0
  64. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoservercloud/mcp/__init__.py +0 -0
  65. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoservercloud/models/__init__.py +0 -0
  66. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoservercloud/models/abstractlayer.py +0 -0
  67. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoservercloud/models/common.py +0 -0
  68. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoservercloud/models/coverage.py +0 -0
  69. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoservercloud/models/coverages.py +0 -0
  70. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoservercloud/models/coveragestore.py +0 -0
  71. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoservercloud/models/datastore.py +0 -0
  72. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoservercloud/models/datastores.py +0 -0
  73. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoservercloud/models/featuretype.py +0 -0
  74. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoservercloud/models/featuretypes.py +0 -0
  75. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoservercloud/models/layer.py +0 -0
  76. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoservercloud/models/layergroup.py +0 -0
  77. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoservercloud/models/layergroups.py +0 -0
  78. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoservercloud/models/resourcedirectory.py +0 -0
  79. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoservercloud/models/style.py +0 -0
  80. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoservercloud/models/styles.py +0 -0
  81. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoservercloud/models/wmslayer.py +0 -0
  82. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoservercloud/models/wmssettings.py +0 -0
  83. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoservercloud/models/wmsstore.py +0 -0
  84. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoservercloud/models/workspace.py +0 -0
  85. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoservercloud/models/workspaces.py +0 -0
  86. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoservercloud/services/__init__.py +0 -0
  87. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoservercloud/services/owsservice.py +0 -0
  88. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoservercloud/services/restclient.py +0 -0
  89. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoservercloud/services/restlogger.py +0 -0
  90. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoservercloud/services/restservice.py +0 -0
  91. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoservercloud/templates.py +0 -0
  92. {geoservercloud_mcp-0.1.6 → geoservercloud_mcp-0.1.7}/geoservercloud/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: geoservercloud-mcp
3
- Version: 0.1.6
3
+ Version: 0.1.7
4
4
  Summary: MCP (Model Context Protocol) server for GeoServer - enables AI assistants to manage GeoServer workspaces, datastores, layers, and styles through natural language
5
5
  License: BSD-2-Clause
6
6
  License-File: LICENSE
@@ -47,32 +47,30 @@ Once connected, you can ask your AI assistant things like:
47
47
 
48
48
  ---
49
49
 
50
- ## Quick Start
50
+ ## Installation
51
51
 
52
- ### Option 1: Full Local Development Stack
53
-
54
- Start the MCP server with a local GeoServer and PostGIS:
52
+ ### From PyPI
55
53
 
56
54
  ```bash
57
- cd mcp
58
- docker compose up -d
55
+ pip install geoservercloud-mcp
59
56
  ```
60
57
 
61
- This starts:
62
- - **geoservercloud-mcp**: The MCP server on port 8000
63
- - **geoserver**: GeoServer instance on port 8080
64
- - **postgis**: PostGIS database on port 5433
58
+ Or use `uvx` to run without installing (requires [uv](https://docs.astral.sh/uv/)):
65
59
 
66
- ### Option 2: MCP Server Only (Connect to External GeoServer)
60
+ ```bash
61
+ # Install uv first (if not already installed)
62
+ curl -LsSf https://astral.sh/uv/install.sh | sh
67
63
 
68
- If you have an existing GeoServer:
64
+ # Run the MCP server
65
+ uvx geoservercloud-mcp
66
+ ```
69
67
 
70
- ```bash
71
- cd mcp
72
- GEOSERVER_URL=http://your-geoserver:8080/geoserver \
73
- GEOSERVER_USER=admin \
74
- GEOSERVER_PASSWORD=your-password \
75
- docker compose up -d geoservercloud-mcp
68
+ ### From MCP Registry
69
+
70
+ This server is published to the [MCP Registry](https://registry.modelcontextprotocol.io) as:
71
+
72
+ ```text
73
+ io.github.ronitjadhav/geoservercloud-mcp
76
74
  ```
77
75
 
78
76
  ---
@@ -81,21 +79,14 @@ docker compose up -d geoservercloud-mcp
81
79
 
82
80
  ### VS Code / Cursor
83
81
 
84
- 1. Open Command Palette **"MCP: Add Server"**
85
- 2. Select **"Command (stdio)"**
86
- 3. Enter command: `poetry run geoservercloud-mcp`
87
- 4. Enter server ID: `geoserver`
88
-
89
- VS Code will create an MCP configuration file. Update it with the working directory and environment variables:
82
+ Add to your MCP configuration (`.vscode/mcp.json`):
90
83
 
91
84
  ```json
92
85
  {
93
86
  "servers": {
94
87
  "geoserver": {
95
- "type": "stdio",
96
- "command": "poetry",
97
- "args": ["run", "geoservercloud-mcp"],
98
- "cwd": "/path/to/python-geoservercloud",
88
+ "command": "uvx",
89
+ "args": ["geoservercloud-mcp"],
99
90
  "env": {
100
91
  "GEOSERVER_URL": "http://localhost:8080/geoserver",
101
92
  "GEOSERVER_USER": "admin",
@@ -117,9 +108,8 @@ Add to your Claude Desktop config:
117
108
  {
118
109
  "mcpServers": {
119
110
  "geoserver": {
120
- "command": "poetry",
121
- "args": ["run", "geoservercloud-mcp"],
122
- "cwd": "/path/to/python-geoservercloud",
111
+ "command": "uvx",
112
+ "args": ["geoservercloud-mcp"],
123
113
  "env": {
124
114
  "GEOSERVER_URL": "http://localhost:8080/geoserver",
125
115
  "GEOSERVER_USER": "admin",
@@ -132,20 +122,21 @@ Add to your Claude Desktop config:
132
122
 
133
123
  Restart Claude Desktop after saving the configuration.
134
124
 
135
- ---
136
-
137
- ## Testing with FastMCP Inspector
125
+ ### Dynamic Configuration (No Hardcoded Credentials)
138
126
 
139
- The MCP server includes a built-in inspector UI for debugging:
127
+ You can omit the `env` section entirely. The AI will ask you for the GeoServer URL, username, and password at runtime:
140
128
 
141
- ```bash
142
- # From project root
143
- poetry install
144
- poetry run fastmcp dev geoservercloud/mcp/server.py
129
+ ```json
130
+ {
131
+ "mcpServers": {
132
+ "geoserver": {
133
+ "command": "uvx",
134
+ "args": ["geoservercloud-mcp"]
135
+ }
136
+ }
137
+ }
145
138
  ```
146
139
 
147
- Open http://127.0.0.1:6274 in your browser to test individual tools.
148
-
149
140
  ---
150
141
 
151
142
  ## Environment Variables
@@ -158,25 +149,6 @@ Open http://127.0.0.1:6274 in your browser to test individual tools.
158
149
 
159
150
  ---
160
151
 
161
- ## Docker Commands
162
-
163
- ```bash
164
- # Start all services
165
- cd mcp
166
- docker compose up -d
167
-
168
- # Stop services
169
- docker compose down
170
-
171
- # Stop and remove volumes (data)
172
- docker compose down -v
173
-
174
- # View logs
175
- docker compose logs -f geoservercloud-mcp
176
- ```
177
-
178
- ---
179
-
180
152
  ## Python Library
181
153
 
182
154
  This MCP server is built on the **python-geoservercloud** library. For programmatic access without MCP, see the [library documentation](docs/LIBRARY.md).
@@ -194,3 +166,9 @@ geoserver.create_workspace("my_workspace")
194
166
 
195
167
  Full documentation: <https://camptocamp.github.io/python-geoservercloud/>
196
168
 
169
+ ---
170
+
171
+ ## Development
172
+
173
+ For local development, testing, and publishing, see the [Developer Guide](docs/DEVELOPER.md).
174
+
@@ -19,32 +19,30 @@ Once connected, you can ask your AI assistant things like:
19
19
 
20
20
  ---
21
21
 
22
- ## Quick Start
22
+ ## Installation
23
23
 
24
- ### Option 1: Full Local Development Stack
25
-
26
- Start the MCP server with a local GeoServer and PostGIS:
24
+ ### From PyPI
27
25
 
28
26
  ```bash
29
- cd mcp
30
- docker compose up -d
27
+ pip install geoservercloud-mcp
31
28
  ```
32
29
 
33
- This starts:
34
- - **geoservercloud-mcp**: The MCP server on port 8000
35
- - **geoserver**: GeoServer instance on port 8080
36
- - **postgis**: PostGIS database on port 5433
30
+ Or use `uvx` to run without installing (requires [uv](https://docs.astral.sh/uv/)):
37
31
 
38
- ### Option 2: MCP Server Only (Connect to External GeoServer)
32
+ ```bash
33
+ # Install uv first (if not already installed)
34
+ curl -LsSf https://astral.sh/uv/install.sh | sh
39
35
 
40
- If you have an existing GeoServer:
36
+ # Run the MCP server
37
+ uvx geoservercloud-mcp
38
+ ```
41
39
 
42
- ```bash
43
- cd mcp
44
- GEOSERVER_URL=http://your-geoserver:8080/geoserver \
45
- GEOSERVER_USER=admin \
46
- GEOSERVER_PASSWORD=your-password \
47
- docker compose up -d geoservercloud-mcp
40
+ ### From MCP Registry
41
+
42
+ This server is published to the [MCP Registry](https://registry.modelcontextprotocol.io) as:
43
+
44
+ ```text
45
+ io.github.ronitjadhav/geoservercloud-mcp
48
46
  ```
49
47
 
50
48
  ---
@@ -53,21 +51,14 @@ docker compose up -d geoservercloud-mcp
53
51
 
54
52
  ### VS Code / Cursor
55
53
 
56
- 1. Open Command Palette **"MCP: Add Server"**
57
- 2. Select **"Command (stdio)"**
58
- 3. Enter command: `poetry run geoservercloud-mcp`
59
- 4. Enter server ID: `geoserver`
60
-
61
- VS Code will create an MCP configuration file. Update it with the working directory and environment variables:
54
+ Add to your MCP configuration (`.vscode/mcp.json`):
62
55
 
63
56
  ```json
64
57
  {
65
58
  "servers": {
66
59
  "geoserver": {
67
- "type": "stdio",
68
- "command": "poetry",
69
- "args": ["run", "geoservercloud-mcp"],
70
- "cwd": "/path/to/python-geoservercloud",
60
+ "command": "uvx",
61
+ "args": ["geoservercloud-mcp"],
71
62
  "env": {
72
63
  "GEOSERVER_URL": "http://localhost:8080/geoserver",
73
64
  "GEOSERVER_USER": "admin",
@@ -89,9 +80,8 @@ Add to your Claude Desktop config:
89
80
  {
90
81
  "mcpServers": {
91
82
  "geoserver": {
92
- "command": "poetry",
93
- "args": ["run", "geoservercloud-mcp"],
94
- "cwd": "/path/to/python-geoservercloud",
83
+ "command": "uvx",
84
+ "args": ["geoservercloud-mcp"],
95
85
  "env": {
96
86
  "GEOSERVER_URL": "http://localhost:8080/geoserver",
97
87
  "GEOSERVER_USER": "admin",
@@ -104,20 +94,21 @@ Add to your Claude Desktop config:
104
94
 
105
95
  Restart Claude Desktop after saving the configuration.
106
96
 
107
- ---
108
-
109
- ## Testing with FastMCP Inspector
97
+ ### Dynamic Configuration (No Hardcoded Credentials)
110
98
 
111
- The MCP server includes a built-in inspector UI for debugging:
99
+ You can omit the `env` section entirely. The AI will ask you for the GeoServer URL, username, and password at runtime:
112
100
 
113
- ```bash
114
- # From project root
115
- poetry install
116
- poetry run fastmcp dev geoservercloud/mcp/server.py
101
+ ```json
102
+ {
103
+ "mcpServers": {
104
+ "geoserver": {
105
+ "command": "uvx",
106
+ "args": ["geoservercloud-mcp"]
107
+ }
108
+ }
109
+ }
117
110
  ```
118
111
 
119
- Open http://127.0.0.1:6274 in your browser to test individual tools.
120
-
121
112
  ---
122
113
 
123
114
  ## Environment Variables
@@ -130,25 +121,6 @@ Open http://127.0.0.1:6274 in your browser to test individual tools.
130
121
 
131
122
  ---
132
123
 
133
- ## Docker Commands
134
-
135
- ```bash
136
- # Start all services
137
- cd mcp
138
- docker compose up -d
139
-
140
- # Stop services
141
- docker compose down
142
-
143
- # Stop and remove volumes (data)
144
- docker compose down -v
145
-
146
- # View logs
147
- docker compose logs -f geoservercloud-mcp
148
- ```
149
-
150
- ---
151
-
152
124
  ## Python Library
153
125
 
154
126
  This MCP server is built on the **python-geoservercloud** library. For programmatic access without MCP, see the [library documentation](docs/LIBRARY.md).
@@ -165,3 +137,9 @@ geoserver.create_workspace("my_workspace")
165
137
  ```
166
138
 
167
139
  Full documentation: <https://camptocamp.github.io/python-geoservercloud/>
140
+
141
+ ---
142
+
143
+ ## Development
144
+
145
+ For local development, testing, and publishing, see the [Developer Guide](docs/DEVELOPER.md).
@@ -11,7 +11,6 @@ Configuration via environment variables:
11
11
  """
12
12
 
13
13
  import os
14
- from functools import lru_cache
15
14
  from typing import Any
16
15
 
17
16
  from fastmcp import FastMCP
@@ -24,6 +23,11 @@ mcp = FastMCP(
24
23
  instructions="""
25
24
  GeoServer MCP provides tools for managing GeoServer via natural language.
26
25
 
26
+ IMPORTANT: Before using any GeoServer tools, you should:
27
+ 1. First call get_geoserver_connection_info() to check if configured
28
+ 2. If not configured or using wrong server, call configure_geoserver_connection()
29
+ to set the GeoServer URL, username, and password
30
+
27
31
  Available capabilities:
28
32
  - Workspaces: Create, list, get, delete workspaces
29
33
  - Datastores: Manage PostGIS, JNDI, PMTiles, and generic datastores
@@ -35,23 +39,22 @@ mcp = FastMCP(
35
39
  - Users & Roles: Manage GeoServer security
36
40
  - ACL Rules: Configure access control
37
41
  - OGC Services: WMS GetMap, WFS GetFeature, WMTS GetTile
38
-
39
- Before using tools, ensure GeoServer connection is configured via:
40
- - GEOSERVER_URL environment variable
41
- - GEOSERVER_USER environment variable
42
- - GEOSERVER_PASSWORD environment variable
43
42
  """,
44
43
  )
45
44
 
46
45
 
47
- @lru_cache(maxsize=1)
46
+ # Mutable configuration that can be updated at runtime
47
+ _geoserver_config: dict[str, str] = {
48
+ "url": os.getenv("GEOSERVER_URL", "http://localhost:8080/geoserver"),
49
+ "user": os.getenv("GEOSERVER_USER", "admin"),
50
+ "password": os.getenv("GEOSERVER_PASSWORD", "geoserver"),
51
+ "configured": "false" if not os.getenv("GEOSERVER_URL") else "true",
52
+ }
53
+
54
+
48
55
  def get_geoserver_config() -> dict[str, str]:
49
- """Get GeoServer configuration from environment variables."""
50
- return {
51
- "url": os.getenv("GEOSERVER_URL", "http://localhost:8080/geoserver"),
52
- "user": os.getenv("GEOSERVER_USER", "admin"),
53
- "password": os.getenv("GEOSERVER_PASSWORD", "geoserver"),
54
- }
56
+ """Get current GeoServer configuration."""
57
+ return _geoserver_config
55
58
 
56
59
 
57
60
  def get_geoserver() -> GeoServerCloud:
@@ -74,13 +77,45 @@ def get_geoserver_connection_info() -> dict[str, str]:
74
77
  """
75
78
  Get current GeoServer connection information.
76
79
  Shows the configured URL and username (password is hidden).
80
+ Check 'configured' field to see if connection was explicitly set.
81
+ If configured is 'false', ask the user for connection details
82
+ and use configure_geoserver_connection() to set them.
77
83
  """
78
84
  config = get_geoserver_config()
79
85
  return {
80
86
  "url": config["url"],
81
87
  "user": config["user"],
82
88
  "password": "***hidden***",
83
- "status": "configured",
89
+ "configured": config["configured"],
90
+ }
91
+
92
+
93
+ @mcp.tool
94
+ def configure_geoserver_connection(
95
+ url: str,
96
+ user: str = "admin",
97
+ password: str = "geoserver",
98
+ ) -> dict[str, str]:
99
+ """
100
+ Configure the GeoServer connection at runtime.
101
+ Use this to set the GeoServer URL and credentials when they are not
102
+ pre-configured via environment variables.
103
+
104
+ Args:
105
+ url: GeoServer base URL (e.g., http://localhost:8080/geoserver)
106
+ user: GeoServer username (default: admin)
107
+ password: GeoServer password (default: geoserver)
108
+ """
109
+ _geoserver_config["url"] = url
110
+ _geoserver_config["user"] = user
111
+ _geoserver_config["password"] = password
112
+ _geoserver_config["configured"] = "true"
113
+
114
+ return {
115
+ "message": f"GeoServer connection configured: {url}",
116
+ "url": url,
117
+ "user": user,
118
+ "configured": "true",
84
119
  }
85
120
 
86
121
 
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "geoservercloud-mcp"
3
- version = "0.1.6"
3
+ version = "0.1.7"
4
4
  description = "MCP (Model Context Protocol) server for GeoServer - enables AI assistants to manage GeoServer workspaces, datastores, layers, and styles through natural language"
5
5
  authors = ["Ronit Jadhav <ronit.jadhav@camptocamp.com>"]
6
6
  license = "BSD-2-Clause"