feat(mcp): attach resources from TUI

This commit is contained in:
Aiden Cline 2026-07-07 13:58:52 -05:00
commit 7df9a16ffd
12 changed files with 722 additions and 44 deletions

View file

@ -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,

View file

@ -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" }],