Skip to content
Toggle navigation
Toggle navigation
This project
Loading...
Sign in
Ean Schuessler
/
mo-mcp
Go to a project
Toggle navigation
Toggle navigation pinning
Projects
Groups
Snippets
Help
Project
Activity
Repository
Graphs
Issues
0
Merge Requests
0
Wiki
Network
Create a new issue
Commits
Issue Boards
Files
Commits
Network
Compare
Branches
Tags
f4695781
authored
2025-11-20 22:32:22 -0600
by
Ean Schuessler
Browse Files
Options
Browse Files
Tag
Download
Email Patches
Plain Diff
start adding screen resource support
1 parent
1d9ca524
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
33 additions
and
0 deletions
data/McpSecuritySeedData.xml
service/McpServices.xml
src/main/groovy/org/moqui/mcp/EnhancedMcpServlet.groovy
data/McpSecuritySeedData.xml
View file @
f469578
...
...
@@ -23,6 +23,8 @@
<moqui.security.ArtifactGroup
artifactGroupId=
"McpScreenTransitions"
description=
"MCP Screen Transitions"
/>
<moqui.security.ArtifactGroup
artifactGroupId=
"McpBusinessServices"
description=
"MCP Essential Business Services"
/>
<moqui.security.ArtifactGroup
artifactGroupId=
"McpSecurityEntities"
description=
"Security entities needed for permission checks"
/>
<moqui.security.ArtifactGroup
artifactGroupId=
"McpScreens"
description=
"MCP Screen Access"
/>
<moqui.security.ArtifactGroup
artifactGroupId=
"McpScreenTools"
description=
"MCP Screen-based Tools"
/>
<!-- MCP Artifact Group Members -->
<moqui.security.ArtifactGroupMember
artifactGroupId=
"McpServices"
artifactName=
"McpServices.*"
artifactTypeEnumId=
"AT_SERVICE"
/>
...
...
@@ -34,6 +36,24 @@
<moqui.security.ArtifactGroupMember
artifactGroupId=
"McpServices"
artifactName=
"McpServices.mcp#ResourcesList"
artifactTypeEnumId=
"AT_SERVICE"
/>
<moqui.security.ArtifactGroupMember
artifactGroupId=
"McpServices"
artifactName=
"McpServices.mcp#ResourcesRead"
artifactTypeEnumId=
"AT_SERVICE"
/>
<!-- Screen Discovery and Execution Services -->
<moqui.security.ArtifactGroupMember
artifactGroupId=
"McpServices"
artifactName=
"McpServices.discover#ScreensAsMcpTools"
artifactTypeEnumId=
"AT_SERVICE"
/>
<moqui.security.ArtifactGroupMember
artifactGroupId=
"McpServices"
artifactName=
"McpServices.convert#ScreenToMcpTool"
artifactTypeEnumId=
"AT_SERVICE"
/>
<moqui.security.ArtifactGroupMember
artifactGroupId=
"McpServices"
artifactName=
"McpServices.execute#ScreenAsMcpTool"
artifactTypeEnumId=
"AT_SERVICE"
/>
<!-- Common Screen Access Patterns -->
<moqui.security.ArtifactGroupMember
artifactGroupId=
"McpScreens"
artifactName=
"apps/order/*"
artifactTypeEnumId=
"AT_XML_SCREEN"
/>
<moqui.security.ArtifactGroupMember
artifactGroupId=
"McpScreens"
artifactName=
"apps/party/*"
artifactTypeEnumId=
"AT_XML_SCREEN"
/>
<moqui.security.ArtifactGroupMember
artifactGroupId=
"McpScreens"
artifactName=
"apps/invoice/*"
artifactTypeEnumId=
"AT_XML_SCREEN"
/>
<moqui.security.ArtifactGroupMember
artifactGroupId=
"McpScreens"
artifactName=
"apps/product/*"
artifactTypeEnumId=
"AT_XML_SCREEN"
/>
<moqui.security.ArtifactGroupMember
artifactGroupId=
"McpScreens"
artifactName=
"apps/ledger/*"
artifactTypeEnumId=
"AT_XML_SCREEN"
/>
<moqui.security.ArtifactGroupMember
artifactGroupId=
"McpScreens"
artifactName=
"apps/marketing/*"
artifactTypeEnumId=
"AT_XML_SCREEN"
/>
<moqui.security.ArtifactGroupMember
artifactGroupId=
"McpScreens"
artifactName=
"apps/sales/*"
artifactTypeEnumId=
"AT_XML_SCREEN"
/>
<moqui.security.ArtifactGroupMember
artifactGroupId=
"McpScreens"
artifactName=
"apps/manufacturing/*"
artifactTypeEnumId=
"AT_XML_SCREEN"
/>
<moqui.security.ArtifactGroupMember
artifactGroupId=
"McpScreens"
artifactName=
"apps/warehouse/*"
artifactTypeEnumId=
"AT_XML_SCREEN"
/>
<moqui.security.ArtifactGroupMember
artifactGroupId=
"McpScreens"
artifactName=
"apps/humanresource/*"
artifactTypeEnumId=
"AT_XML_SCREEN"
/>
<moqui.security.ArtifactGroupMember
artifactGroupId=
"McpScreens"
artifactName=
"apps/project/*"
artifactTypeEnumId=
"AT_XML_SCREEN"
/>
<!-- Essential Business Services -->
<moqui.security.ArtifactGroupMember
artifactGroupId=
"McpBusinessServices"
artifactName=
"mantle.order.OrderServices.create#Order"
artifactTypeEnumId=
"AT_SERVICE"
/>
<moqui.security.ArtifactGroupMember
artifactGroupId=
"McpBusinessServices"
artifactName=
"mantle.party.PartyServices.find#Party"
artifactTypeEnumId=
"AT_SERVICE"
/>
...
...
@@ -80,17 +100,23 @@
<moqui.security.ArtifactAuthz
userGroupId=
"McpUser"
artifactGroupId=
"McpServices"
authzTypeEnumId=
"AUTHZT_ALLOW"
authzActionEnumId=
"AUTHZA_ALL"
/>
<moqui.security.ArtifactAuthz
userGroupId=
"McpUser"
artifactGroupId=
"McpRestPaths"
authzTypeEnumId=
"AUTHZT_ALLOW"
authzActionEnumId=
"AUTHZA_ALL"
/>
<moqui.security.ArtifactAuthz
userGroupId=
"McpUser"
artifactGroupId=
"McpScreenTransitions"
authzTypeEnumId=
"AUTHZT_ALLOW"
authzActionEnumId=
"AUTHZA_ALL"
/>
<moqui.security.ArtifactAuthz
userGroupId=
"McpUser"
artifactGroupId=
"McpScreens"
authzTypeEnumId=
"AUTHZT_ALLOW"
authzActionEnumId=
"AUTHZA_VIEW"
/>
<moqui.security.ArtifactAuthz
userGroupId=
"McpUser"
artifactGroupId=
"McpScreenTools"
authzTypeEnumId=
"AUTHZT_ALLOW"
authzActionEnumId=
"AUTHZA_ALL"
/>
<!-- Give ALL users access to security entities needed for permission checks -->
<moqui.security.ArtifactAuthz
userGroupId=
"ALL_USERS"
artifactGroupId=
"McpSecurityEntities"
authzTypeEnumId=
"AUTHZT_ALLOW"
authzActionEnumId=
"AUTHZA_ALL"
/>
<!-- Ensure ADMIN user always has access to security entities needed for permission checks -->
<moqui.security.ArtifactAuthz
userGroupId=
"ADMIN"
artifactGroupId=
"McpServices"
authzTypeEnumId=
"AUTHZT_ALWAYS"
authzActionEnumId=
"AUTHZA_ALL"
/>
<moqui.security.ArtifactAuthz
userGroupId=
"ADMIN"
artifactGroupId=
"McpScreens"
authzTypeEnumId=
"AUTHZT_ALWAYS"
authzActionEnumId=
"AUTHZA_ALL"
/>
<moqui.security.ArtifactAuthz
userGroupId=
"ADMIN"
artifactGroupId=
"McpScreenTools"
authzTypeEnumId=
"AUTHZT_ALWAYS"
authzActionEnumId=
"AUTHZA_ALL"
/>
<!-- MCP Business Group Authz -->
<moqui.security.ArtifactAuthz
userGroupId=
"MCP_BUSINESS"
artifactGroupId=
"McpServices"
authzTypeEnumId=
"AUTHZT_ALLOW"
authzActionEnumId=
"AUTHZA_ALL"
/>
<moqui.security.ArtifactAuthz
userGroupId=
"MCP_BUSINESS"
artifactGroupId=
"McpBusinessServices"
authzTypeEnumId=
"AUTHZT_ALLOW"
authzActionEnumId=
"AUTHZA_ALL"
/>
<moqui.security.ArtifactAuthz
userGroupId=
"MCP_BUSINESS"
artifactGroupId=
"McpRestPaths"
authzTypeEnumId=
"AUTHZT_ALLOW"
authzActionEnumId=
"AUTHZA_ALL"
/>
<moqui.security.ArtifactAuthz
userGroupId=
"MCP_BUSINESS"
artifactGroupId=
"McpScreens"
authzTypeEnumId=
"AUTHZT_ALLOW"
authzActionEnumId=
"AUTHZA_ALL"
/>
<moqui.security.ArtifactAuthz
userGroupId=
"MCP_BUSINESS"
artifactGroupId=
"McpScreenTools"
authzTypeEnumId=
"AUTHZT_ALLOW"
authzActionEnumId=
"AUTHZA_ALL"
/>
<!-- MCP User Accounts -->
...
...
@@ -99,6 +125,7 @@
<!-- Add MCP users to MCP user groups -->
<moqui.security.UserGroupMember
userGroupId=
"McpUser"
userId=
"MCP_USER"
fromDate=
"2025-01-01 00:00:00.000"
/>
<moqui.security.UserGroupMember
userGroupId=
"McpUser"
userId=
"JohnSales"
fromDate=
"2025-01-01 00:00:00.000"
/>
<moqui.security.UserGroupMember
userGroupId=
"MCP_BUSINESS"
userId=
"MCP_BUSINESS"
fromDate=
"2025-01-01 00:00:00.000"
/>
<!-- ADMIN user doesn't need to be in MCP groups - should have full access by default -->
...
...
service/McpServices.xml
View file @
f469578
This diff is collapsed.
Click to expand it.
src/main/groovy/org/moqui/mcp/EnhancedMcpServlet.groovy
View file @
f469578
...
...
@@ -208,6 +208,7 @@ try {
// Look up the actual Visit EntityValue
visit
=
ec
.
entity
.
find
(
"moqui.server.Visit"
)
.
condition
(
"visitId"
,
visitResult
.
visitId
)
.
disableAuthz
()
.
one
()
if
(!
visit
)
{
throw
new
Exception
(
"Failed to look up newly created Visit"
)
...
...
@@ -339,6 +340,7 @@ logger.info("Handling Enhanced SSE connection from ${request.remoteAddr}")
// Look up the actual Visit EntityValue
visit
=
ec
.
entity
.
find
(
"moqui.server.Visit"
)
.
condition
(
"visitId"
,
visitResult
.
visitId
)
.
disableAuthz
()
.
one
()
if
(!
visit
)
{
throw
new
Exception
(
"Failed to look up newly created Visit"
)
...
...
@@ -468,6 +470,7 @@ logger.info("Handling Enhanced SSE connection from ${request.remoteAddr}")
// Get Visit directly - this is our session
def
visit
=
ec
.
entity
.
find
(
"moqui.server.Visit"
)
.
condition
(
"visitId"
,
sessionId
)
.
disableAuthz
()
.
one
()
if
(!
visit
)
{
...
...
@@ -724,6 +727,7 @@ logger.info("Handling Enhanced SSE connection from ${request.remoteAddr}")
try
{
def
existingVisit
=
ec
.
entity
.
find
(
"moqui.server.Visit"
)
.
condition
(
"visitId"
,
sessionId
)
.
disableAuthz
()
.
one
()
if
(!
existingVisit
)
{
...
...
@@ -925,6 +929,7 @@ logger.info("Handling Enhanced SSE connection from ${request.remoteAddr}")
// Look up all MCP Visits (persistent)
def
mcpVisits
=
ec
.
entity
.
find
(
"moqui.server.Visit"
)
.
condition
(
"initialRequest"
,
"like"
,
"%mcpSession%"
)
.
disableAuthz
()
.
list
()
logger
.
info
(
"Broadcasting to ${mcpVisits.size()} MCP visits, ${activeConnections.size()} active connections"
)
...
...
@@ -985,6 +990,7 @@ logger.info("Handling Enhanced SSE connection from ${request.remoteAddr}")
// Look up all MCP Visits (persistent)
def
mcpVisits
=
ec
.
entity
.
find
(
"moqui.server.Visit"
)
.
condition
(
"initialRequest"
,
"like"
,
"%mcpSession%"
)
.
disableAuthz
()
.
list
()
return
[
...
...
Please
register
or
sign in
to post a comment