Skip to content

@askable-ui/mcp

MCP bridge for exposing Context packets to agents.

bash
npm install @askable-ui/mcp
ts
import { createAskableContext } from '@askable-ui/core';
import { createAskableMcpContextProvider, createAskableMcpServer } from '@askable-ui/mcp';

const ctx = createAskableContext({ viewport: true });
ctx.observe(document);

const server = createAskableMcpServer({
  provider: createAskableMcpContextProvider(ctx, {
    history: 3,
    includeViewport: true,
    source: { app: 'analytics-dashboard' },
  }),
});

createAskableMcpContextProvider(ctx, defaults?)

Adapts an existing AskableContext to the MCP provider interface.

OptionTypeDescription
ctxPick<AskableContext, 'toContextPacket' | 'toContext'> plus optional async methodsSource context to expose through MCP
defaultsAskableMcpContextOptionsDefault packet and prompt options applied to every tool call

Defaults and tool-call options are merged. Nested source, privacy, and provenance metadata are merged field-by-field.

When the provided context implements toContextPacketAsync() and toContextAsync(), the built-in provider uses those methods so registered app-owned sources can flow into MCP tools.

ts
import { createAskableCollectionSource } from '@askable-ui/core';

ctx.registerSource('accounts', createAskableCollectionSource({
  describe: 'Accounts matching active filters',
  getState: () => ({ filters, sort, totalCount }),
  getVisibleItems: () => table.getVisibleRows(),
  getItems: () => accountStore.getAllMatching({ filters, sort }),
  getSummary: ({ maxItems }) => summarizeAccounts({ filters, sort, maxItems }),
  sanitizeItem: redactAccountFields,
}));

const provider = createAskableMcpContextProvider(ctx, {
  history: 3,
  includeViewport: true,
  sources: [{ id: 'accounts', mode: 'all', maxItems: 25, timeoutMs: 750 }],
  sourceErrorMode: 'include',
});

createAskableMcpServer(options)

Creates an MCP server with tools/resources for reading structured Context packets.

OptionTypeDescription
provider.getContext(options) => WebContextPacket | Promise<WebContextPacket>Supplies the current packet
provider.formatContextForPrompt(packet, options) => string | Promise<string>Optional custom prompt formatter
namestringMCP server name
versionstringMCP server version

Tool options

get_current_context and format_context_for_prompt accept common context options:

OptionDescription
scopeFilter context to a named UI scope
presetUse compact, verbose, or json prompt defaults
formatUse natural or json prompt output
includeTextInclude or omit target text
maxTextLengthTruncate extracted text
maxTokensApply an approximate prompt budget
hierarchyDepthLimit included ancestor hierarchy
historyInclude recent interactions
includeViewportInclude visible annotated elements in packets
sourcesInclude registered app-owned sources in packets and prompt text
sourceModeDefault source mode when a source request omits mode
sourceErrorModeUse include, omit, or throw for failed sources
intentAttach user intent to packets
currentLabel / historyLabelCustomize prompt section labels
sourceLabelCustomize the prompt section label for source context

Registered MCP surface

NameKindDescription
context://schemaResourceJSON Schema for packets
get_current_contextToolReturns the current packet as JSON
get_context_schemaToolReturns the packet JSON Schema
format_context_for_promptToolReturns prompt-ready text

The package does not start a transport. Connect the returned server with the MCP transport that fits your runtime.

Released under the MIT License.