feat(mcp): attach resources from TUI
This commit is contained in:
parent
947bbf9490
commit
7df9a16ffd
12 changed files with 722 additions and 44 deletions
|
|
@ -38,6 +38,33 @@ export const Server = Schema.Struct({
|
|||
integrationID: optional(IntegrationID),
|
||||
}).annotate({ identifier: "Mcp.Server" })
|
||||
|
||||
export interface ResourceReference extends Schema.Schema.Type<typeof ResourceReference> {}
|
||||
export const ResourceReference = Schema.Struct({
|
||||
server: Schema.String,
|
||||
uri: Schema.String,
|
||||
}).annotate({ identifier: "Mcp.ResourceReference" })
|
||||
|
||||
export function resourceUri(input: ResourceReference) {
|
||||
const url = new URL("mcp://resource")
|
||||
url.searchParams.set("server", input.server)
|
||||
url.searchParams.set("uri", input.uri)
|
||||
return url.href
|
||||
}
|
||||
|
||||
export function parseResourceUri(input: string) {
|
||||
try {
|
||||
const url = new URL(input)
|
||||
if (url.protocol !== "mcp:" || url.hostname !== "resource" || url.pathname || url.hash) return
|
||||
const server = url.searchParams.get("server")
|
||||
const uri = url.searchParams.get("uri")
|
||||
if (!server || !uri) return
|
||||
const reference = ResourceReference.make({ server, uri })
|
||||
return resourceUri(reference) === input ? reference : undefined
|
||||
} catch {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
export interface Resource extends Schema.Schema.Type<typeof Resource> {}
|
||||
export const Resource = Schema.Struct({
|
||||
server: Schema.String,
|
||||
|
|
|
|||
|
|
@ -3,6 +3,16 @@ import { Schema } from "effect"
|
|||
import { Mcp } from "../src/mcp.js"
|
||||
|
||||
describe("Mcp resources", () => {
|
||||
test("round trips canonical resource attachment URIs", () => {
|
||||
const reference = { server: "Docs & Search", uri: "docs://guide/chapter?q=one two" }
|
||||
const uri = Mcp.resourceUri(reference)
|
||||
|
||||
expect(uri).toBe("mcp://resource?server=Docs+%26+Search&uri=docs%3A%2F%2Fguide%2Fchapter%3Fq%3Done+two")
|
||||
expect(Mcp.parseResourceUri(uri)).toEqual(reference)
|
||||
expect(Mcp.parseResourceUri(`${uri}&extra=true`)).toBeUndefined()
|
||||
expect(Mcp.parseResourceUri("docs://guide")).toBeUndefined()
|
||||
})
|
||||
|
||||
test("decodes resource catalogs and omits absent metadata", () => {
|
||||
const value = Schema.decodeUnknownSync(Mcp.ResourceCatalog)({
|
||||
resources: [{ server: "docs", name: "Readme", uri: "docs://readme" }],
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue