Skip to main content
Glama
qinsehm1128

askboard-mcp

by qinsehm1128

askboard-mcp

askboard-mcp is a local MCP server for collecting structured human input from a browser. An AI client sends a form schema, Askboard opens a local web page, the user submits answers, and the MCP tool returns normalized JSON. It also keeps a searchable history dashboard so previous requests and edits stay reviewable.

The UI is rendered by the server itself, so it does not require MCP-UI support from Claude Code, Cursor, Cline, or other MCP clients.

Features

  • ask_user: open a browser form with single-choice, multi-choice, free-text, required fields, and custom write-in options.

  • open_dashboard: open the local history dashboard.

  • get_updates: read only sessions changed after a revision watermark.

  • Searchable history: left-side session list, status filters, and right-side detail view.

  • Editable history: update past answers from the dashboard; edits bump the session rev.

  • Local-only storage: history is saved as JSON under ~/.askboard-mcp by default.

Related MCP server: codepet-mcp-server

Install

npm install -g askboard-mcp

The package requires Node.js 20 or newer.

MCP Client Configuration

After installing from npm:

{
  "mcpServers": {
    "askboard": {
      "command": "askboard-mcp"
    }
  }
}

For local development from this repository:

{
  "mcpServers": {
    "askboard": {
      "command": "node",
      "args": ["/absolute/path/to/askboard-mcp/dist/index.js"]
    }
  }
}

Usage

Ask your AI client to use ask_user when it needs several decisions at once:

{
  "title": "Confirm refactor scope",
  "intro": "Select the changes you want included.",
  "fields": [
    {
      "id": "scope",
      "label": "Scope",
      "type": "multi",
      "options": ["Split service layer", "Replace logger", "Add tests"],
      "allowCustom": true,
      "required": true
    },
    {
      "id": "priority",
      "label": "Priority",
      "type": "single",
      "options": ["Now", "Next iteration", "Defer"]
    },
    {
      "id": "notes",
      "label": "Notes",
      "type": "text",
      "placeholder": "Optional"
    }
  ]
}

The returned result includes the session id, status, revision, normalized answers, and dashboard URL.

Tools

ask_user

Shows an interactive browser form and waits for submission. Supported field types:

  • single: one radio option, optionally with allowCustom.

  • multi: checkbox options, optionally with allowCustom.

  • text: free-form text area.

open_dashboard

Opens http://127.0.0.1:<port>/dashboard. The dashboard has a left history rail, search, status filters, and a detail pane. Editing a pending record also answers the waiting tool call.

get_updates

Reads history incrementally:

{ "sinceRevision": 12 }

Response:

{
  "revision": 15,
  "sinceRevision": 12,
  "count": 1,
  "changes": []
}

Pass the returned revision into the next get_updates call to avoid re-reading full history.

Environment Variables

Variable

Purpose

Default

ASKBOARD_PORT

Starting port for the local web server. If busy, Askboard probes the next ports.

7717

ASKBOARD_TIMEOUT_MS

How long ask_user waits for a browser submission.

600000

ASKBOARD_DATA_DIR

Directory for sessions.json.

~/.askboard-mcp

Development

npm install
npm run build
npm test
npm run dev

npm test builds the TypeScript project, starts the stdio MCP server in an isolated temporary data directory, simulates a browser submission over HTTP, and verifies ask_user, open_dashboard, and get_updates.

Release Automation

This repository includes:

  • .github/workflows/ci.yml: build and test on Node.js 20 and 22.

  • .github/workflows/publish.yml: validate and publish to npm with provenance on GitHub Release or manual dispatch.

For the first publish, the package name must be owned on npm. Because a package does not have npm package settings until it exists, use one of these paths:

  • Run the Publish workflow with a GitHub Actions secret named NPM_TOKEN that contains an npm automation token.

  • Or publish once from an authenticated local machine with npm publish --access public, then configure trusted publishing for later releases.

After the package exists, preferred npm setup is trusted publishing:

  1. Publish the GitHub repository.

  2. In npm, open the askboard-mcp package settings.

  3. Add a trusted publisher for qinsehm1128/askboard-mcp.

  4. Set workflow file to .github/workflows/publish.yml.

  5. Set environment name to npm.

  6. Create a GitHub Release or run the Publish workflow manually.

If trusted publishing is not available for the account, keep using the NPM_TOKEN secret.

Storage and Privacy

Askboard stores history as local plaintext JSON. Do not collect secrets or sensitive production data unless the local machine and data directory are appropriate for that use.

Project Structure

src/
  index.ts          MCP server and tool registration
  webserver.ts      Local HTTP server, forms, dashboard, submission handlers
  storage.ts        JSON persistence and revision tracking
  browser.ts        Cross-platform browser opener
  types.ts          Shared data model
  lib/
    styles.ts       Shared CSS
    templates.ts    Form and dashboard HTML

Available Tools

3 tools
ask_userAsk the user via a web formA

Show the user an interactive web form (opens in their browser) to collect answers, instead of asking one question at a time in chat. Pass a list of questions; each can be single-choice, multi-choice, or free text, and can allow a custom write-in. The call blocks until the user submits, then returns their structured answers. Use this whenever you have a task list, a review checklist, or several questions for the user to decide on at once.

ParametersJSON Schema
NameRequiredDescriptionDefault
introNoShort paragraph explaining the request
titleNoHeading shown at the top of the form
fieldsYesThe questions to ask

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses that the call blocks until the user submits, returns structured answers, opens in a browser, and supports various question types with an optional custom write-in. This provides comprehensive behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is four sentences long, front-loaded with the primary purpose, and every sentence adds meaningful information. There is no redundancy or fluff, and it is well-structured with the usage tip at the end.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the schema fully documents parameters and the description covers when to use the tool, its blocking behavior, and return type, it is complete for this interactive form tool. No output schema is needed to understand what is returned.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all parameters are already documented. The description adds some context about form behavior and 'structured answers' but does not significantly deepen parameter-level meaning beyond what the schema provides. A baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool shows an interactive web form to collect answers, contrasting with asking in chat. It specifies the resource (form) and action (ask/collect), and differentiates from siblings (open_dashboard, get_updates) which are unrelated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit guidance is provided: 'Use this whenever you have a task list, a review checklist, or several questions for the user to decide on at once.' It also notes when not to use it ('instead of asking one question at a time in chat'), giving a clear alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_updatesRead only what changed (incremental)A

Incrementally read history. Pass the sinceRevision you last saw, and this returns only sessions changed after it (new submissions or dashboard edits), plus the current revision to pass next time. Call with sinceRevision=0 (or omit) to get everything the first time. Use this instead of re-reading the whole history so you only pull deltas — e.g. to pick up answers the user edited after the fact.

ParametersJSON Schema
NameRequiredDescriptionDefault
sinceRevisionNoHighest revision you've already processed. Omit or 0 to read all.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Even without annotations, the description explains the behavior in detail: it returns changed sessions and the current revision to pass next time, and it clarifies the meaning of sinceRevision=0/omitted. This fully discloses the incremental semantics and the stateless pagination mechanism, leaving no hidden surprises.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and every sentence contributes: it explains the method, the response, the initial call, and the use case. No filler or repetitive content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (one optional parameter, no output schema), the description fully covers the necessary context: how to call, what to expect, and why to use it. It leaves no significant gaps for the agent to guess about.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already describes the 'sinceRevision' parameter completely (100% coverage). The description adds value by explaining the pattern of passing the last seen revision and the response format, which goes beyond the schema's basic definition. This is a solid enhancement without being redundant.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: incrementally read history, returning only sessions changed after a given revision. It uses a specific verb-resource combination and distinguishes itself from the sibling tools (ask_user, open_dashboard) by its focus on delta reads.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use guidance: 'Use this instead of re-reading the whole history so you only pull deltas — e.g. to pick up answers the user edited after the fact.' This clearly indicates the intended use case and the advantage over full-history reads.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

open_dashboardOpen the history dashboardA

Open the local dashboard in the user's browser, where they can review every form that was shown before, what they submitted, and which choices they made.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden of behavioral disclosure. It states the tool opens a local dashboard and explains the content users can review, but it does not mention side effects, whether it blocks, or any limitations. The description is clear but lacks deeper behavioral context such as browser launch behavior or potential delays.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence that directly states the action and the value to the user. Every word earns its place with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with no parameters and no output schema, the description sufficiently covers what the tool does and what the user gains. However, it lacks any mention of when to use it relative to siblings, which slightly reduces completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, and the schema is empty. The description adds no parameter information, but none is needed. This aligns with the baseline for 0-parameter tools.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's action ('Open the local dashboard in the user's browser') and the specific resource (dashboard of form history), which distinguishes it from sibling tools like ask_user and get_updates.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives, nor does it mention any prerequisites or contexts. It only describes what the tool does, leaving the agent to infer usage without explicit cues.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

TDQS

A4.4/5.0
Disambiguation5/5

Each tool has a clearly distinct purpose: ask_user collects answers via forms, open_dashboard presents a visual history, and get_updates provides programmatic incremental access to changes. No overlap or ambiguity exists between them.

Naming Consistency5/5

All three tools follow a consistent verb_noun pattern with lowercase and underscores: ask_user, open_dashboard, get_updates. The naming is uniform and predictable.

Tool Count5/5

Three tools is well-scoped for the server's purpose: asking questions, reviewing via dashboard, and syncing updates. Each earns its place without unnecessary bloat or missing essentials.

Completeness5/5

The tool set covers the full lifecycle of an askboard session: collecting responses via forms, reviewing all past submissions in the dashboard, and tracking edits through incremental updates. There are no obvious dead ends or missing core operations.

Maintenance

ActivityStale
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/qinsehm1128/askboard-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server