mirror of
https://github.com/ModernRelay/omnigraph.git
synced 2026-06-18 02:24:27 +02:00
feat(mcp): per-query @mcp(...) annotation + per-param @description + @instruction folding
Wire the `.gq` authoring surface that controls how a stored query is projected
as an MCP tool. All of it rides in the query source (content-addressed,
re-parsed at boot), so there is no cluster.yaml / catalog / serving-snapshot
plumbing — and it is orthogonal to Cedar `invoke_query` (presentation, not
authorization).
- Per-parameter `@description("…")` (leading the variable) → carried on
`Param.description`, mapped through `param_descriptor`, and emitted on the
outer JSON-Schema property by `param_json_schema`, so it shows up in both the
MCP tool input schema and the `GET /queries` catalog.
- Query `@mcp(expose: <bool>, tool_name: "<name>")` → parsed into
`QueryDecl.mcp`; `StoredQuery::is_exposed()` / `effective_tool_name()` resolve
from it. `expose: false` hides a query from the agent surface (`tools/list`,
`stored_query_list`, run-by-name) while keeping it HTTP/service-callable.
- `@instruction` is folded into the MCP tool description (after `@description`),
so the agent-facing how/when-to-use guidance reaches `tools/list`.
- Removes the now-dead `RegistrySpec.{expose, tool_name}` fields (server + CLI);
`settings.rs` no longer hardcodes `expose: true`. Test helpers express
exposure by injecting `@mcp(expose: false)` into the source (the real path).
openapi.json regenerated: `ParamDescriptor` gains an optional `description`.
Tests: compiler parser (param @description, @mcp parse + duplicate rejection),
api-types schema_equivalence (description on the outer property), server mcp
(folded description + param docs + @mcp tool rename, list==call). Full
workspace gate green.
This commit is contained in:
parent
bcd0d9c867
commit
c8e91c11f0
14 changed files with 396 additions and 107 deletions
|
|
@ -780,8 +780,6 @@ fn registry_from_serving_queries(
|
|||
.map(|q| omnigraph_server::queries::RegistrySpec {
|
||||
name: q.name.clone(),
|
||||
source: q.source.clone(),
|
||||
expose: false,
|
||||
tool_name: None,
|
||||
})
|
||||
.collect();
|
||||
QueryRegistry::from_specs(specs).map_err(|errors| {
|
||||
|
|
@ -890,8 +888,8 @@ pub(crate) async fn execute_queries_list(
|
|||
.iter()
|
||||
.map(|q| QueriesListItem {
|
||||
name: q.name.clone(),
|
||||
mcp_expose: q.expose,
|
||||
tool_name: q.tool_name.clone(),
|
||||
mcp_expose: q.is_exposed(),
|
||||
tool_name: q.decl.mcp.tool_name.clone(),
|
||||
mutation: q.is_mutation(),
|
||||
params: q
|
||||
.decl
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue