@umbraco-cms/mcp-dev 16.0.0-beta.1 → 16.0.0-beta.2

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.
package/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # Umbraco MCP ![GitHub License](https://img.shields.io/github/license/umbraco/Umbraco-CMS-MCP-Dev?style=plastic&link=https%3A%2F%2Fgithub.com%2Fumbraco%2FUmbraco-CMS-MCP-Dev%2Fblob%2Fmain%2FLICENSE)
2
2
 
3
3
  An MCP (Model Context Protocol) server for [Umbraco CMS](https://umbraco.com/)
4
- it provides access to key parts of the Management API enabling you to do back office tasks with your agent.
4
+ it provides developer access to the majority of the Management API enabling you to complete most back office tasks with your agent that you can accomplish using the UI.
5
5
 
6
6
  ## Intro
7
7
 
@@ -29,6 +29,7 @@ Start up your Umbraco instance (currently working with version **15.latest**) an
29
29
 
30
30
  Once you have this information head back into Claude desktop app and head to Settings > Developer > Edit Config. Open the json file in a text editor of your choice and add the below, replacing the `UMBRACO_CLIENT_ID`, `UMBRACO_CLIENT_SECRET` and `UMBRACO_BASE_URL` with your local connection information. The addition of the `NODE_TLS_REJECT_UNAUTHORIZED` env flag is to allow Claude to connect to the MCP using a self-signed cert.
31
31
 
32
+
32
33
  ```
33
34
  {
34
35
  "mcpServers": {
@@ -79,6 +80,34 @@ claude mcp list
79
80
 
80
81
  This will add umbraco-mcp to the existing project in the claude.json config file.
81
82
 
83
+ #### Configuration via .mcp.json (Project-specific)
84
+
85
+ For project-specific Claude Code configuration, create a `.mcp.json` file in your project root that references environment variables for sensitive data:
86
+
87
+ ```json
88
+ {
89
+ "mcpServers": {
90
+ "umbraco-mcp": {
91
+ "command": "npx",
92
+ "args": ["@umbraco-cms/mcp-dev@beta"],
93
+ "env": {
94
+ "NODE_TLS_REJECT_UNAUTHORIZED": "0",
95
+ "UMBRACO_CLIENT_ID": "umbraco-back-office-mcp",
96
+ "UMBRACO_CLIENT_SECRET": "your-client-secret-here",
97
+ "UMBRACO_BASE_URL": "https://localhost:44391",
98
+ "UMBRACO_INCLUDE_TOOL_COLLECTIONS": "culture,document,media",
99
+ "UMBRACO_EXCLUDE_TOOLS": "delete-document,empty-recycle-bin"
100
+ }
101
+ }
102
+ }
103
+ }
104
+ ```
105
+
106
+ Using the `.mcp.json` file allows you to:
107
+ - Configure MCP servers per project
108
+ - Share configuration with team members (commit to version control)
109
+ - Override global Claude Code MCP settings for specific projects
110
+ - Move the environment varaibles to a .env file to prevent leaking of secrets to your code repo
82
111
 
83
112
  </details>
84
113
 
@@ -117,7 +146,7 @@ Follow the MCP [install guide](https://code.visualstudio.com/docs/copilot/custom
117
146
  <details>
118
147
  <summary>Cursor</summary>
119
148
 
120
- #### Or install manually:
149
+ ### Or install manually:
121
150
  Go to `Cursor Settings` -> `Tools & Integrations` -> `Add new MCP Server`.
122
151
 
123
152
  Add the following to the config file and update the env variables.
@@ -142,38 +171,86 @@ Add the following to the config file and update the env variables.
142
171
  </details>
143
172
 
144
173
 
145
- ### Configuration Environment Variables
174
+ #### Authentication Configuration Keys
146
175
 
147
- `UMBRACO_CLIENT_ID`
176
+ - `UMBRACO_CLIENT_ID`
148
177
 
149
178
  Umbraco API User name
150
179
 
151
- `UMBRACO_CLIENT_SECRET`
180
+ - `UMBRACO_CLIENT_SECRET`
152
181
 
153
182
  Umbraco API User client secert
154
183
 
155
- `UMBRACO_BASE_URL`
184
+ - `UMBRACO_BASE_URL`
156
185
 
157
- Url of the site you want to connect to, it only needs to be the scheme and domain e.g https://<nolink/>example.com
186
+ Url of the Umbraco site, it only needs to be the scheme and domain e.g https://<nolink/>example.com
158
187
 
159
- `UMBRACO_EXCLUDE_TOOLS`
188
+ ### Environment Configuration Options
189
+
190
+ The Umbraco MCP server supports environment configuration via:
191
+ 1. **Environment variables in MCP client config as above** (Claude Desktop, VS Code, etc.)
192
+ 2. **Local `.env` file** for development (see `.env.example`)
193
+ 3. **CLI arguments** when running directly
194
+
195
+ **Configuration precedence:** CLI arguments > Environment variables > `.env` file
196
+
197
+ #### Using a `.env` file (Development)
198
+
199
+ For local development, you can create a `.env` file in the project root:
200
+
201
+ ```bash
202
+ # Edit with your values
203
+ UMBRACO_CLIENT_ID=your-api-user-id
204
+ UMBRACO_CLIENT_SECRET=your-api-secret
205
+ UMBRACO_BASE_URL=http://localhost:56472
206
+ ```
207
+
208
+ The `.env` file is gitignored to keep your secrets secure.
209
+
210
+ #### CLI Arguments
211
+
212
+ You can also pass configuration via CLI arguments:
213
+
214
+ ```bash
215
+ npx @umbraco-cms/mcp-dev@beta \
216
+ --umbraco-client-id="your-id" \
217
+ --umbraco-client-secret="your-secret" \
218
+ --umbraco-base-url="http://localhost:56472" \
219
+ --env="/path/to/custom/.env"
220
+ ```
221
+
222
+ ## API Coverage
223
+
224
+ This MCP server provides **comprehensive coverage** of the Umbraco Management API. We have achieved **full parity** with all applicable endpoints, implementing tools for every operational endpoint suitable for AI-assisted content management.
225
+
226
+ ### Implementation Status
227
+
228
+ **✅ Implemented:** 36 tool collections and 337 tools covering operational endpoints including (but not limited to)
229
+ - Content management (Documents, Media, Members)
230
+ - Configuration (Document Types, Media Types, Data Types)
231
+ - System management (Templates, Scripts, Stylesheets)
232
+ - User administration (Users, User Groups, Permissions)
233
+ - Advanced features (Webhooks, Relations, Health Checks)
234
+
235
+ ### Tool Configuration
236
+
237
+ - `UMBRACO_EXCLUDE_TOOLS`
160
238
 
161
239
  The allows you to specify tools by name if you wish to exclude them for the usable tools list. This is helpful as some Agents, cant handle so many tools. This is a commma seperated list of tools which can be found below.
162
240
 
163
- `UMBRACO_INCLUDE_TOOLS`
241
+ - `UMBRACO_INCLUDE_TOOLS`
164
242
 
165
243
  The allows you to specify tools by name if you wish to include only specific tools in the usable tools list. When specified, only these tools will be available. This is a commma seperated list of tools which can be found below.
166
244
 
167
- `UMBRACO_INCLUDE_TOOL_COLLECTIONS`
245
+ - `UMBRACO_INCLUDE_TOOL_COLLECTIONS`
168
246
 
169
247
  The allows you to specify collections by name if you wish to include only specific collections. When specified, only tools from these collections will be available. This is a commma seperated list of collection names (see tool list below for collection names).
170
248
 
171
- `UMBRACO_EXCLUDE_TOOL_COLLECTIONS`
249
+ - `UMBRACO_EXCLUDE_TOOL_COLLECTIONS`
172
250
 
173
251
  The allows you to specify collections by name if you wish to exclude them from the usable tools list. This is a commma seperated list of collection names (see tool list below for collection names).
174
252
 
175
-
176
- ## Umbraco Management API Tools
253
+ ### Tool Collections
177
254
 
178
255
  **Note:** Collection names are shown in brackets for use with `UMBRACO_INCLUDE_TOOL_COLLECTIONS` and `UMBRACO_EXCLUDE_TOOL_COLLECTIONS`.
179
256
 
@@ -311,15 +388,41 @@ The allows you to specify collections by name if you wish to exclude them from t
311
388
  `get-document-type-children` - Get document type children
312
389
  </details>
313
390
 
391
+ <details>
392
+ <summary>Health (health)</summary>
393
+ <br>
394
+
395
+ `get-health-check-groups` - Get all health check groups
396
+ `get-health-check-group-by-name` - Get health check group by name
397
+ `run-health-check-group` - Run health checks for a specific group
398
+ `execute-health-check-action` - Execute a health check action
399
+ </details>
400
+
401
+ <details>
402
+ <summary>Imaging (imaging)</summary>
403
+ <br>
404
+
405
+ `get-imaging-resize-urls` - Generate image resize URLs with various processing options
406
+ </details>
407
+
408
+ <details>
409
+ <summary>Indexer (indexer)</summary>
410
+ <br>
411
+
412
+ `get-indexer` - Get all indexers
413
+ `get-indexer-by-index-name` - Get indexer by index name
414
+ `post-indexer-by-index-name-rebuild` - Rebuild an index by name
415
+ </details>
416
+
314
417
  <details>
315
418
  <summary>Language (language)</summary>
316
419
  <br>
317
420
 
318
- `get-language-items` - Get all languages
319
- `get-default-language` - Get default language
320
- `create-language` - Create a new language
321
- `update-language` - Update a language
322
- `delete-language` - Delete a language
421
+ `get-language-items` - Get all languages
422
+ `get-default-language` - Get default language
423
+ `create-language` - Create a new language
424
+ `update-language` - Update a language
425
+ `delete-language` - Delete a language
323
426
  `get-language-by-iso-code` - Get language by ISO code
324
427
  </details>
325
428
 
@@ -327,17 +430,26 @@ The allows you to specify collections by name if you wish to exclude them from t
327
430
  <summary>Log Viewer (log-viewer)</summary>
328
431
  <br>
329
432
 
330
- `get-log-viewer-saved-search-by-name` - Get saved search by name
331
- `get-log-viewer-level-count` - Get log level counts
332
- `post-log-viewer-saved-search` - Save a log search
333
- `delete-log-viewer-saved-search-by-name` - Delete saved search
334
- `get-log-viewer` - Get logs
335
- `get-log-viewer-level` - Get log levels
336
- `get-log-viewer-search` - Search logs
337
- `get-log-viewer-validate-logs` - Validate logs
433
+ `get-log-viewer-saved-search-by-name` - Get saved search by name
434
+ `get-log-viewer-level-count` - Get log level counts
435
+ `post-log-viewer-saved-search` - Save a log search
436
+ `delete-log-viewer-saved-search-by-name` - Delete saved search
437
+ `get-log-viewer` - Get logs
438
+ `get-log-viewer-level` - Get log levels
439
+ `get-log-viewer-search` - Search logs
440
+ `get-log-viewer-validate-logs` - Validate logs
338
441
  `get-log-viewer-message-template` - Get message template
339
442
  </details>
340
443
 
444
+ <details>
445
+ <summary>Manifest (manifest)</summary>
446
+ <br>
447
+
448
+ `get-manifest-manifest` - Get all system manifests
449
+ `get-manifest-manifest-private` - Get private manifests
450
+ `get-manifest-manifest-public` - Get public manifests
451
+ </details>
452
+
341
453
  <details>
342
454
  <summary>Media (media)</summary>
343
455
  <br>
@@ -417,18 +529,27 @@ The allows you to specify collections by name if you wish to exclude them from t
417
529
  <summary>Member Type (member-type)</summary>
418
530
  <br>
419
531
 
420
- `get-member-type-by-id` - Get member type by ID
421
- `create-member-type` - Create a new member type
422
- `get-member-type-by-id-array` - Get member types by IDs
423
- `delete-member-type` - Delete a member type
424
- `update-member-type` - Update a member type
425
- `copy-member-type` - Copy a member type
426
- `get-member-type-available-compositions` - Get available compositions
427
- `get-member-type-composition-references` - Get composition references
428
- `get-member-type-configuration` - Get member type configuration
532
+ `get-member-type-by-id` - Get member type by ID
533
+ `create-member-type` - Create a new member type
534
+ `get-member-type-by-id-array` - Get member types by IDs
535
+ `delete-member-type` - Delete a member type
536
+ `update-member-type` - Update a member type
537
+ `copy-member-type` - Copy a member type
538
+ `get-member-type-available-compositions` - Get available compositions
539
+ `get-member-type-composition-references` - Get composition references
540
+ `get-member-type-configuration` - Get member type configuration
429
541
  `get-member-type-root` - Get root member types
430
542
  </details>
431
543
 
544
+ <details>
545
+ <summary>Models Builder (models-builder)</summary>
546
+ <br>
547
+
548
+ `get-models-builder-dashboard` - Get Models Builder dashboard information
549
+ `get-models-builder-status` - Get Models Builder status
550
+ `post-models-builder-build` - Trigger Models Builder code generation
551
+ </details>
552
+
432
553
  <details>
433
554
  <summary>Partial View (partial-view)</summary>
434
555
  <br>
@@ -464,59 +585,99 @@ The allows you to specify collections by name if you wish to exclude them from t
464
585
  <summary>Redirect (redirect)</summary>
465
586
  <br>
466
587
 
467
- `get-all-redirects` - Get all redirects
468
- `get-redirect-by-id` - Get redirect by ID
469
- `delete-redirect` - Delete a redirect
470
- `get-redirect-status` - Get redirect status
588
+ `get-all-redirects` - Get all redirects
589
+ `get-redirect-by-id` - Get redirect by ID
590
+ `delete-redirect` - Delete a redirect
591
+ `get-redirect-status` - Get redirect status
471
592
  `update-redirect-status` - Update redirect status
472
593
  </details>
473
594
 
595
+ <details>
596
+ <summary>Relation (relation)</summary>
597
+ <br>
598
+
599
+ `get-relation-by-relation-type-id` - Get relations by relation type ID
600
+ </details>
601
+
602
+ <details>
603
+ <summary>Relation Type (relation-type)</summary>
604
+ <br>
605
+
606
+ `get-relation-type` - Get all relation types
607
+ `get-relation-type-by-id` - Get relation type by ID
608
+ </details>
609
+
474
610
  <details>
475
611
  <summary>Script (script)</summary>
476
612
  <br>
477
613
 
478
- `get-script-by-path` - Get script by path
479
- `get-script-folder-by-path` - Get script folder by path
480
- `get-script-items` - Get script items
481
- `create-script` - Create a new script
482
- `create-script-folder` - Create a script folder
483
- `update-script` - Update a script
484
- `rename-script` - Rename a script
485
- `delete-script` - Delete a script
486
- `delete-script-folder` - Delete a script folder
487
- `get-script-tree-root` - Get root script items
488
- `get-script-tree-children` - Get child script items
614
+ `get-script-by-path` - Get script by path
615
+ `get-script-folder-by-path` - Get script folder by path
616
+ `get-script-items` - Get script items
617
+ `create-script` - Create a new script
618
+ `create-script-folder` - Create a script folder
619
+ `update-script` - Update a script
620
+ `rename-script` - Rename a script
621
+ `delete-script` - Delete a script
622
+ `delete-script-folder` - Delete a script folder
623
+ `get-script-tree-root` - Get root script items
624
+ `get-script-tree-children` - Get child script items
489
625
  `get-script-tree-ancestors` - Get script ancestors
490
626
  </details>
491
627
 
492
628
  <details>
493
- <summary>Stylesheet (stylesheet)</summary>
629
+ <summary>Searcher (searcher)</summary>
494
630
  <br>
495
631
 
496
- `get-stylesheet-by-path` - Get stylesheet by path
497
- `get-stylesheet-folder-by-path` - Get stylesheet folder by path
498
- `create-stylesheet` - Create a new stylesheet
499
- `create-stylesheet-folder` - Create a stylesheet folder
500
- `update-stylesheet` - Update a stylesheet
501
- `rename-stylesheet` - Rename a stylesheet
502
- `delete-stylesheet` - Delete a stylesheet
503
- `delete-stylesheet-folder` - Delete a stylesheet folder
504
- `get-stylesheet-root` - Get root stylesheets
505
- `get-stylesheet-children` - Get child stylesheets
506
- `get-stylesheet-ancestors` - Get stylesheet ancestors
507
- `get-stylesheet-search` - Search stylesheets
632
+ `get-searcher` - Get all searchers
633
+ `get-searcher-by-searcher-name-query` - Query a specific searcher by name
508
634
  </details>
509
635
 
510
636
  <details>
511
637
  <summary>Server (server)</summary>
512
638
  <br>
513
639
 
514
- `get-server-status` - Get server status
515
- `get-server-log-file` - Get server log file
516
- `tour-status` - Get tour status
640
+ `get-server-status` - Get server status
641
+ `get-server-log-file` - Get server log file
642
+ `tour-status` - Get tour status
517
643
  `upgrade-status` - Get upgrade status
518
644
  </details>
519
645
 
646
+ <details>
647
+ <summary>Static File (static-file)</summary>
648
+ <br>
649
+
650
+ `get-static-files` - Get static files with filtering
651
+ `get-static-file-root` - Get root static files
652
+ `get-static-file-children` - Get child static files
653
+ `get-static-file-ancestors` - Get static file ancestors
654
+ </details>
655
+
656
+ <details>
657
+ <summary>Stylesheet (stylesheet)</summary>
658
+ <br>
659
+
660
+ `get-stylesheet-by-path` - Get stylesheet by path
661
+ `get-stylesheet-folder-by-path` - Get stylesheet folder by path
662
+ `create-stylesheet` - Create a new stylesheet
663
+ `create-stylesheet-folder` - Create a stylesheet folder
664
+ `update-stylesheet` - Update a stylesheet
665
+ `rename-stylesheet` - Rename a stylesheet
666
+ `delete-stylesheet` - Delete a stylesheet
667
+ `delete-stylesheet-folder` - Delete a stylesheet folder
668
+ `get-stylesheet-root` - Get root stylesheets
669
+ `get-stylesheet-children` - Get child stylesheets
670
+ `get-stylesheet-ancestors` - Get stylesheet ancestors
671
+ `get-stylesheet-search` - Search stylesheets
672
+ </details>
673
+
674
+ <details>
675
+ <summary>Tag (tag)</summary>
676
+ <br>
677
+
678
+ `get-tags` - Get all tags
679
+ </details>
680
+
520
681
  <details>
521
682
  <summary>Template (template)</summary>
522
683
  <br>
@@ -538,23 +699,54 @@ The allows you to specify collections by name if you wish to exclude them from t
538
699
  <summary>Temporary File (temporary-file)</summary>
539
700
  <br>
540
701
 
541
- `create-temporary-file` - Create a temporary file
542
- `get-temporary-file` - Get a temporary file
543
- `delete-temporary-file` - Delete a temporary file
702
+ `create-temporary-file` - Create a temporary file
703
+ `get-temporary-file` - Get a temporary file
704
+ `delete-temporary-file` - Delete a temporary file
544
705
  `get-temporary-file-configuration` - Get temporary file configuration
545
706
  </details>
546
707
 
708
+ <details>
709
+ <summary>User (user)</summary>
710
+ <br>
711
+
712
+ `get-user` - Get users with pagination
713
+ `get-user-by-id` - Get user by ID
714
+ `find-user` - Find users by search criteria
715
+ `get-item-user` - Get user item information
716
+ `get-user-current` - Get current authenticated user
717
+ `get-user-configuration` - Get user configuration
718
+ `get-user-current-configuration` - Get current user configuration
719
+ `get-user-current-login-providers` - Get current user login providers
720
+ `get-user-current-permissions` - Get current user permissions
721
+ `get-user-current-permissions-document` - Get current user document permissions
722
+ `get-user-current-permissions-media` - Get current user media permissions
723
+ `get-user-by-id-calculate-start-nodes` - Calculate start nodes for a user
724
+ `upload-user-avatar-by-id` - Upload avatar for a user
725
+ `upload-user-current-avatar` - Upload avatar for current user
726
+ `delete-user-avatar-by-id` - Delete user avatar
727
+ </details>
728
+
729
+ <details>
730
+ <summary>User Data (user-data)</summary>
731
+ <br>
732
+
733
+ `create-user-data` - Create user data key-value pair
734
+ `update-user-data` - Update user data value
735
+ `get-user-data` - Get all user data for current user
736
+ `get-user-data-by-id` - Get user data by key
737
+ </details>
738
+
547
739
  <details>
548
740
  <summary>User Group (user-group)</summary>
549
741
  <br>
550
742
 
551
- `get-user-group` - Get user group
552
- `get-user-group-by-id-array` - Get user groups by IDs
553
- `get-user-groups` - Get all user groups
554
- `get-filter-user-group` - Filter user groups
555
- `create-user-group` - Create a new user group
556
- `update-user-group` - Update a user group
557
- `delete-user-group` - Delete a user group
743
+ `get-user-group` - Get user group
744
+ `get-user-group-by-id-array` - Get user groups by IDs
745
+ `get-user-groups` - Get all user groups
746
+ `get-filter-user-group` - Filter user groups
747
+ `create-user-group` - Create a new user group
748
+ `update-user-group` - Update a user group
749
+ `delete-user-group` - Delete a user group
558
750
  `delete-user-groups` - Delete multiple user groups
559
751
  </details>
560
752
 
@@ -572,6 +764,23 @@ The allows you to specify collections by name if you wish to exclude them from t
572
764
  </details>
573
765
  </details>
574
766
 
767
+ **⚠️ Intentionally Excluded:** 69 endpoints across 14 categories
768
+
769
+ Certain endpoints are intentionally not implemented due to security, complexity, or contextual concerns. For a detailed breakdown of excluded endpoints and the rationale behind each exclusion, see [Ignored Endpoints Documentation](./docs/analysis/IGNORED_ENDPOINTS.md).
770
+
771
+ ### Excluded Categories Summary
772
+
773
+ - **User Management (22 endpoints)** - User creation/deletion, password operations, 2FA management, and client credentials pose significant security risks
774
+ - **User Group Membership (3 endpoints)** - Permission escalation risks from AI-driven group membership changes
775
+ - **Security Operations (4 endpoints)** - Password reset workflows require email verification and user interaction
776
+ - **Import/Export (9 endpoints)** - Complex file operations better handled through the Umbraco UI
777
+ - **Package Management (9 endpoints)** - Package creation and migration involve system-wide changes
778
+ - **Cache Operations (3 endpoints)** - Cache rebuild can impact system performance
779
+ - **Telemetry (3 endpoints)** - System telemetry configuration and data collection
780
+ - **Install/Upgrade (5 endpoints)** - One-time system setup and upgrade operations
781
+ - **Preview/Profiling (4 endpoints)** - Frontend-specific debugging functionality
782
+ - **Other (7 endpoints)** - Internal system functionality, oEmbed, dynamic roots, object types
783
+
575
784
  ## Contributing with AI Tools
576
785
 
577
786
  This project is optimized for development with AI coding assistants. We provide instruction files for popular AI tools to help maintain consistency with our established patterns and testing standards.