Skip to content

Commit b51ab5b

Browse files
roomi-fieldsclaude
andcommitted
mcp: declare output schemas + annotations on all tools (0.10.1)
Every MCP tool now ships an outputSchema and annotations (title + read-only / idempotent / open-world hints), and tool results carry structuredContent next to the text block — clients get a typed payload instead of prose to re-parse. Protocol version advertised at initialize bumped to 2025-06-18, the revision that introduced these fields. The MCPB bundle manifest mirrors the same schemas so the Smithery listing reflects the real server surface. Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 2412e57 commit b51ab5b

7 files changed

Lines changed: 292 additions & 30 deletions

File tree

.claude-plugin/plugin.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
33
"name": "osc-bridge",
4-
"version": "0.10.0",
4+
"version": "0.10.1",
55
"description": "Declarative OSC ↔ MIDI/SysEx bridge for 849 hardware synthesizers and music software (Ableton, Bitwig, Reaper, Sonic Pi, SuperCollider, Pure Data). A MIDI MCP and OSC MCP — discover the device catalogue, read a device's OSC surface, and send OSC to synths and DAWs from Claude.",
66
"author": {
77
"name": "roomi-fields",
@@ -30,7 +30,7 @@
3030
"mcpServers": {
3131
"osc-bridge": {
3232
"command": "npx",
33-
"args": ["-y", "@roomi-fields/osc-bridge@0.10.0", "mcp"]
33+
"args": ["-y", "@roomi-fields/osc-bridge@0.10.1", "mcp"]
3434
}
3535
}
3636
}

CHANGELOG.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,23 @@ additive minor bumps every time a new device class surfaces something
99
the JSON can't yet express. Backwards-compat of existing device JSONs
1010
is tracked explicitly under each release.
1111

12+
## [0.10.1] — 2026-05-14
13+
14+
A polish release for the MCP server. No device-JSON or runtime changes.
15+
16+
### Changed — MCP server
17+
- All five tools now declare an `outputSchema` and `annotations` (title +
18+
read-only / idempotent / open-world hints). Tool results carry
19+
`structuredContent` alongside the text block, so MCP clients get a typed,
20+
machine-readable payload — not just prose to re-parse.
21+
- Protocol version advertised at `initialize` bumped to `2025-06-18` (the
22+
revision that introduced `outputSchema` / `structuredContent`).
23+
24+
### Compatibility
25+
- Device JSONs: unchanged — every `0.10.0` driver loads as-is.
26+
- MCP clients on the older `2025-03-26` revision still work; the text block
27+
in every tool result is unchanged.
28+
1229
## [0.10.0] — 2026-05-14
1330

1431
osc-bridge stops being a hardware-only tool. A new **OSC transport** lets a

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "osc-bridge"
3-
version = "0.10.0"
3+
version = "0.10.1"
44
edition = "2021"
55
description = "Declarative OSC ↔ MIDI/SysEx bridge for hardware synthesizers"
66
license = "GPL-3.0-or-later"

mcpb/manifest.json

Lines changed: 83 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"manifest_version": "0.3",
33
"name": "osc-bridge",
44
"display_name": "osc-bridge",
5-
"version": "0.10.0",
5+
"version": "0.10.1",
66
"description": "OSC ↔ MIDI/SysEx bridge for 849 synths and DAWs — a MIDI MCP and OSC MCP.",
77
"long_description": "osc-bridge is a declarative bridge between OSC and the music world: 849 hardware synthesizers over MIDI/SysEx, plus music software over OSC (Ableton, Bitwig, Reaper, Sonic Pi, SuperCollider, Pure Data, TouchDesigner, VCV Rack). Its MCP server exposes the whole catalogue to an LLM — list devices, read a device's named OSC surface, send OSC to synths and DAWs, and check a running bridge's status. Both a MIDI MCP (hardware over MIDI/SysEx) and an OSC MCP (DAWs and live-coding environments).",
88
"author": {
@@ -60,7 +60,31 @@
6060
{
6161
"name": "list_devices",
6262
"description": "Enumerate every device driver — name, vendor, slug, kind (hardware/software), and source tier. Use this first to discover the catalogue.",
63-
"inputSchema": { "type": "object", "properties": {} }
63+
"inputSchema": { "type": "object", "properties": {} },
64+
"outputSchema": {
65+
"type": "object",
66+
"properties": {
67+
"count": { "type": "integer", "description": "Number of device drivers found." },
68+
"devices": {
69+
"type": "array",
70+
"items": {
71+
"type": "object",
72+
"properties": {
73+
"name": { "type": "string" },
74+
"vendor": { "type": "string" },
75+
"slug": { "type": "string", "description": "OSC prefix without the leading slash." },
76+
"kind": { "type": "string", "description": "'hardware' or 'software'." },
77+
"revision": { "type": "string" },
78+
"source_tier": { "type": "string" },
79+
"file": { "type": "string" }
80+
},
81+
"required": ["name", "vendor", "slug", "kind"]
82+
}
83+
}
84+
},
85+
"required": ["count", "devices"]
86+
},
87+
"annotations": { "title": "List devices", "readOnlyHint": true, "idempotentHint": true, "openWorldHint": false }
6488
},
6589
{
6690
"name": "get_device_docs",
@@ -69,7 +93,17 @@
6993
"type": "object",
7094
"properties": { "slug": { "type": "string", "description": "Device slug, e.g. 'ableton' or 'minilab3'" } },
7195
"required": ["slug"]
72-
}
96+
},
97+
"outputSchema": {
98+
"type": "object",
99+
"properties": {
100+
"slug": { "type": "string" },
101+
"has_docs": { "type": "boolean", "description": "False when no companion .md exists for the device." },
102+
"markdown": { "type": "string", "description": "The companion documentation, or a not-found message when has_docs is false." }
103+
},
104+
"required": ["slug", "has_docs", "markdown"]
105+
},
106+
"annotations": { "title": "Get device docs", "readOnlyHint": true, "idempotentHint": true, "openWorldHint": false }
73107
},
74108
{
75109
"name": "list_routes",
@@ -78,7 +112,22 @@
78112
"type": "object",
79113
"properties": { "slug": { "type": "string", "description": "Device slug, e.g. 'minilab3'" } },
80114
"required": ["slug"]
81-
}
115+
},
116+
"outputSchema": {
117+
"type": "object",
118+
"properties": {
119+
"device": { "type": "string" },
120+
"vendor": { "type": "string" },
121+
"osc_prefix": { "type": "string" },
122+
"kind": { "type": "string" },
123+
"commands": { "type": "array", "description": "Declarative OSC paths the device accepts, with typed args and mode.", "items": { "type": "object" } },
124+
"cc_params": { "type": "array", "description": "CC / NRPN parameters, each mapped to an OSC address.", "items": { "type": "object" } },
125+
"params": { "type": "array", "description": "SysEx parameters, each mapped to an OSC address.", "items": { "type": "object" } },
126+
"replies": { "type": "array", "description": "Reply patterns the device emits back onto the OSC surface.", "items": { "type": "object" } }
127+
},
128+
"required": ["device", "osc_prefix", "commands", "cc_params", "params", "replies"]
129+
},
130+
"annotations": { "title": "List device routes", "readOnlyHint": true, "idempotentHint": true, "openWorldHint": false }
82131
},
83132
{
84133
"name": "send",
@@ -91,15 +140,43 @@
91140
"target": { "type": "string", "description": "Optional host:port override" }
92141
},
93142
"required": ["addr"]
94-
}
143+
},
144+
"outputSchema": {
145+
"type": "object",
146+
"properties": {
147+
"sent": { "type": "boolean" },
148+
"address": { "type": "string" },
149+
"bytes": { "type": "integer", "description": "Encoded OSC packet size." },
150+
"target": { "type": "string", "description": "host:port the packet was sent to." }
151+
},
152+
"required": ["sent", "address", "bytes", "target"]
153+
},
154+
"annotations": { "title": "Send OSC message", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": true }
95155
},
96156
{
97157
"name": "get_status",
98158
"description": "Send /bridge/status to a running osc-bridge and report the replies received within 500 ms.",
99159
"inputSchema": {
100160
"type": "object",
101161
"properties": { "target": { "type": "string", "description": "host:port to query, defaults to the configured default target" } }
102-
}
162+
},
163+
"outputSchema": {
164+
"type": "object",
165+
"properties": {
166+
"target": { "type": "string" },
167+
"replied": { "type": "boolean", "description": "False when no reply arrived within 500 ms." },
168+
"replies": {
169+
"type": "array",
170+
"items": {
171+
"type": "object",
172+
"properties": { "addr": { "type": "string" }, "args": { "type": "array" } },
173+
"required": ["addr", "args"]
174+
}
175+
}
176+
},
177+
"required": ["target", "replied", "replies"]
178+
},
179+
"annotations": { "title": "Get bridge status", "readOnlyHint": true, "idempotentHint": true, "openWorldHint": true }
103180
}
104181
]
105182
}

npm/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@roomi-fields/osc-bridge",
3-
"version": "0.10.0",
3+
"version": "0.10.1",
44
"mcpName": "io.github.roomi-fields/osc-bridge",
55
"description": "Declarative OSC bridge for music hardware and software — 849 synthesizer drivers (MIDI/SysEx) plus DAW & live-coding targets (Ableton, Bitwig, Reaper, Sonic Pi, SuperCollider). Ships an MCP server: a MIDI MCP and OSC MCP for controlling synths and DAWs from Claude.",
66
"keywords": [

server.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@
77
"url": "https://github.com/roomi-fields/osc-bridge",
88
"source": "github"
99
},
10-
"version": "0.10.0",
10+
"version": "0.10.1",
1111
"packages": [
1212
{
1313
"registryType": "npm",
1414
"identifier": "@roomi-fields/osc-bridge",
15-
"version": "0.10.0",
15+
"version": "0.10.1",
1616
"transport": {
1717
"type": "stdio"
1818
},

0 commit comments

Comments
 (0)