Skip to content

feat(x2a): MCP server tools#2565

Open
eloycoto wants to merge 2 commits intoredhat-developer:mainfrom
eloycoto:wt-auth-plugins
Open

feat(x2a): MCP server tools#2565
eloycoto wants to merge 2 commits intoredhat-developer:mainfrom
eloycoto:wt-auth-plugins

Conversation

@eloycoto
Copy link
Contributor

This enables a way to check the current status of the project using MCP tools, and can be used inside any project that needs to have AI tooling on top of it.

Because this uses OAuth2, I need to implement a quick page, because plugin-auth is not that easy to run within the current auth implementation.

To test, I use MCP Inspector, like this:

DANGEROUSLY_OMIT_AUTH=true npx @modelcontextprotocol/inspector

The auth env var is important, because without it, it messes up the OAuth2 token that we set[0].

I can see room for improvements where:

  • The auth could maybe be moved to https://www.npmjs.com/package/@backstage/plugin-auth
  • The router is highly coupled; maybe we need to have an HTTP router and services that can be consumed by MCP and by the router.
  • The MCP actions could be expanded (follow-up PR):
    • Run module
    • Get project - Get module

So the idea is just to get the basic terms of the MCP server in place, and finish all the implementation correctly by the end of the quarter.

[0] modelcontextprotocol/inspector#633

Hey, I just made a Pull Request!

✔️ Checklist

  • A changeset describing the change and affected packages. (more info)
  • Added or Updated documentation
  • Tests for new functionality and regression tests for bug fixes
  • Screenshots attached (for UI changes)

@rhdh-qodo-merge
Copy link

Review Summary by Qodo

Add MCP server tools and OAuth2 consent flow

✨ Enhancement

Grey Divider

Walkthroughs

Description
• Implement MCP server tools for project status checking
• Add OAuth2 consent page for authorization flow
• Register x2a:project:list MCP action for listing projects
• Extract listProjects logic for reuse across HTTP and MCP
• Configure MCP actions plugin and dynamic client registration
Diagram
flowchart LR
  MCP["MCP Inspector"]
  Backend["x2a Backend Plugin"]
  Actions["MCP Actions Registry"]
  ProjectList["x2a:project:list Action"]
  ListProjects["listProjects Function"]
  OAuth2["OAuth2 Consent Page"]
  
  MCP -->|"calls"| Actions
  Actions -->|"registers"| ProjectList
  ProjectList -->|"executes"| ListProjects
  ListProjects -->|"checks permissions"| Backend
  Backend -->|"requires auth"| OAuth2
Loading

Grey Divider

File Changes

1. workspaces/x2a/plugins/x2a-backend/src/mcp/projects.ts ✨ Enhancement +89/-0

Register MCP action for listing projects

workspaces/x2a/plugins/x2a-backend/src/mcp/projects.ts


2. workspaces/x2a/plugins/x2a-backend/src/router/listProjects.ts Refactoring +68/-0

Extract project listing logic for reuse

workspaces/x2a/plugins/x2a-backend/src/router/listProjects.ts


3. workspaces/x2a/plugins/x2a-backend/src/plugin.ts ✨ Enhancement +11/-0

Integrate MCP actions registry into plugin

workspaces/x2a/plugins/x2a-backend/src/plugin.ts


View more (7)
4. workspaces/x2a/plugins/x2a-backend/src/router/projects.ts Refactoring +6/-24

Refactor to use extracted listProjects function

workspaces/x2a/plugins/x2a-backend/src/router/projects.ts


5. workspaces/x2a/packages/backend/src/index.ts Dependencies +3/-0

Add MCP actions backend plugin dependency

workspaces/x2a/packages/backend/src/index.ts


6. workspaces/x2a/packages/app/src/components/oauth2/ConsentPage.tsx ✨ Enhancement +249/-0

Implement OAuth2 consent authorization page

workspaces/x2a/packages/app/src/components/oauth2/ConsentPage.tsx


7. workspaces/x2a/packages/app/src/App.tsx ✨ Enhancement +2/-0

Add OAuth2 consent page route

workspaces/x2a/packages/app/src/App.tsx


8. workspaces/x2a/app-config.yaml ⚙️ Configuration changes +13/-4

Configure MCP actions and OAuth2 settings

workspaces/x2a/app-config.yaml


9. workspaces/x2a/packages/backend/package.json Dependencies +1/-0

Add MCP actions backend plugin dependency

workspaces/x2a/packages/backend/package.json


10. workspaces/x2a/examples/org.yaml Miscellaneous +10/-0

Add example user for testing

workspaces/x2a/examples/org.yaml


Grey Divider

Qodo Logo

@rhdh-qodo-merge
Copy link

rhdh-qodo-merge bot commented Mar 17, 2026

Code Review by Qodo

🐞 Bugs (3) 📘 Rule violations (0) 📎 Requirement gaps (0)

Grey Divider


Action required

1. Placeholder AAP token active 🐞 Bug ✓ Correctness
Description
workspaces/x2a/app-config.yaml now sets x2a.credentials.aap.oauthToken to a non-empty fallback
("your-oauth-token"), which will be treated as configured credentials. Because the backend treats
any non-empty oauthToken as valid and the scaffolder flow skips user-supplied AAP credentials,
migrations will attempt to authenticate to AAP with an invalid token and users cannot override it at
runtime.
Code

workspaces/x2a/app-config.yaml[R193-199]

      url: ${AAP_URL:-https://aap.example.com}
      orgName: ${AAP_ORG_NAME:-MyOrganization}
      # Option 1: OAuth token
-      # oauthToken: ${AAP_OAUTH_TOKEN:-your-oauth-token}
+      oauthToken: ${AAP_OAUTH_TOKEN:-your-oauth-token}
      # Option 2: Username and password
-      username: ${AAP_USERNAME}
-      password: ${AAP_PASSWORD}
+      # username: ${AAP_USERNAME}
+      # password: ${AAP_PASSWORD}
Evidence
The repo’s config schema explicitly states AAP credentials are optional and should be supplied by
users at runtime if not configured, but the PR config change forces a non-empty oauthToken even when
AAP_OAUTH_TOKEN is unset. The backend then selects config.credentials.aap as the credential source
when url/orgName are present and validates based on oauthToken presence (non-empty string passes),
and the scaffolder integration intentionally omits aapCredentials, relying on app-config—making the
placeholder token effectively mandatory and wrong.

workspaces/x2a/app-config.yaml[189-199]
workspaces/x2a/plugins/x2a-backend/config.d.ts[206-210]
workspaces/x2a/plugins/x2a-backend/src/services/JobResourceBuilder.ts[50-58]
workspaces/x2a/plugins/x2a-backend/src/services/JobResourceBuilder.ts[66-75]
workspaces/x2a/plugins/scaffolder-backend-module-x2a/src/actions/createProject.ts[189-198]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
`x2a.credentials.aap.oauthToken` is currently always populated with a non-empty placeholder when `AAP_OAUTH_TOKEN` is unset. This makes the backend treat AAP credentials as configured and will attempt AAP auth with an invalid token, while also preventing runtime user-supplied AAP credentials in flows that rely on app-config.

### Issue Context
`JobResourceBuilder.buildProjectSecret` treats any non-empty `oauthToken` as configured credentials, and the scaffolder create-project flow intentionally skips providing `aapCredentials` and relies on app-config.

### Fix Focus Areas
- workspaces/x2a/app-config.yaml[189-199]
- workspaces/x2a/plugins/x2a-backend/src/services/JobResourceBuilder.ts[50-75]

### Suggested change
- Change `oauthToken: ${AAP_OAUTH_TOKEN:-your-oauth-token}` to either:
 - `# oauthToken: ${AAP_OAUTH_TOKEN}` (commented unless you truly want global defaults), **or**
 - `oauthToken: ${AAP_OAUTH_TOKEN}` (no fallback), ensuring absence stays absent.
- (Optional hardening) In `JobResourceBuilder`, treat empty-string tokens as missing and throw the existing “must be provided” error so misconfigurations fail clearly.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


2. Unprovided actionsRegistry service 🐞 Bug ⛯ Reliability
Description
x2APlugin now requires actionsRegistryServiceRef and always registers MCP actions at startup.
Existing x2a-backend integration tests/backends shown in-repo do not provide an
ActionsRegistryService instance, which can prevent the backend from starting in those environments.
Code

workspaces/x2a/plugins/x2a-backend/src/plugin.ts[R45-49]

        config: coreServices.rootConfig,
        x2aDatabase: x2aDatabaseServiceRef,
        kubeService: kubeServiceRef,
+        actionsRegistry: actionsRegistryServiceRef,
      },
Evidence
The plugin explicitly declares actionsRegistryServiceRef as a required dependency. The x2a-backend
integration tests start a backend with x2APlugin and various mocks/factories but do not include any
provider for the actions registry service, unlike other MCP-related tests in this repo that
explicitly construct an actions registry mock via @backstage/backend-test-utils/alpha.

workspaces/x2a/plugins/x2a-backend/src/plugin.ts[37-49]
workspaces/x2a/plugins/x2a-backend/src/plugin.ts[83-88]
workspaces/x2a/plugins/x2a-backend/src/plugin.test.ts[149-169]
workspaces/x2a/plugins/x2a-backend/src/plugin.test.ts[234-250]
workspaces/mcp-integrations/plugins/scaffolder-mcp-extras/src/actions/createGetScaffolderTaskLogsAction.test.ts[16-18]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
`x2APlugin` now requires `actionsRegistryServiceRef`, but existing integration tests/backends do not inject a provider for that service. This can cause backend startup failures in test environments (and in any consuming backend that doesn’t include an MCP actions registry implementation).

### Issue Context
The plugin declares `actionsRegistry: actionsRegistryServiceRef` as a required init dependency and immediately calls `registerProjectActions({ actionsRegistry, ... })`.

### Fix Focus Areas
- workspaces/x2a/plugins/x2a-backend/src/plugin.ts[37-49]
- workspaces/x2a/plugins/x2a-backend/src/plugin.test.ts[145-171]
- workspaces/x2a/plugins/x2a-backend/src/plugin.test.ts[233-251]

### Suggested fix options
1) **Update tests to provide a registry service**
  - Add a `createServiceFactory` for `actionsRegistryServiceRef` returning a registry mock/implementation.
  - You can base the instance on `actionsRegistryServiceMock()` from `@backstage/backend-test-utils/alpha`.

2) **Make MCP integration optional**
  - Register the MCP actions only if the registry service is available (e.g., use an optional service ref if supported in your Backstage version), otherwise skip registration and log a debug/info message.

3) **Ensure runtime backends include the provider**
  - If MCP is mandatory, ensure every backend composition (including test backends) includes the plugin/service that provides `actionsRegistryServiceRef`.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Remediation recommended

3. MCP output double-encoded 🐞 Bug ✧ Quality
Description
The x2a:project:list MCP action returns project results as a JSON-serialized string instead of a
structured array/object. This forces MCP clients/agents to manually JSON.parse the field and
prevents the MCP schema from describing project fields directly.
Code

workspaces/x2a/plugins/x2a-backend/src/mcp/projects.ts[R66-85]

+      output: z =>
+        z.object({
+          totalCount: z.number().describe('Total number of projects'),
+          projects: z
+            .string()
+            .describe('JSON-serialized array of project objects'),
+        }),
+    },
+    action: async ({ input, credentials, logger }) => {
+      logger.info('Running x2a:project:list MCP action');
+      const response = await listProjects(
+        input,
+        { permissionsSvc, catalog, x2aDatabase },
+        credentials as BackstageCredentials<BackstageUserPrincipal>,
+      );
+      return {
+        output: {
+          totalCount: response.totalCount ?? 0,
+          projects: JSON.stringify(response.items ?? []),
+        },
Evidence
The new x2a MCP action’s output schema explicitly defines projects as a string containing JSON,
and the implementation uses JSON.stringify. In contrast, other MCP actions in this repo model
structured outputs (arrays/unions) directly in the Zod output schema, enabling clients to consume
typed JSON without extra parsing.

workspaces/x2a/plugins/x2a-backend/src/mcp/projects.ts[66-72]
workspaces/x2a/plugins/x2a-backend/src/mcp/projects.ts[81-85]
workspaces/mcp-integrations/plugins/software-catalog-mcp-extras/src/actions/createQueryCatalogEntitiesAction.ts[102-106]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
The MCP tool `x2a:project:list` returns `projects` as a JSON string, which makes tool output harder to consume and prevents the tool schema from documenting project fields.

### Issue Context
Other MCP actions in this repo use structured Zod output schemas (`z.array(...)`, unions, objects), which MCP clients can consume directly.

### Fix Focus Areas
- workspaces/x2a/plugins/x2a-backend/src/mcp/projects.ts[66-85]

### Suggested change
- Change output schema to something like:
 - `projects: z.array(z.object({ id: z.string(), name: z.string(), ... }))`
- Return `projects: response.items ?? []` (no `JSON.stringify`).
- If output size is a concern, return a reduced projection (e.g., `id`, `name`, `status`, `createdAt`, `createdBy`) rather than stringifying the full objects.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

ⓘ The new review experience is currently in Beta. Learn more

Grey Divider

Qodo Logo

@rhdh-gh-app
Copy link

rhdh-gh-app bot commented Mar 17, 2026

Missing Changesets

The following package(s) are changed by this PR but do not have a changeset:

  • @red-hat-developer-hub/backstage-plugin-x2a-backend

See CONTRIBUTING.md for more information about how to add changesets.

Changed Packages

Package Name Package Path Changeset Bump Current Version
app workspaces/x2a/packages/app none v0.0.0
backend workspaces/x2a/packages/backend none v0.0.0
@red-hat-developer-hub/backstage-plugin-x2a-backend workspaces/x2a/plugins/x2a-backend none v1.0.2

Comment on lines 45 to 49
config: coreServices.rootConfig,
x2aDatabase: x2aDatabaseServiceRef,
kubeService: kubeServiceRef,
actionsRegistry: actionsRegistryServiceRef,
},

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

2. Unprovided actionsregistry service 🐞 Bug ⛯ Reliability

x2APlugin now requires actionsRegistryServiceRef and always registers MCP actions at startup.
Existing x2a-backend integration tests/backends shown in-repo do not provide an
ActionsRegistryService instance, which can prevent the backend from starting in those environments.
Agent Prompt
### Issue description
`x2APlugin` now requires `actionsRegistryServiceRef`, but existing integration tests/backends do not inject a provider for that service. This can cause backend startup failures in test environments (and in any consuming backend that doesn’t include an MCP actions registry implementation).

### Issue Context
The plugin declares `actionsRegistry: actionsRegistryServiceRef` as a required init dependency and immediately calls `registerProjectActions({ actionsRegistry, ... })`.

### Fix Focus Areas
- workspaces/x2a/plugins/x2a-backend/src/plugin.ts[37-49]
- workspaces/x2a/plugins/x2a-backend/src/plugin.test.ts[145-171]
- workspaces/x2a/plugins/x2a-backend/src/plugin.test.ts[233-251]

### Suggested fix options
1) **Update tests to provide a registry service**
   - Add a `createServiceFactory` for `actionsRegistryServiceRef` returning a registry mock/implementation.
   - You can base the instance on `actionsRegistryServiceMock()` from `@backstage/backend-test-utils/alpha`.

2) **Make MCP integration optional**
   - Register the MCP actions only if the registry service is available (e.g., use an optional service ref if supported in your Backstage version), otherwise skip registration and log a debug/info message.

3) **Ensure runtime backends include the provider**
   - If MCP is mandatory, ensure every backend composition (including test backends) includes the plugin/service that provides `actionsRegistryServiceRef`.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

This enables a way to check the current status of the project using MCP tools, and can be used inside any project that needs to have AI tooling on top of it.

Because this uses OAuth2, I need to implement a quick page, because `plugin-auth` is not that easy to run within the current auth implementation.

To test, I use MCP Inspector, like this:

```
DANGEROUSLY_OMIT_AUTH=true npx @modelcontextprotocol/inspector
```

The auth env var is important, because without it, it messes up the OAuth2 token that we set[0].

I can see room for improvements where:
  - The auth could maybe be moved to https://www.npmjs.com/package/@backstage/plugin-auth
  - The router is highly coupled; maybe we need to have an HTTP router and services that can be consumed by MCP and by the
router.
  - The MCP actions could be expanded (follow-up PR):
      - Run module
      - Get project
      - Get module

So the idea is just to get the basic terms of the MCP server in place, and finish all the implementation correctly by the
end of the quarter.

[0] modelcontextprotocol/inspector#633

Signed-off-by: Eloy Coto <eloy.coto@acalustra.com>
@sonarqubecloud
Copy link

Copy link
Member

@mareklibra mareklibra left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How do we plan to distribute the ConsentPage? Anything under the packages is dev-only and not included in the production build. The RHDH can consume plugins only (after their conversion to the dynamic ones).

},
callbackUrl: {
fontFamily: 'monospace',
fontSize: '0.85rem',
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: this should be taken from theme

{state.status === 'completed' && (
<Typography variant="h5" align="center" style={{ marginTop: 32 }}>
{state.action === 'approve'
? `You have successfully authorized the application to access your ${appTitle} account. Redirecting...`
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All strings must be internationalized

<Route path="/settings" element={<UserSettingsPage />} />
<Route path="/catalog-graph" element={<CatalogGraphPage />} />
<Route path="/notifications" element={<NotificationsPage />} />
<Route path="/oauth2/authorize/:sessionId" element={<ConsentPage />} />
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This will be difficult to distribute within RHDH. Easy with Backstage upstream deployments.

action: async ({ input, credentials, logger }) => {
logger.info('Running x2a:project:list MCP action');
const response = await listProjects(
input,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is good. TypeScript can help here with maintenance in the future.

In addition, we will need unit tests covering

  • functionality of the action
  • guarding the contract between our router/services and the MCP tools.

This is simple to achieve at this scale but a headache when the tool list grows.

'List conversion projects with optional pagination and sorting.',
attributes: { readOnly: true },
schema: {
input: z =>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I can see a lot of similarity with the projectsGetRequestSchema from the router/project.ts.

Can we reuse it?
The tools and router will evolve together. At certain point we will need to introduce API versioning anyway.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yup, my fault!

): Promise<ProjectsGet['response']> {
const { permissionsSvc, catalog, x2aDatabase } = deps;

const [userResult, adminViewResult] = await Promise.all([
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is reinventing the wheel, let's use the useEnforceX2APermissions which is well tested and consistent already. If not, we will eventually implement the same logic from scratch and end up in a similar solution.

const credentials = await httpAuth.credentials(req, { allow: ['user'] });

// parse request query
const projectsGetRequestSchema = z.object({
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Subject to reuse

});

const { projects, totalCount } = await x2aDatabase.listProjects(query, {
const response = await listProjects(
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Instead of introducing yet another layer (we have a lot of them already), the MCP tools can act as API clients.

This will simplify the flow, testing and maintenance.
The overhead of calls is very small.
We we will still benefit from all the decorators which Backstage provides for the calls.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The main problem for this is the token, the token is different and you cannot use the token for the HTTP request.

config: coreServices.rootConfig,
x2aDatabase: x2aDatabaseServiceRef,
kubeService: kubeServiceRef,
actionsRegistry: actionsRegistryServiceRef,
Copy link
Member

@mareklibra mareklibra Mar 18, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This QoDo finding makes sense. We should not rely on the RHDH having the MCP server configured. Let's make it optional.

@mareklibra
Copy link
Member

The use of the experimentalDynamicClientRegistration is risky. Is it supported by the recent RHDH?

I would be more for starting simple by reusing existing Backstage auth mechanisms: https://backstage.io/docs/auth/service-to-service-auth

In case of the static tokens listed there, the subject can be used as "the user" in a similar sense we use the user within the UI flow.

Some of the issues I can see with the experimentalDynamicClientRegistration (just quick thinking, there will be more):

  • experimental, risky support
  • tight coupling of the MCP tool to the RHDH UI (signed-in user's consent within the RHDH UI is required)
  • user's identity shared with the LLM (yeah, that's what we want, but...)

We can evolve to the experimentalDynamicClientRegistration later.

@mareklibra
Copy link
Member

We will need unit tests covering:

  • functionality of the action/tool
  • guarding the contract between our router/services and the MCP tools.

@eloycoto
Copy link
Contributor Author

The use of the experimentalDynamicClientRegistration is risky. Is it supported by the recent RHDH?

Yes, supported.

I would be more for starting simple by reusing existing Backstage auth mechanisms: https://backstage.io/docs/auth/service-to-service-auth
In case of the static tokens listed there, the subject can be used as "the user" in a similar sense we use the user within the UI flow.
Some of the issues I can see with the experimentalDynamicClientRegistration (just quick thinking, there will be more):
experimental, risky support
tight coupling of the MCP tool to the RHDH UI (signed-in user's consent within the RHDH UI is required)
user's identity shared with the LLM (yeah, that's what we want, but...)
We can evolve to the experimentalDynamicClientRegistration later.

The problem with a simple service-to-service auth, is that all RBAC system is broken in so many ways, like you will lost all fine-grained RBAC, and other users can see projects that they are not allowed to it.

The MCP is just another way to consume the service, and we should take that primitive to that point. So what you're suggesting is like, from the HTML we render one thing, and the user in the API can see all the things, do you accept that? If not, why the MCP is different?

MCP is just another presentation layer, and the RBAC and the authN/Z should use the same primitives rules. It's just doing it right now, and growth into the less headache in the future.

The experimentalDynamicClientRegistration is a risk that we need to take, doing it right now, and evolve from it. And we can also help RHDH teams to discover issues, so it's a win for the company :)

auth:
experimentalDynamicClientRegistration:
# enable the feature
enabled: true
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should this be auth enabled?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes, it is what allows the oauth flow in MCP

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oops sorry. I meant "Auto enabled". as in do we want this enabled by default

@eloycoto
Copy link
Contributor Author

Instead of introducing yet another layer (we have a lot of them already), the MCP tools can act as API clients.

This will simplify the flow, testing and maintenance.
The overhead of calls is very small.
We we will still benefit from all the decorators which Backstage provides for the calls.

I'm not sure about this to be honest, I think that we should embrace the hexagonal architecture here, so we can have the layers of inputs, because calling the same API, it also add problems because the token is different, and it's just complicated in some ways.

For me the architecture should be like this:

HTTP Router - Schema/Validation - Service

  • Where the HTTP router handle the transformation of the HTTP request to data and AuthN
  • Schema validation provides the way to validate the data.
  • Service handles the AuthZ and the persistence of the data.

Mainly, becase we can reuse the following and have something like:

MCP Server action - Schema/Validation - Service

The Schema/Validation- Service will be reused across. And we ackonoledge that the Auth on MCP is/might be different, so we have the correct abstraction layer.

For me calling the API internally, it's just an overhead, something that it's not that great, and it'll add compromise the architecture in the future.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants