FeatureBoard MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| FEATUREBOARD_DATA_DIR | No | Path to the folder containing project boards. If not set, the user will be prompted on first run. |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| prompts | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_projectsA | List all boards (projects) under the configured boards folder. |
| get_boardA | Return the FeatureBoard board UI as a self-contained HTML document, ready to render as a Cowork artifact. This is THE way to satisfy any natural-language request to see the board — "open/show the board", "show the featureboard", "what's on my plate", "how are we looking", "give me a status", "show velocity/analytics". Do NOT hand-write your own board: take the returned |
| create_projectA | Create a new board folder with empty featurelist.md and buglist.md. Returns the derived ticket prefix. |
| list_tasksA | List features and/or bugs on a board, most-recent first. Filter by type, status, product, label, or search. Returns a compact one-line-per-ticket view by default and is paginated (limit/offset) so large boards don't blow the context budget — set compact:false for full details, and raise limit or page with offset to see more. Use get_metrics for a pure overview. |
| get_taskA | Get the full details of a single task by its ticket ID (e.g. FBF-12). |
| add_featureB | Add a feature to a board's featurelist.md. Returns the new ticket (FBF-###). |
| log_bugA | Log a bug to a board's buglist.md. Returns the new ticket (FBB-###). |
| add_features_bulkA | Add several features at once. Use this after brainstorming: you generate the ideas, this persists them. Returns the created tickets. |
| import_tasksA | Import a backlog from raw text into a board. Accepts a markdown checklist (- [ ] Title: desc), CSV (with a header row: title, description, product, priority, type, due, labels, status), or a JSON array/object ({features:[…], bugs:[…]} or a flat array). Format is auto-detected. Set dryRun to preview the parsed tasks without writing them. |
| plan_workA | Turn a user request into board items in one step. Optionally creates the project, then adds the features and bugs you list. Use this as the FIRST step when starting a substantive request, then work the tickets one at a time. Returns all created tickets. |
| next_taskA | Return the next open ticket to work (status Todo or In Progress), so you can pull work one item at a time. Prefers In Progress, then earliest due date, then oldest ticket. Returns null when the board is clear. |
| update_taskA | Update fields on an existing task. Only provided fields change. |
| set_statusA | Move a task between Todo / In Progress / Done. When moving to Done you can also record structured completion metadata (model, tokens, additions, deletions) — these are written to the work log and roll up into velocity/metrics. |
| decompose_featureA | Replace one feature with a set of linked subtasks. You provide the subtasks; this creates them (each linked to the parent) and deletes the parent. Returns the new tickets. |
| link_tasksA | Set the linked issue on a task (e.g. link a bug to the feature it affects). |
| add_attachmentB | Attach a file path or URL to a ticket (stored as [Attachments: ...] on the ticket line). Idempotent: attaching the same item twice is a no-op. |
| remove_attachmentB | Detach a previously attached file path or URL from a ticket. |
| delete_taskB | Permanently remove a task from its board. |
| scan_board_cleanupA | Read-only deep-clean scan: finds likely-duplicate tickets (grouped by title similarity, each group nominating a keeper + removal candidates) and stale/placeholder tickets (old Todo items, placeholder titles). Returns a suggested removal set to feed prune_board. Never deletes. |
| scan_test_cleanupA | Read-only deep-clean of the project's test/ dir: finds byte-identical duplicate test files, stale files whose filename ticket id is no longer on the board, and empty stub files (only TODO placeholder assertions). Returns a suggested removal set. Never deletes — companion to scan_board_cleanup. |
| prune_boardA | Guarded cleanup: deletes ONLY the ticket ids you pass, and only when confirm is true (otherwise returns a dry-run preview of what would be deleted). Non-existent ids are reported, not fatal. Pair with scan_board_cleanup's suggestedRemovals. |
| list_code_filesA | List files and folders under the project's codeLocation (optionally a subpath), with sizes and extensions. Skips vendor/build dirs (node_modules, .git, dist, …). depth controls how many levels to expand. Sandboxed to codeLocation. |
| read_code_fileA | Read a file under the project's codeLocation as UTF-8 text (size-capped; binary files are flagged, not dumped). Returns content + line count. Sandboxed to codeLocation (no path escape). |
| code_file_mapA | Recursively map the project's codeLocation: total file count + bytes, counts by extension, and the files that exceed the split thresholds (lines/bytes) as split candidates (worst first) — useful for spotting oversized modules to decompose. |
| get_metricsA | Read-only snapshot: feature/bug counts by status, completions by date, and velocity from the work log (tokens, additions/deletions, active days, recent tokens). |
| predict_due_datesA | Estimate when open work will complete by dividing the backlog by the board's observed throughput (tickets closed per active day). Walks the priority-ordered queue to give each open ticket a projected completion date, suggests a due date for tickets that don't have one, and flags tickets whose existing due date is likely to slip. Read-only — apply a suggestion with update_task if you want it stuck. |
| get_project_configA | Read a board's settings: products, code location, agent model, prefixes, website, description. Merges MCP-managed config over the legacy project_config.json. |
| set_project_configA | Update a board's settings (only provided fields change). Writes to the MCP-managed config; never mutates legacy project_config.json. |
| set_brandingA | Set the project's brand kit in one place — name, tagline, brand words, voice/tone, primary & accent colors, logo, and font — so every generated asset (media, website, campaigns) stays consistent. Stored on the board config; retrieve it with get_branding. By default also applies colors/font to the project website if one exists. |
| get_brandingA | Return the project's brand kit — name, tagline, words, voice, colors, logo, font — plus a ready-to-inject generation instruction, a CSS :root cssVars snippet for web, and which fields are still missing. Call this before generating any branded asset to stay consistent. |
| add_productA | Add a product to a board's product list (used for tagging tickets via [Product: …]). |
| remove_productA | Remove a product from a board's product list (existing ticket tags are left as-is). |
| get_scratchpadA | Read a board's freeform scratchpad.md - a per-project notes surface for context, decisions, and reminders that Claude and the board share. Returns the raw markdown. |
| set_scratchpadA | Overwrite a board's scratchpad.md with new content. Use append_scratchpad to add a note without replacing existing content. |
| append_scratchpadA | Append a line or block to a board's scratchpad.md, preserving existing notes. Mention a ticket id (e.g. FBF-12) to have it surface in that ticket's work packet. |
| drift_startA | Begin a drift-evaluation run over a board's Done tickets. mode 'sample' evaluates a seeded random subset (fast statistical estimate); mode 'full' evaluates every Done ticket. Returns a runId + the tickets to score. Then, for each ticket, compare its scope/description/DoD + work log against the actual code it touched (use get_work_packet and the project's codeLocation) and call drift_record with a 0–100 fidelity score; finish with drift_report. Use the evaluate_drift prompt to run the whole loop. |
| drift_recordA | Record a 0–100 fidelity score for one ticket in a drift run (verdict is derived: >=80 aligned, 50–79 partial, <50 drift — or pass your own). Provide a short gap explaining any shortfall, and optionally the files you checked. Upserts by ticket. |
| drift_reportA | Aggregate a drift run: per-ticket scores, mean fidelity, verdict counts, drift rate, and — for sampling — a 95% Wilson confidence interval on the true drift fraction extrapolated to the whole Done population. Lists the flagged (partial/drift) tickets worst-first with their gaps, and any pending (unscored) tickets. |
| drift_remediateA | One-click remediation across a run's flagged tickets: action 'file_bugs' files a linked, drift-labeled bug per gap; 'reopen' moves them back to Todo; 'relabel' adds a 'drift' label. verdicts selects the bands to act on (default ['drift']). Pass dryRun:true to preview. Records what it did on the run. |
| log_workB | Append a work event to the board's work log: a summary plus optional tokens, additions/deletions, and model, tied to a ticket. Feeds velocity and health. |
| get_work_logB | Read work-log entries, most-recent first. Optionally filter to one ticket. Returns entries plus a velocity rollup. |
| get_agent_monitorA | Snapshot of the board's currently-running work: every In Progress ticket with its latest work-log activity, cumulative additions/deletions/tokens, idle time since last activity, and a stalled flag (In Progress but no recent progress). Sorted most-recently-active first. Use it to see what's underway and catch stuck tickets. |
| get_healthA | Composite 0-100 health score with grade and breakdown: bug pressure, feature progress, momentum (recent tokens), and freshness (staleness of open work). |
| get_work_packetA | Assemble a focused brief for one ticket before you work it: scope, linked-issue details, code location + custom project prompt, scratchpad mentions, the ticket's recent work log, files to read, and a definition of done. Read the files it points to rather than dumping them. |
| suggest_test_stubA | Generate a boilerplate test file (path + node:test content) for a ticket, derived from its title/description and the board's code location. Agent-native 'fixtest': call it when creating or starting a ticket, then write the returned file. Read-only — it returns the stub, it does not create the file. |
| generate_testA | Generate a FULL node:test file (path + content) from a prompt and/or a ticket — one test() block per described behaviour, not just the single boilerplate stub. Optionally imports a target module. Read-only: returns the file for you to write under test/. |
| bug_impact_scanA | Given a bug (by ticket, or an ad-hoc title/description), rank the existing features most likely affected, by keyword overlap and shared product. Use it when logging a bug to spot regressions and linkage candidates. |
| log_test_runA | Record a test run's result (passed/failed/skipped, optional suite + ticket + summary) to the board's test_runs.md. You run the tests (e.g. via the shell); this stores the report so the board can surface pass/fail over time. |
| get_test_runsA | Read recorded test runs (most-recent first) plus a summary: total runs, latest result, and whether the latest is passing. |
| save_test_pageB | Create/overwrite a standalone HTML test/QA page under the project's test-pages/ folder. |
| list_test_pagesB | List the standalone HTML test pages under test-pages/. |
| get_test_pageB | Read one test page's HTML by name. |
| remove_test_pageC | Delete a test page by name. |
| test_runs_by_suiteA | Organize recorded test runs (from log_test_run) by suite: each suite's latest result, run count, cumulative pass/fail, and pass-rate, plus the list of currently-failing suites. Surfaces coverage/health per suite instead of a flat list. |
| coverage_by_productB | Roll up, per product, how many of its tickets have at least one recorded test run vs none, so testing gaps are visible on the board. Includes an overall rollup and the untested tickets per product. |
| get_regressionsA | Regression view: bugs grouped under the feature they're linked to (sorted by open-bug count), plus unlinked bugs. Surfaces which shipped features are at risk. Link bugs to features (link_tasks) to populate it. |
| list_mediaA | List a project's media gallery: images and shareable HTML reports in its media/ folder. Each asset carries enough to render a visual grid — kind, mimeType, sizeBytes + sizeLabel + sizeBucket, image dimensions (width/height, parsed from file headers), a preview reference (inline text snippet for reports, a get_media src for images), plus sidecar metadata (title, tags, brandWords, linked ticket). Read-only; returns an empty gallery if the project has no media/ folder yet. Optionally filter by kind. |
| save_mediaA | Save a generated asset into a project's media/ folder — a shareable HTML report (or SVG) as UTF-8 text, or an image as base64 (encoding:'base64'). You generate the content; this persists the bytes plus a .meta.json sidecar (title, prompt, tags, linked ticket, generatedAt) that list_media reads back. Name must be a plain filename with an extension, e.g. q3-report.html. |
| list_variationsA | List the gallery assets that share a variation group id (alternatives generated from one prompt), for side-by-side review. |
| get_mediaA | View one media asset: its metadata, size, and (by default) content — UTF-8 for text/report assets, base64 for images — plus its revision history (prior versions with the prompts used). Pass a version id to view an archived revision instead of the current one; set withContent:false for metadata + history only. |
| revert_mediaA | Restore a prior version of an asset as the current one. The current copy is archived first, so the revert is itself undoable. Use get_media to find the version id. |
| tag_mediaA | Add and/or remove custom tags on a media asset (updates the sidecar only — the asset bytes and version history are untouched). Tags are de-duplicated. Returns the asset's new tag list. |
| annotate_mediaA | Add a pin-based comment/annotation to an asset. Optional x/y locate the pin (e.g. 0-1 relative coordinates on an image or report). Returns the new annotation (with a stable id) and the total count. |
| remove_annotationA | Remove an annotation from an asset by its id (from get_media). Returns the remaining count. |
| add_media_commentA | Add a threaded comment to a gallery asset (a discussion thread, distinct from pin annotations). Pass parentId (a comment id from get_media / list_media_comments) to reply to an existing comment. Returns the new comment and total count. |
| list_media_commentsB | List an asset's comments, both as a flat array and as a threaded tree (root comments with nested replies). |
| remove_media_commentA | Remove a comment by id (from get_media / list_media_comments). By default its reply subtree is removed too; set cascade:false to refuse when it still has replies. Returns the ids removed. |
| search_mediaA | Search/filter a project's media gallery by kind, by exact tag, and/or a free-text query matched across asset name, title, tags, and the generation prompt. Returns matching assets with metadata. |
| upload_referenceA | Save a reference/source image under media/uploads/ (base64) to use as input for media generation — kept separate from the gallery. Reference it in a generate/refine prompt so Claude or an image model can work from it. |
| list_referencesB | List the reference/source images under media/uploads/ (inputs for generation). |
| edit_mediaA | Directly edit an existing text/report asset (find/replace, append, or prepend) and save the result as a new version — the prior copy is archived (edit-media). For images, use refine_media or image generation instead. |
| draft_shareA | Save a reviewable social-share draft for a gallery item — you write the copy, this persists it (never posts). Platform 'x' (≤280 chars) or 'linkedin' (longer); over-limit copy is rejected. There is no live-publish connector: drafts are for the user to review and post. Use list_shares to review. |
| list_sharesA | List saved share drafts (newest-first), optionally filtered by asset and/or platform. |
| remove_shareA | Delete a share draft by its id (from list_shares). |
| add_companyA | Create a company in the project's CRM (crm/companies/.json). Slug is derived from the name and de-duplicated. Returns the new company record. |
| list_companiesA | List the project's CRM companies (id, name, domain, contact count, products), alphabetical by name. Pass product to show only companies associated with that product. |
| set_company_productsA | Record which products a company uses/owns (replaces the list; de-duplicated). Surfaced on the company record and usable via list_companies(product=...). |
| get_companyA | Full company record including its contacts. Throws if the company id isn't found. |
| add_contactB | Add a contact (name, email, role, phone) to a company. Contact ids are unique within the company. |
| update_contactA | Edit a contact on a company (only provided fields change). Pass an empty string to clear email/role/phone. |
| remove_contactA | Remove a contact from a company by its contact id (e.g. c1). |
| add_crm_messageA | Add an incoming message to the CRM inbox (starts pending review). Useful for logging inbound emails/leads that need triage and approval. |
| submit_crm_intakeA | Capture an inbound support or contact submission (support-info / crm-submit) into the CRM inbox, pending review. Records the requester (name/email), a category (support/sales/contact/feedback/other), an optional related company, and the message; synthesizes a subject if none is given. |
| list_crm_inboxA | List CRM inbox messages (newest-first), optionally filtered by status (pending/approved/rejected), company, and/or type (support/sales/contact/feedback/other). |
| review_crm_messageB | Approve or reject a pending CRM inbox message by id. Records the decision and timestamp. |
| add_leadA | Add a sales lead to the project's leads store (crm/leads.json). Status defaults to 'new' (pipeline: new → contacted → qualified → won/lost). Optional value and lat/lng power the pipeline value and the leads map. |
| list_leadsA | List leads (newest-first), optionally filtered by pipeline status and/or company. |
| set_lead_statusB | Move a lead along the pipeline (new/contacted/qualified/won/lost). Records the update time. |
| enrich_leadA | Record website-sourced details on a lead (only provided fields are set): website, domain, phone, industry, description, contactName, employees, email, city, source, value. Use the pull_lead_website prompt to fetch + extract these from the lead's site first, then persist them here. |
| convert_leadA | Convert a qualified lead into a CRM company, carrying over its fields (name, website→domain, a notes summary) and optionally seeding a contact from the lead's person/email/phone. Marks the lead won and records the company it became. Errors if already converted. |
| leads_mapB | Geographic + pipeline rollup for the leads map: mappable points (leads with lat/lng), counts by status and by city, geocoded/ungeocoded tally, and total pipeline value. Rendering is left to the board or a generated report. |
| add_lead_areaA | Define a circular geographic area (name + centre lat/lng + radius km) for the leads map. leads_map then tags each mapped lead with the areas it falls in and rolls up lead counts + pipeline value per area. |
| list_lead_areasA | List the defined geographic lead areas (id, name, centre, radius). |
| add_lead_interactionA | Append a touchpoint to a lead's interaction log: kind (call/email/meeting/note/visit/other) + a note, timestamped. Builds the per-lead history. |
| update_lead_locationA | Set a lead's coordinates (lat/lng) and/or city, so it maps correctly and falls into the right areas. |
| customer_portalA | Build a per-customer portal page for a CRM company: their contacts plus the board tickets linked to them (link tickets with link_customer_ticket). Returns self-contained HTML; with save:true it also writes the page into the media gallery as portal-.html and returns its path. |
| list_contract_templatesA | List the standard contract templates (NDA, MSA, SOW, commercial license) with their required fields. |
| generate_contractB | Fill a standard contract template with the given fields and return the draft markdown. Optionally auto-fills customer_name from a CRM company, and with save:true writes the draft into the media gallery. Drafts are stamped to review with counsel — not legal advice. |
| link_customer_ticketA | Link a board ticket (feature/bug) to a CRM company, stored on the company so it shows in its customer_portal. De-duplicated. |
| unlink_customer_ticketC | Remove a ticket link from a CRM company. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| evaluate_drift | Run a full agentic-drift evaluation: sample (or fully check) Done tickets, score how faithfully each was implemented vs its intent, report an aggregate drift rate with confidence, and offer one-click remediation. |
| pull_lead_website | Fetch a lead's website, extract company details, and save them onto the lead via enrich_lead. |
| project_from_chat | Analyze the current conversation and create a FeatureBoard project from it — a project name plus features (new work) and bugs (issues raised). |
| process_next | Pull the top ticket off the board's priority queue and work it end-to-end with the FeatureBoard work-packet loop. |
| generate_media | Generate a shareable web report (or image) for a goal and save it into the project's media/ gallery via save_media. |
| generate_image | Produce an actual raster image (via an image-generation tool/connector, if one is available) and save it to the project's media/ gallery as base64 — falling back to a self-contained SVG when no image generator is connected. |
| generate_variations | Produce several alternative versions of an asset from one prompt/goal, saved as a group for side-by-side review. |
| refine_media | Iterate on an existing gallery asset with a follow-up instruction, saving the result as a new version (its history is preserved). |
| share_media | Draft suggested X and LinkedIn copy for a gallery item and save them as reviewable drafts (does not post). |
| generate_site | From a single description, generate a complete site (title, tagline, theme, home sections, and initial sub-pages) and scaffold it in one shot with scaffold_site, instead of building it field-by-field. |
| tweak_site | Apply a plain-English change to the project's website (e.g. 'make the tagline punchier', 'add a pricing section', 'switch to dark mode') and re-render. |
| run_tests | Run the project's test suite(s), record each result with log_test_run, then show the consolidated per-suite view. |
| brand | Establish the project's brand kit once, then apply it consistently across media, website, and campaigns. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/valentil/featureboard-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server