As of today, there's kind of a "mismatch" in Reshapr concepts regarding how and where we compose capabilities for an MCP Server exposed via Reshapr. I use quotes around mimatch because I am not even it is one, but it needs at least clarification if not
refactoring. I'd like to start the discussion, as shifting things a bit can lead to some consequences in the way we use and define Reshapr API, as well as the way we name the MCP Server/Exposition endpoints.
Let's start with a reminder on how concepts in Reshapr are used today with the following schema:
From bottom to top:
Service is discovered via a specification import (ex: an OpenAPI spec file). It defines the available operations with input/output interfaces,
- On top of a service, you can attach
Artifacts like Prompts, Resources, CustomTools or OutputFilters that bring enriched capabilities to the Service. Today, you can have just one artifact of each kind, and once loaded in Reshapr, those capabilities are always applied. This means that Service + Artifact is actually the default implied layer where the composition of capabilities is defined.
ConfigurationPlan allows the application of runtime settings to a Service - typically, it's security and backend connection options,
MCP Server is the concrete result of the exposition of a Configuration Plan on one or many Gateways (via the concept of Gateway Groups which is out of scope here). MCP Servers endpoint names are deduced from the Service coordinates - eg. /mcp/<org_id>/< service_name>/<service_version - or from the exposition ID - eg. /mcp/<id>
This approach is fairly simple but leads to a set of limitations IMHO:
- You can't split
Prompts, Resources, CustomTools or OutputFilters on multiple artifact files. Imagine a Service with a dozen operations, this can lead to maintenance issues,
- You can't define/override capabilities for different use-cases or different populations of users. Even if you can deploy multiple configuration plans / MCP Servers connected to different backends and configured with different security options, you'll will have the same output filters or the same custom tool definition on each of them.
- As the MCP Server endpoint names are deduced from the
Service coordinates - eg. /mcp/< service_name>/<service_version - you don't really know which configuration plan you're running, and that prevents you from running 2 different configuration plans / MCP Servers on the same Gateway! This is something you must be careful with when deploying the configuration.
The workaround to the above limitations is, in fact, to import multiple times the same OpenAPI spec but with different service names and versions to finally have multiple Services to which you can attach different artifacts, ... This is indeed a diversion of the initial intent of renaming / reversioning that was added to be able to split badly designed OpenAPI (one covering mulitple business domaines for example).
When I mentioned a "mismatch" above, I actually referred to the artifact's position, which by nature is closer to the Service where it should actually be closer to the Configuration Plan as they represent capabilities you might be able to pick and choose from.
As a consequence, I thought of another way of representing things that I submit for discussion. Here is the representation I have at the moment:
The main difference here is that there is no longer the constraint of having only one artifact of each kind: we should be able to attach as many artifacts as we want, depending on our strategy (splitting for maintenance purposes or for use-case separation purposes). As a consequence, the proposition is also to be able to recompose artifacts as needed when establishing a ConfigurationPlan. Plans could hold an includedArtifacts property that allows selecting only the artifacts (and thus capabilities) that will be applied when running a plan through an MCP Server. Reasonably, we could imagine having a default value for includedArtifacts that is set to * so that the existing behaviour will be kept if you don't want/need to cherry-pick capabilities.
The benefits of the new model are that you can now have a single definition of a Service, but yet have it made accessible through different MCP Servers that cover different use-cases (think: different workflows, different populations of users) with different capabilities enabled or disabled, thanks to ConfigurationPlan composition.
As a consequence, and to allow deterministic use of the correct configuration, I think we should adapt or enrich the way we compose MCP Server endpoint names. Moreover, referencing an Exposition from the Service name and version is too fuzzy; we must systematically use the configuration plan name as well.
I propose we adopt the following naming and conventions:
/mcp/<org_id>/<service_name>/<service_version> can be kept as a convenient and readable endpoint, but it will only allow you to access the latest deployed configuration plan for a Service on a Gateway => you will have no deterministic/reproducible behaviour in case you made several deployments.
/mcp/<exposition_id> is the deterministic way of accessing a specific deployed Configuration Plan for a service on a Gateway.
What do you think? Does it make sense? I have the feeling it adds a layer of complexity in the process, but still allows current usage (of redefining multiple services, including all artifacts by default, and using user-friendly endpoint names) to be used. On the other hand, we would now have solutions to handle more complex capabilities composition and reuse scenarios.
I'm looking forward to hearing from you!
As of today, there's kind of a "mismatch" in Reshapr concepts regarding how and where we compose capabilities for an MCP Server exposed via Reshapr. I use quotes around mimatch because I am not even it is one, but it needs at least clarification if not
refactoring. I'd like to start the discussion, as shifting things a bit can lead to some consequences in the way we use and define Reshapr API, as well as the way we name the MCP Server/Exposition endpoints.
Let's start with a reminder on how concepts in Reshapr are used today with the following schema:
From bottom to top:
Serviceis discovered via a specification import (ex: an OpenAPI spec file). It defines the available operations with input/output interfaces,ArtifactslikePrompts,Resources,CustomToolsorOutputFiltersthat bring enriched capabilities to the Service. Today, you can have just one artifact of each kind, and once loaded in Reshapr, those capabilities are always applied. This means that Service + Artifact is actually the default implied layer where the composition of capabilities is defined.ConfigurationPlanallows the application of runtime settings to a Service - typically, it's security and backend connection options,MCP Serveris the concrete result of the exposition of a Configuration Plan on one or many Gateways (via the concept of Gateway Groups which is out of scope here). MCP Servers endpoint names are deduced from theServicecoordinates - eg./mcp/<org_id>/< service_name>/<service_version- or from the exposition ID - eg./mcp/<id>This approach is fairly simple but leads to a set of limitations IMHO:
Prompts,Resources,CustomToolsorOutputFilterson multiple artifact files. Imagine a Service with a dozen operations, this can lead to maintenance issues,Servicecoordinates - eg./mcp/< service_name>/<service_version- you don't really know which configuration plan you're running, and that prevents you from running 2 different configuration plans / MCP Servers on the same Gateway! This is something you must be careful with when deploying the configuration.The workaround to the above limitations is, in fact, to import multiple times the same OpenAPI spec but with different service names and versions to finally have multiple
Servicesto which you can attach different artifacts, ... This is indeed a diversion of the initial intent of renaming / reversioning that was added to be able to split badly designed OpenAPI (one covering mulitple business domaines for example).When I mentioned a "mismatch" above, I actually referred to the artifact's position, which by nature is closer to the
Servicewhere it should actually be closer to theConfiguration Planas they represent capabilities you might be able to pick and choose from.As a consequence, I thought of another way of representing things that I submit for discussion. Here is the representation I have at the moment:
The main difference here is that there is no longer the constraint of having only one artifact of each kind: we should be able to attach as many artifacts as we want, depending on our strategy (splitting for maintenance purposes or for use-case separation purposes). As a consequence, the proposition is also to be able to recompose artifacts as needed when establishing a
ConfigurationPlan. Plans could hold anincludedArtifactsproperty that allows selecting only the artifacts (and thus capabilities) that will be applied when running a plan through an MCP Server. Reasonably, we could imagine having a default value forincludedArtifactsthat is set to*so that the existing behaviour will be kept if you don't want/need to cherry-pick capabilities.As a consequence, and to allow deterministic use of the correct configuration, I think we should adapt or enrich the way we compose MCP Server endpoint names. Moreover, referencing an
Expositionfrom theServicename and version is too fuzzy; we must systematically use the configuration plan name as well.I propose we adopt the following naming and conventions:
/mcp/<org_id>/<service_name>/<service_version>can be kept as a convenient and readable endpoint, but it will only allow you to access the latest deployed configuration plan for a Service on a Gateway => you will have no deterministic/reproducible behaviour in case you made several deployments./mcp/<exposition_id>is the deterministic way of accessing a specific deployed Configuration Plan for a service on a Gateway.What do you think? Does it make sense? I have the feeling it adds a layer of complexity in the process, but still allows current usage (of redefining multiple services, including all artifacts by default, and using user-friendly endpoint names) to be used. On the other hand, we would now have solutions to handle more complex capabilities composition and reuse scenarios.
I'm looking forward to hearing from you!