ws-mcp
Provides git status checks on workspaces, including branch, dirty/clean, ahead/behind remote, and counts of modified, untracked, and staged files.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ws-mcpshow me my abandoned projects"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
ws-mcp
An MCP server that gives LLMs full visibility into your ws-cli workspace tree.
Ask your AI assistant things like:
"What projects have I abandoned? Summarize where I left off on each one."
"Which workspaces have uncommitted git changes?"
"What tasks are open across all my ws/ projects?"*
"Find everything I was working on related to authentication."
The server traverses your workspace tree, reads metadata, checks git status, parses saved browser tabs, reads beads task databases, and exposes it all through MCP tools — no state of its own.
Prerequisites
Node.js >= 18
ws-cli installed and configured (provides the workspace tree that this server reads)
Related MCP server: repo-memory-mcp
Installation
git clone https://github.com/camggould/ws-mcp.git
cd ws-mcp
npm installRegistering with an MCP Client
Claude Code (per-project)
Add a .mcp.json file to any project directory:
{
"mcpServers": {
"ws-mcp": {
"command": "node",
"args": ["/absolute/path/to/ws-mcp/src/server.js"]
}
}
}Claude Code (global)
claude mcp add --global ws-mcp node /absolute/path/to/ws-mcp/src/server.jsClaude Desktop
Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"ws-mcp": {
"command": "node",
"args": ["/absolute/path/to/ws-mcp/src/server.js"]
}
}
}Any MCP-compatible client
ws-mcp uses stdio transport — pipe stdin/stdout to node src/server.js.
Tools
list_workspaces
List all workspaces with metadata. Filter by status, staleness, or tags.
Parameter | Type | Description |
|
| Filter by status: |
|
| Only show workspaces not opened in this many days |
|
| Comma-separated tags to filter by (matches any) |
list_workspaces({})
list_workspaces({ status: "active" })
list_workspaces({ stale_days: 30, tags: "coding,research" })Returns: Array of { name, status, last_opened, created, tags, path }.
get_workspace
Deep-dive into a single workspace. Returns everything the server knows.
Parameter | Type | Description |
|
| Workspace name (e.g. |
get_workspace({ name: "ws/cli" })Returns:
meta — status, tags, created/last opened dates
git — branch, dirty/clean, ahead/behind remote, modified/untracked/staged file counts
tabs — saved browser tabs from last session (count + URLs)
tab_history — session count, first/last session timestamps, unique URL count across all sessions
beads — task tracker summary:
total_issues,by_statuscounts,open_by_prioritycounts (ornullif no beads database)days_since_opened / stale — staleness indicator (stale = 30+ days)
notes — full
workspace.mdcontent
get_workspace_tree
Full parent-child hierarchy as a nested JSON tree. No parameters.
get_workspace_tree({})Returns: Nested tree with { name, children[], meta?, path? } at each node.
find_stale_workspaces
Identify workspaces you may have forgotten about, sorted by most stale first.
Parameter | Type | Default | Description |
|
|
| Days without activity to consider stale |
find_stale_workspaces({ days: 7 })Returns: Array of { name, status, last_opened, days_since, tags }.
search_workspaces
Full-text search across workspace names, tags, workspace.md notes, and saved tab URLs.
Parameter | Type | Description |
|
| Search query (case-insensitive substring match) |
search_workspaces({ query: "authentication" })Returns: Array of { workspace, status, matches[] } where each match includes the field name and matching value/context.
summarize_all
High-level dashboard across all workspaces. No parameters.
summarize_all({})Returns:
total_workspaces — count
by_status — breakdown (
{ active: 3, paused: 1, ... })recently_active — workspaces opened in the last 7 days
stale_30_plus_days — workspaces untouched for 30+ days
list_beads
List individual tasks from a workspace's beads issue tracker. Supports filtering and returns tasks sorted by priority then creation date.
Parameter | Type | Default | Description |
|
| required | Workspace name (e.g. |
|
| Filter: | |
|
| Filter: | |
|
| Filter: | |
|
| Filter by label (exact match) | |
|
|
| Max issues to return (1–200) |
list_beads({ workspace: "betterlife" })
list_beads({ workspace: "betterlife", status: "open", priority: 1 })Returns: { workspace, count, issues[] } where each issue includes id, title, description, status, priority, priority_label, type, assignee, labels[], created_at, updated_at.
get_beads_across_workspaces
Aggregate task counts across multiple workspaces. Scope to a parent prefix or query everything.
Parameter | Type | Description |
|
| Only include workspaces under this prefix (e.g. |
|
| Only show workspaces that have at least one issue with this status |
get_beads_across_workspaces({})
get_beads_across_workspaces({ parent: "ws" })
get_beads_across_workspaces({ status: "open" })Returns:
aggregate —
total_open,workspaces_with_beads,by_statuscounts,open_by_prioritycountsworkspaces[] — per-workspace breakdown with
by_status,open_by_priority,open_total(sorted by most open issues first)
How It Works
┌──────────────┐ stdio ┌──────────┐ reads ┌──────────────────┐
│ MCP Client │ ◄────────────► │ ws-mcp │ ──────────────► │ ~/Workspaces/ │
│ (Claude, │ JSON-RPC │ server │ │ .workspace.yaml │
│ Cursor, │ │ │ │ tabs.json │
│ etc.) │ │ │ │ tabs-history.jsonl│
└──────────────┘ └──────────┘ │ workspace.md │
│ │ .beads/beads.db │
│ .git/ │
▼ └──────────────────┘
~/.config/ws/
config.jsonReads
~/.config/ws/config.jsonto find the workspaces root (defaults to~/Workspaces)Recursively walks the directory tree, following symlinks, looking for
.workspace.yamlmarker filesParses workspace metadata (YAML), saved tabs (
tabs.json), tab history (tabs-history.jsonl), and notes (workspace.md)Reads beads SQLite databases (
.beads/beads.db) in read-only mode for task counts and issue listingsRuns
git statuson workspaces that are git repos (via simple-git)Exposes everything through MCP tools over stdio transport
The server is stateless — it reads directly from the filesystem that ws-cli manages. No database, no cache, no background processes.
Development
# Run with auto-reload on file changes
npm run dev
# Run directly
npm startDependencies
Package | Purpose |
MCP server framework | |
Read-only access to beads task databases | |
Git status checks | |
Workspace metadata parsing | |
File pattern matching | |
Tool parameter validation |
Related
ws-cli — the CLI tool that creates and manages the workspace tree this server reads
License
MIT
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
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/camggould/ws-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server