Agent-Native Devframe Devframe released an agent-native development framework that exposes its API — RPC functions, resources, and shared state — to AI agents over MCP on the node side and WebMCP on the browser side, opt-in per function. The framework adds an `agent` field to `defineRpcFunction`, a `ctx.agent` API for registering non-RPC tools and resources, and an MCP adapter at `devframe/adapters/mcp` that serves an MCP server, with the dev server mounting the route at `/__mcp` by default when an agent-flagged RPC, tool, or resource exists and the optional `@devframes/agentic` peer is installed. MCP wire names are constrained to `^[a-zA-Z0-9_-]{1,128}$`, and colliding sanitized ids keep the first while the later is hidden with error code DF0047. Agent-Native Devframe Devframe exposes its API RPC functions, resources, shared state to agents, over MCP on the node side and WebMCP browser-side-tools-over-webmcp on the browser side, opt-in per function. How it works how-it-works Three pieces: the agent field on defineRpcFunction , ctx.agent non-RPC tools + resources , and the MCP adapter devframe/adapters/mcp serving an MCP https://modelcontextprotocol.io server. The same agent field on a client RPC function surfaces it over WebMCP browser-side-tools-over-webmcp instead. Exposing an RPC function exposing-an-rpc-function js import { defineRpcFunction } from 'devframe' export const getSessionSummary = defineRpcFunction { name: 'rolldown-get-session-summary', type: 'query', args: v.object { sessionId: v.string } , returns: v.object { durationMs: v.number , chunkCount: v.number } , agent: { description: 'Summarize a Rolldown build session. Safe to call freely.', title: 'Build summary', // safety inferred from type: 'query' → 'read' }, setup: ctx = { handler: async { sessionId } = { // ... }, } , } Tool ids and wire names tool-ids-and-wire-names - The id registers/invokes in devframe, colon-namespaced: devframes:plugin: