iron-cms 0.18.2 → 0.19.1

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 (56) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +15 -0
  3. data/app/assets/builds/iron.css +255 -218
  4. data/app/controllers/concerns/iron/api/token_authentication.rb +2 -7
  5. data/app/controllers/concerns/iron/bounded_request_body.rb +48 -0
  6. data/app/controllers/iron/api/base_controller.rb +3 -0
  7. data/app/controllers/iron/api/mcp_controller.rb +119 -0
  8. data/app/controllers/iron/api/openapi_controller.rb +1 -8
  9. data/app/controllers/iron/oauth/authorizations_controller.rb +120 -0
  10. data/app/controllers/iron/oauth/metadata_controller.rb +38 -0
  11. data/app/controllers/iron/oauth/registrations_controller.rb +54 -0
  12. data/app/controllers/iron/oauth/tokens_controller.rb +92 -0
  13. data/app/mcp/iron/mcp/error.rb +5 -0
  14. data/app/mcp/iron/mcp/forbidden.rb +9 -0
  15. data/app/mcp/iron/mcp/invalid_request.rb +5 -0
  16. data/app/mcp/iron/mcp/paginator.rb +19 -0
  17. data/app/mcp/iron/mcp/server.rb +38 -0
  18. data/app/mcp/iron/mcp/tool_context.rb +114 -0
  19. data/app/mcp/iron/mcp/tools/base.rb +61 -0
  20. data/app/mcp/iron/mcp/tools/create_entry.rb +28 -0
  21. data/app/mcp/iron/mcp/tools/delete_entry.rb +25 -0
  22. data/app/mcp/iron/mcp/tools/describe_schema.rb +20 -0
  23. data/app/mcp/iron/mcp/tools/get_entry.rb +25 -0
  24. data/app/mcp/iron/mcp/tools/list_content_types.rb +20 -0
  25. data/app/mcp/iron/mcp/tools/list_entries.rb +27 -0
  26. data/app/mcp/iron/mcp/tools/search.rb +25 -0
  27. data/app/mcp/iron/mcp/tools/update_entry.rb +28 -0
  28. data/app/mcp/iron/mcp/tools/upload_asset.rb +27 -0
  29. data/app/models/iron/api/openapi_spec.rb +7 -0
  30. data/app/models/iron/content/download_budget.rb +31 -0
  31. data/app/models/iron/content.rb +201 -32
  32. data/app/models/iron/field_definition.rb +7 -1
  33. data/app/models/iron/field_definitions/block.rb +3 -1
  34. data/app/models/iron/field_definitions/block_list.rb +3 -1
  35. data/app/models/iron/integration.rb +11 -0
  36. data/app/models/iron/oauth/client.rb +63 -0
  37. data/app/models/iron/oauth/grant.rb +67 -0
  38. data/app/models/iron/oauth/resource.rb +27 -0
  39. data/app/models/iron/oauth/scope.rb +13 -0
  40. data/app/models/iron/oauth/secret.rb +13 -0
  41. data/app/models/iron/oauth/token.rb +123 -0
  42. data/app/models/iron/ssrf_protection.rb +82 -0
  43. data/app/views/iron/authentication/_brandmark.html.erb +5 -0
  44. data/app/views/iron/oauth/authorizations/new.html.erb +34 -0
  45. data/app/views/iron/sessions/new.html.erb +1 -5
  46. data/app/views/layouts/iron/application.html.erb +3 -0
  47. data/app/views/layouts/iron/authentication.html.erb +3 -0
  48. data/config/locales/en.yml +12 -0
  49. data/config/locales/it.yml +12 -0
  50. data/config/routes.rb +1 -0
  51. data/db/migrate/20260626090000_create_iron_oauth_tables.rb +50 -0
  52. data/lib/generators/iron/install/install_generator.rb +19 -0
  53. data/lib/iron/engine.rb +6 -0
  54. data/lib/iron/oauth_body_limit.rb +52 -0
  55. data/lib/iron/version.rb +1 -1
  56. metadata +50 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cb216550d5a222f95bb7b5a6724b389cc77c990a66cded4a073a92107d8d2bdf
4
- data.tar.gz: 27ee8ed51b30c003a73646c1feaebf9ca92f4b656f0220a7d8aa185d8a44b0b0
3
+ metadata.gz: 5de6ec71e07c37128ed9bfe339e6149dad20855ca9a1eb908d5e5cf32f2db49a
4
+ data.tar.gz: a06ab1b9aec0abcfaadeb44a906adb357330c9ae179a6752a6dc4b900ba625d9
5
5
  SHA512:
6
- metadata.gz: 3f672a856705b09285a7e2c00dc135dbc233f3004b7b9c6be348c3561ee5d6d98f8e9438dfff21361a246f4a482b6fa848cad63a249028b90979ef594b43dce1
7
- data.tar.gz: 0fa8ba5c0283b25ede2d94130214ff8590740fb74b935a63e5b14a3d16f49f1cb69084f42a855aa40fd65e8753150b77cfcd1265f7a122fcec5c7c5660289c57
6
+ metadata.gz: 39fbb2624fe577fc09e7ae0fa5b74856d0a96ecc6f6645ac9cd4084fb4bb6530c4954c6e36e384dc26ea30262ebba7baec1d2ba37b9b29d8d12520d267afba31
7
+ data.tar.gz: f26edb98c1fffa3aeec9b3d0cb3fd08b641d3547b78f3ed8f9f9c29d81669fcdd6c635483ff7834615502ac7ef0bf619b0f515b6a9e4f9b4eab2e3d743fbb967
data/README.md CHANGED
@@ -161,6 +161,21 @@ bin/rails iron:content:delete HANDLE=post ID=12
161
161
 
162
162
  Payloads are JSON objects of field handles to values — inline via `PAYLOAD=`, from a file via `FILE=`, or piped on stdin. Results print as JSON on stdout; validation errors as JSON on stderr. See the generated skill for payload semantics per field type, file ingestion, and the end-to-end loop.
163
163
 
164
+ #### Editing content remotely (MCP)
165
+
166
+ The rake tasks above need a shell. For agents that don't have one — Claude on the web or desktop editing a live site — Iron mounts a [Model Context Protocol](https://modelcontextprotocol.io) server at `<mount>/api/mcp` (e.g. `/admin/api/mcp`). It exposes a small, fixed set of **content-only** tools (`list_content_types`, `describe_schema`, `list_entries`, `get_entry`, `create_entry`, `update_entry`, `delete_entry`, `upload_asset`, `search`); the agent learns each type's fields from `describe_schema` rather than from per-type tools. Schema is never editable over the wire — it stays file-managed. Writes require a token whose role can write (`member` or `administrator`); `reader` tokens are read-only.
167
+
168
+ The endpoint accepts two kinds of credential:
169
+
170
+ - **claude.ai (web) and Claude Desktop** authenticate with OAuth. `iron:install` wires an OAuth 2.1 authorization server into the host app (discovery documents, dynamic client registration, and the `/oauth/*` endpoints), with consent reused from the Iron admin sign-in. Add the connector by URL — `https://yoursite.com/admin/api/mcp` — then sign in and approve.
171
+ - **Claude Code and scripts** can skip the browser flow with an Integration token:
172
+
173
+ ```bash
174
+ bin/rails iron:integration:create NAME=claude-code ROLE=member # prints a bearer token
175
+ claude mcp add --transport http iron https://yoursite.com/admin/api/mcp \
176
+ --header "Authorization: Bearer <token>"
177
+ ```
178
+
164
179
  ## System Requirements
165
180
 
166
181
  Iron requires `libvips` to be installed on your system for image processing and responsive image generation.